/* COMS LIBRARY
 * ------------
 * Translates data from the server "AjaxLink.php"<--->mywebpage.php<--->"AjaxLink.js"
 * Allowing XML to share variable arrays between client(js) and server(php)
 * Allowing XML to replace and append, html on to any DOM element.
 * Makes AJAX easy :-D
 */
 $AjaxLink = new AJAXLINK();
 
function AJAXLINK()
{
	me = this;
	
	$linkVersion = "1.0";
	me.linkDebug = true;
	me.linkProxy = "";
	
	me.linkData = Array();
	
	$linkScriptElement = null;
	$linkDebugElement = null;
	
	function linkInit($parent){
		if($parent==null) $parent=document.body;
		$linkScriptElement = document.createElement("span");
		
		$linkDebugForm = document.createElement("div");
		$linkDebugForm.style.width="400px";
		$linkDebugForm.style.backgroundColor="#999999";
		$linkDebugForm.style.border="#000000 thin solid";
		$linkDebugForm.innerHTML = "<strong>The Link Debug<span style='position:absolute;color:#3333FF;left:377px;' onclick='javascript:linkHideDebug();'>[X]</span></strong><div id='linkdebug' style='height:200px;overflow:scroll;color:#FFFFFF;background-color:#000000;'></div>";
		$linkDebugForm.id="linkdebugform";
		$linkDebugForm.style.display="none";
		$linkDebugForm.style.left="500px";
		$linkDebugForm.style.top="50px";
		$linkDebugForm.style.position="absolute";
		$linkDebugForm.onmousedown = function(e){ begindrag(e); }
		$parent.appendChild($linkScriptElement);
		$parent.appendChild($linkDebugForm);
		
		linkParseXml($linkXml);
		$linkXml="";
		if(typeof(link_onload) != 'undefined') link_onload();
	}
	me.linkInit = linkInit;
	
	function linkParseXml($xml){
		$xml = unescape($xml.replace(/\+/g," "));
		debugWrite(">>"+$xml);
		var $xmlobj=null;
		if($xmlobj==null && typeof(DOMParser) != 'undefined'){
			$xmlobj = (new DOMParser()).parseFromString($xml, "text/xml");
	//		$xmlobj.parseFromString($xml,"text/xml");
		//alert($xmlobj);
			//$xmlobj = $xmlobj.documentElement;
		}else if($xmlobj==null && ActiveXObject) {
			$xmlobj = new ActiveXObject("Microsoft.XMLDOM");
			$xmlobj.async="false";
			$xmlobj.loadXML($xml);		
		}
		if($xmlobj!=null) linkDecodeXml($xmlobj);
	}
	me.linkParseXml = linkParseXml;
	
	function linkSendRequest(){
		$xml = linkEncodeXml();
		debugWrite("<<"+$xml);
		// create http object (to talk to server)
		$http = link_create_http();
		//alert($http.responseXML);
		if($http==null) return false;
		// talk to server
		$http.open("POST", me.proxy,true);
		$http.onreadystatechange=function() { if ($http.readyState==4) linkGotRequest($http); }
		$http.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		$http.send("xml="+escape($xml));
		if($http.readyState==4) linkGotRequest($http);		
		// return success
		return true;
	}
	me.linkSendRequest = linkSendRequest;
	
	// create xml to send to server
	function linkEncodeXml(){
		$xml = "<link>\n";
		$xml+= "<version>"+$linkVersion+"</version>\n";
		$xml+= "<debug>"+me.linkDebug+"</debug>\n";
		$xml+= "<data>"+linkEncodeArray(me.linkData)+"</data>\n";
		$xml+= "</link>\n";	
		return $xml;
	}
	me.linkEncodeXml = linkEncodeXml;
	
	function linkGotRequest($http){
		debugWrite(">>"+$http.responseText);
		linkDecodeXml($http.responseXML);
		if(typeof(link_onresponse) != 'undefined') link_onresponse();	
	}
	me.linkGotRequest = linkGotRequest;
	
	function linkDecodeXml($xmldom){
		// check version
		//alert($xmldom);
		$node_version = $xmldom.getElementsByTagName("version")[0];
		$server_version = $node_version.childNodes.item(0).nodeValue;
		if($server_version!=$linkVersion){ 
			alert("'coms.js' is out of date, please refresh your browser."); 
			return false; 
		}
		// get debug mode
		$node_debug = $xmldom.getElementsByTagName("debug")[0];	
		if($node_debug.childNodes.length > 0) linkSetDebug($node_debug.childNodes.item(0).nodeValue);
		// get proxy script (where to send next message)
		$node_proxy = $xmldom.getElementsByTagName("proxy")[0];	
		if($node_proxy.childNodes.length > 0) linkSetProxy($node_proxy.childNodes.item(0).nodeValue);
		// decode arrays (main memory)
		$linkData = Array();
		$link_data_mem = $xmldom.getElementsByTagName("data")[0];
		if($link_data_mem.childNodes.length>0) {
			$link_data_str = $link_data_mem.childNodes.item(0).nodeValue;
			me.linkData=linkDecodeArray($link_data_str);
		}
		// decode html changes to be made to the document
		$node_html = $xmldom.getElementsByTagName("write");
		for($i=0;$i<$node_html.length;$i++){
			$w = $node_html[$i];
			$id = $w.getAttribute('to');
			$clear = $w.getAttribute('clear');
			if($w.childNodes.length==0) $html=""; else $html = unescape($w.childNodes.item(0).nodeValue.replace(/\+/g," "));
			$ele = document.getElementById($id);
			if($ele!=null){
				if($clear=="true")
					$ele.innerHTML=$html;
				else
					$ele.innerHTML+=$html;
			}
		}
	}
	me.linkDecodeXml = linkDecodeXml;
	
	function linkEncodeArray($array){
		$array_str="";
		for($key in $array){
			$array_str+=$key+"="+escape($array[$key])+",";
		}
		return escape($array_str.substr(0,$array_str.length-1));
	}
	me.linkEncodeArray = linkEncodeArray;
	
	function linkDecodeArray($array_str){
		$array=Array();	
		$array_str = unescape($array_str.replace(/\+/g," "));
		$vars = $array_str.split("&");
		for($i=0;$i<$vars.length;$i++){
			$equals = $vars[$i].indexOf("=");
			$varname = $vars[$i].substr(0,$equals);
			$varvalue = $vars[$i].substr($equals+1);
			$array[$varname] =  unescape($varvalue.replace(/\+/g," "));
		}
		return $array;
	}
	me.linkDecodeArray = linkDecodeArray;
	
	function linkSetProxy($newProxy){
		me.proxy = $newProxy;	
	}
	me.linkSetProxy = linkSetProxy;
	
	function linkSetDebug($newDebug){
		if($newDebug==0) $newDebug=false;
		if($newDebug==1) $newDebug=true;
		me.debug = $newDebug;	
	}
	me.linkSetDebug = linkSetDebug;
	
	function linkHideDebug(){
		$linkDebugForm = document.getElementById("linkdebugform");
		$linkDebugForm.style.display="none";
	}
	me.linkHideDebug = linkHideDebug;
	
	function debugWrite($html){
		linkDebugWrite($html);
	}
	me.debugWrite = debugWrite;
	
	function linkDebugWrite($html){
		if(!me.linkDebug) return;
		$linkDebugForm = document.getElementById("linkdebugform");
		$linkDebugForm.style.display="";
		$text = $html.replace(RegExp(">","g"),"&gt;").replace(RegExp("<","g"),"&lt;");
		$linkDebugElement = document.getElementById("linkdebug");
		if($linkDebugElement.innerHTML.length > 1024) $linkDebugElement.innerHTML="";
		$linkDebugElement.innerHTML=$text+"<hr/>"+$linkDebugElement.innerHTML;	
	}
	me.linkDebugWrite = linkDebugWrite;
	
	function link_create_http(){ 
		var xmlhttp=false;
		/*@cc_on @*/
		/*@if (@_jscript_version >= 5)
		// JScript gives us Conditional compilation, we can cope with old IE versions.
		// and security blocked creation of the objects.
		 try {
		  return new ActiveXObject("Msxml2.XMLHTTP");
		 } catch (e) {
		  try {
		   return new ActiveXObject("Microsoft.XMLHTTP");
		  } catch (E) {
		   return false;
		  }
		 }
		@end @*/
		if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
			try {
				return new XMLHttpRequest();
			} catch (e) {
				return false;
			}
		}
		if (!xmlhttp && window.createRequest) {
			try {
				return window.createRequest();
			} catch (e) {
				return false;
			}
		}
	}
	
	// DRAGGING BETA
		$me=null;
		$dragX=-1;
		$dragY=-1;
		
		function begindrag(e){
			if(!e) e=window.event;		
			$me = document.getElementById("linkdebugform");
			$dragX = e.clientX - $me.offsetLeft;
			$dragY = e.clientY - $me.offsetTop;
			if($dragY > 20) return true;
			document.body.focus();
			document.body.onmousemove = function(e){ ondrag(e); }
			document.body.onmouseup = function(e){ enddrag(e); }
			document.onselectstart = function () { return false; };
			return false;
		}
	
		function ondrag(e){
			if(!e) e=window.event;		
			var newwidth = $me.offsetWidth;
			var newheight = $me.offsetHeight;
			newleft = e.clientX - $dragX;
			newtop = e.clientY - $dragY;
			$me.style.left=newleft+"px";
			$me.style.top=newtop+"px";
	
			return false;
		}
		
		function enddrag(e){
			document.body.onmousemove=document.body.onmouseup=document.body.onselectstart="";
			return false;
		}
}