var _xws={
	onpagechanged:new Function("return false"),
	onpageload:new Function(),
	onerror:new Function(),
	errors:new Array(Array(),Array(),Array(),Array()),
	r_state:0,
	states:new Array('uninitialized','loading','loaded','interactive','complete'),
	state:"uninitialized",
	cDiv:Object,
	addedScripts:new Array(),
	addedCSS:new Array(),
	loadedModules:new Array(),
	currentModule:"",
	tName:"_xws",
	classes:new Array(),
	R_ERR_INVALID_LOGIN:0x02,R_ERR_INVALID_PARAMS:0x03,R_ERR_INVALID_RESPONSE:0x04,R_ERR_INVALID_SVERR:0x05,R_ERR_MISC:0x06,
	E_ALL:0,E_ERROR:1,E_WARN:2,E_MESSAGE:3,
	_init:function(content_div,p_ChangedCallback,pLoadCallback,eCallback)
	{
		_xws.onpagechanged=p_ChangedCallback;
		_xws.onpageload=pLoadCallback;
		_xws.onerror=eCallback;
		//alert(p_ChangedCallback);
		//this.onpageload=pLoadCallback;
		//this.onerror=eCallback;
		this.cDiv=content_div;
		//alert(this.cDiv);
		xgui.SCR_WIDTH=document.body.scrollWidth;
		xgui.SCR_HEIGHT=document.body.scrollHeight;
	},
	getClassById:function(id)
	{
		//alert("Searching for classID: " + id);
		for(var i=0;i<_xws.classes.length;i++)
		{
			if(_xws.classes[i].clsid==id)
			{
				return _xws.classes[i];
			}
		}
		return false;
	},
	getAccountOverview:function(mailStatusDiv,calStatusDiv,todoStatusDiv,feedStatusDiv)
	{
		_xws.request("mail/accountStatus.php",function(js)
		{
			//xgui.hideLoading();
			/*mailStatusDiv.innerHTML=js.mailStatus.tNew;
			calStatusDiv.innerHTML=js.calStatus.today;
			todoStatusDiv.innerHTML=js.todoStatus.today;
			feedStatusDiv.innerHTML=js.feedStatus.tNew;*/
			mailStatusDiv.appendChild(document.createTextNode(js.mailStatus.tNew));
			
		},function(){
			_xws.displayErrors();
		},function(rstate)
		{
			_xws.onpageload(rstate);
		});
	},
	httpReg:function()
	{
		try{
			var obj=new XMLHttpRequest();
		}catch(e){
			var obj=new ActiveXObject('Microsoft.XMLHTTP');
		}
		if(!obj)
		{
			var obj=null;
			_xws.addError(0,'No XML HTTP REQUEST OBJECT FOUND');
			return false;
		}
		return obj;
	},
	loadModule:function(mName,doOnload)
	{
		//_xws.onpageload();
		broadcast_sig(_xws,'MODULE_LOADING',mName);
		document.location.hash="#mod=" + mName;
		if(!doOnload)doOnload=true;
		var tobj=$("#cMain");
		for(var i=0;i<tobj.childNodes.length;i++)
		{
			tobj.removeChild(tobj.childNodes[i]);
		}
		_xws.onpagechanged(mName);
		_xws.addError(this.E_MESSAGE,"Loading Module " + mName + "<br/>");
		if(!this.isModuleLoaded(mName))
		{
			this.request('_m_/' + mName + '.tpl',function(jsData)
			{
				//alert(jsData);
				//_xws.loadedModules.push(mName);
				_xws.currentModule=mName;
				var xArray=new Array();
				xArray['name']=mName;
				xArray['script']=jsData;
				_xws.loadedModules.push(xArray);
				xgui.formatPage(_xws.cDiv,jsData);
				broadcast_sig(_xws,'MODULE_LOADED',mName);
				//xgui.formatPage(_xws.cDiv,http.responseText);
				//_xws.onpageload()
			},
			function()
			{
				var err=_xws.getErrors(_xws.E_ALL);
				//alert("ERR: " + err);
				var s="ERRORS:";
				for(var i=0;i<err.length;i++)
				{
					//s+="LVL:" + i + ": " + err[i] + "<br/>";
					if(err[i])
					{
						if(i==_xws.E_MESSAGE)
						{
							s+= "SESSION LOG: <a href=\"#\" onclick=\"_xws.reset_errors(this,_xws.E_MESSAGE)\">Clear</a><br/>" + err[i] + "<br/>";
						}else{
							s+=err[i]+"<br/>";
						}
					}
					
				}
				var HWND=xgui.createDialog(s,Array(300,100),xgui.SCR_CENTER,Array(Array(xgui.BTN_OK,function()
				{
					document.body.removeChild($("#" + HWND));
				}),Array(xgui.BTN_CANCEL,function()
				{
					document.body.removeChild($('#' + HWND));
				})),xgui.WM_CLOSE,xgui.DLG_ERROR,'ERROR');
				_xws.onerror();
				_xws.errors[_xws.E_ERROR]=new Array();
			},function(rstate){_xws.onpageload(rstate)});
		}else{
			var cMod=_xws.getModuleByName(mName);
			xgui.formatPage(_xws.cDiv,cMod['script'],doOnload);
		}		
	},
	_tempCB:function(){return},
	submitForm:function(frm,cb)
	{
		var qStr="?";
		var encType=frm.enctype;
		var dest=frm.action;
		if(!cb)cb=function(){return};
		var method=frm.method;
		_xws._tempCB=cb;
		var spnStatus=document.createElement('span');
				spnStatus.style.color="#ff0000";
				spnStatus.id="TMP_FRM_STATUS";
				spnStatus.innerHTML="Please Wait.....";
				frm.parentNode.appendChild(spnStatus);
		if(encType=="multipart/form-data")
		{
			/*var idv=document.createElement('iframe');
			
			
			idv.src="blank.html";
			idv.style.display="none";
			idv.style.width="150px";
			idv.style.height="150px";
			idv.id="TMP_FRM_TRGT";
			idv.name="TMP_FRM_TRGT";
			frm.parentNode.appendChild(idv);*/
			frm.target="TMP_FRM_TRGT";
			//setTimeout("_xws.checkFormStatus('TMP_FRM_TRGT','TMP_FRM_STATUS')",200);
			frm.submit();
			
		}else{
		//alert("ET: " + encType + "\nDEST: " + dest + "\nmethod: " + method + "\nEL LENGTH: " + frm.elements.length);
		var appended=new Array();
		for(var i=0;i<frm.elements.length;i++)
		{
			
			if((undefined!==frm.elements[i].name)&&(frm.elements[i].name!=="")){
				if((frm.elements[i].getAttribute("XWS_SUBMIT_ACTION"))&&(frm.elements[i].getAttribute("XWS_SUBMIT_ACTION")=='append')&&(frm.elements[i].type=="checkbox"))
				{
					//alert("Found");
					if(frm.elements[i].checked)
					{
						appended.push(frm.elements[i].name + ":" + frm.elements[i].value);
					}
					
				}else{
					qStr+=frm.elements[i].name + "=" + (frm.elements[i].type=="checkbox"?frm.elements[i].checked:escape(frm.elements[i].value)) + "&";
				}
			}
		}
		
		if(appended.length>0)
		{
			//alert("Appended Found");
			var elmName=appended[0].split(":")[0];
			var temp="";
			for(var al=0;al<appended.length;al++)
			{
				temp+=appended[al].split(":")[1] + ",";
			}
			qStr+=elmName + "=" + temp.substr(0,temp.length - 1);
		}else{
			qStr+="resp=JSON";
		}
		//alert(qStr);
		//return false;
		_xws.request(dest+qStr,function(js)
		{
			$('#TMP_FRM_STATUS').parentNode.removeChild($('#TMP_FRM_STATUS'));
			cb(js);
		},function(){alert("ERROR")},
		function(rs){$('#TMP_FRM_STATUS').innerHTML+="."},false,0,false);
		}
		var frmElms=document.getElementsByTagName('input');
		for(var z=0;z<frmElms.length;z++)
		{
			if(frmElms[z].type!=="hidden")
			{
				//alert("Clearing: " + frmElms[z].type);
				frmElms[z].value="";
			}
		}
		for(var zz=0;zz<document.getElementsByTagName('textarea').length;zz++)
		{
			document.getElementsByTagName('textarea')[zz].innerHTML="";
			document.getElementsByTagName('textarea')[zz].value="";
		}
	},
	clearForm:function(frm)
	{
		for(var i=0;i<frm.elements.length;i++)
		{
			
			if(frm.elements[i].type=="checkbox")
			{
				frm.elements[i].checked=false;
			}else{
				frm.elements[i].value="";
			}
		}
	},
	
	formStatusListener:function()
	{
		//_xws._tempCB();
		//alert("Listener called");
		$('#TMP_FRM_STATUS').innerHTML="";
	},
	request:function(url,sCallback,fCallback,lCallback,plain,hwnd,showloading) /*url,sCallback,fCallback,lCallback*/
	{
		//_xws.onpageload();
		if(!plain)plain=false;
		if(showloading!==false) showloading=true;
		if(showloading)xgui.showLoading();
		var http=this.httpReg();
		var uTemp=url.split("?");
		if(hwnd)
		{
			var add="&HWND=" + hwnd;
		}else{
			var add="";
		}
		if(uTemp.length > 0){
			if(!plain)
			{
				params=uTemp[1] + "&view=json" + add;
			}else{
				params=uTemp[1] + add;
			}
		}else{
			if(!plain)
			{
				params="view=json" + add;
			}else{
				params="HWND=" + hwnd;
			}
		}
		http.open('POST',uTemp[0],true);
		broadcast_sig(_xws,"REQ_OPEN",uTemp[0]);
		http.onreadystatechange=function()
		{
			lCallback(http.readyState);
			if(http.readyState==4 && http.status==200)
			{
				//var xml=http.responseXML;
				broadcast_sig(_xws,"REQ_CLOSED",0);
				if(!plain)
				{
					//alert("USING JS");
				try{
					var json=eval('(' + http.responseText + ')');
					
				}catch(er){
					_xws.addError(_xws.E_ERROR,'Malformed JSON Code: <br/>&nbsp;&nbsp;<span style="color:#ff0000">' + er + "</span>");
					fCallback();
					broadcast_sig(_xws,"REQ_ERR","Malformed JSON Code: " + er);
				}
				/*if(!json)
				{
					_xws.addError(_xws.E_ERROR,'Malformed JSON Code');
					fCallback();
				}else{*/
					switch(json.status)
					{
						case 0:
							//alert("Sending 0");
							sCallback(json);
							broadcast_sig(_xws,"REQ_JSON_RESP_RECV",json);
						break;
						case 1:
							
							_xws.addError(_xws.E_ERROR,'Request failed for ' + url + ' <br/>Response: ' + json.response);
							fCallback();
							broadcast_sig(_xws,"REQ_ERR","Request failed for " + url + "<br/>Response: " + json.response);
						break;
						case _xws.R_ERR_INVALID_LOGIN:
							xgui.createOverlay();
							xgui.createDialog("<div id=\"loginBox\"><form name=\"imLogin_f\" id=\"imLogin_f\" action=\"login.php\" method=\"post\" onsubmit=\"return auth.checkLogin(this,$('#lStatus'),'main.php');\"><p>We're sorry, but your login has expired. Please login again below.</p><p><input type=\"text\" name=\"u\" size=\"10\" value=\"username...\" onfocus=\"this.value=''\"></p><p><input type=\"text\" name=\"p\" value=\"Password\" onblur=\"if(this.value==''){txtReplace(this,'text');this.value='Password...'}\" onfocus=\"txtReplace(this,'password');\" size=\"8\">	</p><div id=\"lStatus\"></div><p><button type=\"submit\" onclick=\"auth.checkLogin(this.form,$('#lStatus'),'main.php');\">Go</button></p>		</form></div>",Array(500,300),xgui.SCR_CENTER,null,null,xgui.DLG_INFO,"Login Timed Out");
							broadcast_sig(_xws,"REQ_INVALID_LOGIN","Login Timed Out");
							//create a secondary login box
						break;
						default:
							sCallback(json);
							broadcast_sig(_xws,"REQ_JSON_RESP_RECV",json);
						break;
					}
					}else{
						sCallback(http.responseText);
						broadcast_sig(_xws,"REQ_TEXT_RESP_RECV",http.responseText);
					}
			}else{
				if(http.readyState==4 && http.status!==200)
				{
					//xgui.hideLoading();
					_xws.addError(_xws.E_ERROR,'Request returned status: ' + http.status);
					broadcast_sig(_xws,'REQ_ERR',http.status);
					fCallback();
				}
				broadcast_sig(_xws,"REQ_STATE_CHANGED",http.readyState);
			}
			_xws.state=_xws.states[http.readyState];
		}
		http.setRequestHeader('content-type','application/x-www-form-urlencoded');
		broadcast_sig(_xws,"REQ_PARAMS_SENT",params);
		http.send(params)
	},
	/* ############################ APPLICATION HANDLING ###########################
		Spec:
			Apps must contain:
				__init__(self,pid);
				__destroy__(self);
			Apps must broadcast an app_loaded signal
	*/
	loadedApps:new Array(),
	apps:new Array(),
	nextArgs:null,
	execApplication:function(appName,args)
	{
		//alert("EXECING " + appName);
		var argList=appName.split(" ");
		appName=argList[0];
		argList.push(args);
		if(!_xws.appLoaded(appName))
		{
			
			_xws.addScript(Array('/mg/nt/libXTK/js/apps/' + appName + '.js'));
			_xws.nextArgs=argList;
			/*register_listener(function(sig_from,sig,args)
			{
				//apps.push(args);
				//alert("Args");
				//alert("EXECING " + appName);
				//alert(sig_from);
				var x= args;
				
				var z=new x();
				z.__init__(z);
				_xws.loadedApps.push(({'name':appName,'code':args}));
			},'*','APP_LOADED');*/
			register_listener(_xws.appListener,'*','APP_LOADED');
			
			
		}else{
			//alert("APP IS LOADED");
			broadcast_sig(this,'DEBUG_EXEC_FROM_CACHE',appName);
			
			var x=eval(_xws.appLoaded(appName)['code']);
			var pid=uniqid('PID:');
			var z=new x();
			z.__init__(z,pid,argList);
			_xws.apps.push(({'instance':z,'pid':pid}));
			broadcast_sig(_xws,'APPLICATION_LAUNCHED',pid);
		}
	},
	killApp:function(id)
	{
		_xws.getAppByID(id).destroy(_xws.getAppByID(id));
		broadcast_sig(this,'APPLICATION_DESTROYED',id);
	},
	clearApplication:function(id)
	{
		for(var i=0;i<_xws.apps.length;i++)
		{
			if(_xws.apps[i]['pid']==id)
			{
				delete(_xws.apps[i]['instance']);
				_xws.apps.splice(i,1);
			}
		}
	},
	getAppByID:function(id)
	{
		for(var i=0;i<_xws.apps.length;i++)
		{
			if(_xws.apps[i]['pid']==id)
			{
				return _xws.apps[i]['instance'];
			}
		}
		return false;
	},
	appGlobals:new Array(),
	register_global:function(appName,v,val)
	{
		_xws.appGlobals.push(({'appname':appName,'varname':v,'var':val}));
	},
	get_global:function(appName,v)
	{
		for(var i=0;i<_xws.appGlobals.length;i++)
		{
			if(_xws.appGlobals[i]['appname']==appName)
			{
				if(_xws.appGlobals[i]['varname']==v)
				{
					return _xws.appGlobals[i]['var'];
				}
			}
		}
		return false;
	},
	appListener:function(sig_from,sig,args)
	{
		
		var x=new args();
		var pid=uniqid('PID:');
		
		x.__init__(x,pid,_xws.nextArgs);
		_xws.nextArgs=null;
		_xws.apps.push(({'instance':x,'pid':pid}));
		_xws.loadedApps.push(({'name':sig_from,'code':args}));
		broadcast_sig(_xws,'APPLICATION_LAUNCHED',pid);
		remove_listener(_xws.appListener,'*','APP_LOADED');
	},
	appLoaded:function(appName)
	{
		for(var i=0;i<_xws.loadedApps.length;i++)
		{
			if(appName==_xws.loadedApps[i]['name'])
			{
				//alert("REturning");
				return _xws.loadedApps[i];
			}
		}
		return false;
	},
	addScript:function(param)
	{
		/*for(var i=0;i<param.length;i++)
		{
			for(z=0;z<this.addedScripts.length;z++)
			{
				if(param[i]==this.addedScripts[z])
				{
					return;
				}
			}
		}*/
		var head=document.getElementsByTagName('head')[0];
		if(typeof(param) == "array" || "Array")
		{
			for(var i=0;i<param.length;i++)
			{
				if(!this.isScriptAdded(param[i]))
				{
				xgui.objectLoading=true;
				var s=document.createElement('script');
				s.type='text/javascript';
				s.src=param[i];
				//head.appendChild(s);
				this.addedScripts.push(param[i]);
				//head.insertBefore(s,head.childNodes[2]);
				head.appendChild(s);
				broadcast_sig(_xws,"SCRIPT_ADDED",param[i]);
				}
			}
		}else{
			if(!this.isScriptAdded(param))
			{
			var s=document.createElement('script');
			s.type='text/javascript';
			s.src=param;
			this.addedScripts.push(param);
			head.appendChild(s);
			broadcast_sig(_xws,"SCRIPT_ADDED",param);
			}
		}
		//alert("Added " + param);
				
	},
	addCSS:function(param)
	{
		//alert("Adding css src: " + param);
		/*for(var i=0;i<param.length;i++)
		{
			for(z=0;z<_xws.addedCSS.length;z++)
			{
				if(param[i]==_xws.addedCSS[z])
				{
					return;
				}
			}
		}*/
		var head=document.getElementsByTagName('head')[0];
		if(typeof(param) == "array")
		{
			for(var i=0;i<param.length;i++)
			{
				if(!this.isCSSAdded(param[i]))
				{
				//alert("Adding css " + param[i]);
				var s=document.createElement('link');
				s.rel="stylesheet";
				s.href=param[i];
				s.type="text/css";
				this.addedCSS.push(param[i]);
				head.appendChild(s);
				broadcast_sig(_xws,"CSS_ADDED",param[i]);
				}
			}
		}else{
			if(!this.isCSSAdded(param))
			{
			//alert("Adding css " + param);
			var s=document.createElement('link');
			s.rel="stylesheet";
			s.href=param;
			s.type="text/css";
			this.addedCSS.push(param);
			//alert("ADDED: " + s.href);
			head.appendChild(s);
			broadcast_sig(_xws,"CSS_ADDED",param);
			}
		}
	},
	isModuleLoaded:function(param)
	{
		for(var i=0;i<this.loadedModules.length;i++)
		{
			if(this.loadedModules[i]['name']==param) return true;
		}
		return false;
		
	},
	getModuleByName:function(param)
	{
		for(var i=0;i<this.loadedModules.length;i++)
		{
			if(this.loadedModules[i]['name']==param) return this.loadedModules[i];
		}
		return false;
	},
	isCSSAdded:function(param)
	{
		for(var i=0;i<this.addedCSS.length;i++)
		{
			if(this.addedCSS[i]==param) return true;
		}
		return false;
	},
	isScriptAdded:function(param)
	{
		for(var i=0;i<this.addedScripts.length;i++)
		{
			if(this.addedScripts[i]==param) return true;
		}
		return false;
	},
	addError:function(level,txt)
	{
		//alert("Adding ERROR: L: " + level + " T: " + txt);
		this.errors[level].push(txt);
		//alert("Added: " + this.errors[level]);
	},
	getErrors:function(level)
	{
		//return this.errors[level];
		var e=new Array();
		if(level == _xws.E_ALL)
		{
			for(var i=0;i<_xws.errors.length;i++)
			{
				e.push(this.errors[i]);
			}
			return e;
		}else{
			return this.errors[level];
		}
	},
	reset_errors:function(sender,level)
	{
		sender.changeTo('span','<span style="color:#0000ff">Log Reset</span>','');
		_xws.errors[level]=new Array();
		broadcast_sig("_xws","ERROR_LOG_RESET",1);
	},
	displayErrors:function()
		{
			var err=_xws.getErrors(_xws.E_ALL);
			//alert("ERR: " + err);
			var s="ERRORS:";
			for(var i=0;i<err.length;i++)
			{
				//s+="LVL:" + i + ": " + err[i] + "<br/>";
				if(err[i])
				{
					if(i==_xws.E_MESSAGE)
					{
						s+= "SESSION LOG: <a href=\"#\" onclick=\"_xws.reset_errors(this,_xws.E_MESSAGE)\">Clear</a><br/>" + err[i] + "<br/>";
					}else{
					s+=err[i]+"<br/>";
					}
				}
				
			}
			var HWND=xgui.createDialog(s,Array(300,100),xgui.SCR_CENTER,Array(Array(xgui.BTN_OK,function()
			{
				document.body.removeChild($("#" + HWND));
			}),Array(xgui.BTN_CANCEL,function()
			{
				document.body.removeChild($('#' + HWND));
			})),xgui.WM_CLOSE,xgui.DLG_ERROR,'ERROR');
			_xws.errors[_xws.E_ERROR]=new Array();
		},
	delayexec:function(func)
	{
		try{
			eval(func);
		}catch(EE){
			setTimeout("_xws.delayexec('" + func + "')",100);
		}
	},
	clearContactSelections:function()
	{
		for(i=0;i<AC_Contacts.length;i++)
		{
			AC_Contacts[i]['selected']=false;
		}
	},
	getSelectedContacts:function()
	{
		var sArray=new Array();
		for(i=0;i<AC_Contacts.length;i++)
		{
			if(AC_Contacts[i]['selected']=true)
			{
				sArray.push(AC_Contacts[i]);
			}
		}
		if(sArray.length > 0)
		{
			return sArray;
		}else{
			return false;
		}
	}	
}
	
