/* xajax Javascript library :: version 0.2.4 */
Array.prototype.containsValue=function(valueToCheck){
	for(var i=0;i<this.length;i++){
		if(this[i]==valueToCheck)return true;
	}
	return false;
}

function Xajax(){
	this.DebugMessage=function(text){
		if(text.length > 1000)text=text.substr(0,1000)+"...\n[long response]\n...";
		try{
			if(this.debugWindow==undefined||this.debugWindow.closed==true){
				this.debugWindow=window.open('about:blank','xajax-debug','width=800,height=600,scrollbars=1,resizable,status');
				this.debugWindow.document.write('<html><head><title>Xajax debug output</title></head><body><h2>Xajax debug output</h2><div id="debugTag"></div></body></html>');
			}
			text=text.replace(/&/g,"&amp;")
			text=text.replace(/</g,"&lt;")
			text=text.replace(/>/g,"&gt;")
			debugTag=this.debugWindow.document.getElementById('debugTag');
			debugTag.innerHTML=('<b>'+(new Date()).toString()+'</b>: '+text+'<hr/>')+debugTag.innerHTML;
		}catch(e){
			alert("Xajax Debug:\n "+text);
		}
	};
	this.workId='xajaxWork'+new Date().getTime();
	this.depth=0;this.responseErrorsForAlert=["400","401","402","403","404","500","501","502","503"];
	this.getRequestObject=function(){
		if(xajaxDebug)this.DebugMessage("Initializing Request Object..");
		var req=null;if(typeof XMLHttpRequest!="undefined")
		req=new XMLHttpRequest();
		if(!req&&typeof ActiveXObject!="undefined"){
			try{
				req=new ActiveXObject("Msxml2.XMLHTTP");
			}catch(e){
				try{req=new ActiveXObject("Microsoft.XMLHTTP");
				}catch(e2){
					try{
						req=new ActiveXObject("Msxml2.XMLHTTP.4.0");
					}catch(e3){
						req=null;
					}
				}
			}
		}
		if(!req&&window.createRequest)
			req=window.createRequest();
		if(!req)
			this.DebugMessage("Request Object Instantiation failed.");
		return req;
	}
	
	this.$=function(sId){
		if(!sId){return null;}
		var returnObj=document.getElementById(sId);
		if(!returnObj&&document.all){returnObj=document.all[sId];}
		if(xajaxDebug&&!returnObj&&sId!=this.workId){this.DebugMessage("Element with the id \""+sId+"\" not found.");}
		return returnObj;
	}

	this.include=function(sFileName){
		var objHead=document.getElementsByTagName('head');
		var objScript=document.createElement('script');
		objScript.type='text/javascript';
		objScript.src=sFileName;objHead[0].appendChild(objScript);
	}
	
	this.stripOnPrefix=function(sEventName){
		sEventName=sEventName.toLowerCase();
		if(sEventName.indexOf('on')==0){sEventName=sEventName.replace(/on/,'');}
		return sEventName;
	}

	this.addOnPrefix=function(sEventName){
		sEventName=sEventName.toLowerCase();
		if(sEventName.indexOf('on')!=0){sEventName='on'+sEventName;}
		return sEventName;
	}
	
	this.addHandler=function(sElementId,sEvent,sFunctionName){
		if(window.addEventListener){
			sEvent=this.stripOnPrefix(sEvent);
			eval("this.$('"+sElementId+"').addEventListener('"+sEvent+"',"+sFunctionName+",false);");
		}else{
			sAltEvent=this.addOnPrefix(sEvent);
			eval("this.$('"+sElementId+"').attachEvent('"+sAltEvent+"',"+sFunctionName+",false);");
		}
	}

	this.removeHandler=function(sElementId,sEvent,sFunctionName){
		if(window.addEventListener){
			sEvent=this.stripOnPrefix(sEvent);
			eval("this.$('"+sElementId+"').removeEventListener('"+sEvent+"',"+sFunctionName+",false);");
		}else{
			sAltEvent=this.addOnPrefix(sEvent);
			eval("this.$('"+sElementId+"').detachEvent('"+sAltEvent+"',"+sFunctionName+",false);");
		}
	}
	
	this.create=function(sParentId,sTag,sId){
		var objParent=this.$(sParentId);
		objElement=document.createElement(sTag);
		objElement.setAttribute('id',sId);
		if(objParent)
			objParent.appendChild(objElement);
	}

	this.insert=function(sBeforeId,sTag,sId){
		var objSibling=this.$(sBeforeId);
		objElement=document.createElement(sTag);
		objElement.setAttribute('id',sId);
		objSibling.parentNode.insertBefore(objElement,objSibling);
	}
	
	this.insertAfter=function(sAfterId,sTag,sId){
		var objSibling=this.$(sAfterId);
		objElement=document.createElement(sTag);
		objElement.setAttribute('id',sId);
		objSibling.parentNode.insertBefore(objElement,objSibling.nextSibling);
	}
	
	this.getInput=function(sType,sName,sId){
		var Obj;
		if(!window.addEventListener){
			Obj=document.createElement('<input type="'+sType+'" id="'+sId+'" name="'+sName+'">');
		}else{
			Obj=document.createElement('input');
			Obj.setAttribute('type',sType);
			Obj.setAttribute('name',sName);
			Obj.setAttribute('id',sId);
		}
		return Obj;
	}

	this.createInput=function(sParentId,sType,sName,sId){
		var objParent=this.$(sParentId);
		var objElement=this.getInput(sType,sName,sId);
		if(objParent&&objElement)
			objParent.appendChild(objElement);
	}

	this.insertInput=function(sBeforeId,sType,sName,sId){
		var objSibling=this.$(sBeforeId);
		var objElement=this.getInput(sType,sName,sId);
		if(objElement&&objSibling&&objSibling.parentNode)
			objSibling.parentNode.insertBefore(objElement,objSibling);
	}

	this.insertInputAfter=function(sAfterId,sType,sName,sId){
		var objSibling=this.$(sAfterId);
		var objElement=this.getInput(sType,sName,sId);
		if(objElement&&objSibling&&objSibling.parentNode){
			objSibling.parentNode.insertBefore(objElement,objSibling.nextSibling);
		}
	}
	
	this.remove=function(sId){
		objElement=this.$(sId);
		if(objElement&&objElement.parentNode&&objElement.parentNode.removeChild){
			objElement.parentNode.removeChild(objElement);
		}
	}
	
	this.replace=function(sId,sAttribute,sSearch,sReplace){
		var bFunction=false;
		if(sAttribute=="innerHTML")
			sSearch=this.getBrowserHTML(sSearch);
		eval("var txt=this.$('"+sId+"')."+sAttribute);
		if(typeof txt=="function"){
			txt=txt.toString();
			bFunction=true;
		}
		if(txt.indexOf(sSearch)>-1){
			var newTxt='';
			while(txt.indexOf(sSearch)>-1){
				x=txt.indexOf(sSearch)+sSearch.length+1;
				newTxt+=txt.substr(0,x).replace(sSearch,sReplace);
				txt=txt.substr(x,txt.length-x);
			}
			newTxt+=txt;
			if(bFunction){
				eval('this.$("'+sId+'").'+sAttribute+'=newTxt;');
			}else if(this.willChange(sId,sAttribute,newTxt)){
				eval('this.$("'+sId+'").'+sAttribute+'=newTxt;');
			}
		}
	}
	
	this.getFormValues=function(frm){
		var objForm;
		var submitDisabledElements=false;
		if(arguments.length > 1&&arguments[1]==true)
			submitDisabledElements=true;
		
		var prefix="";
		if(arguments.length > 2)
			prefix=arguments[2];
		if(typeof(frm)=="string")
			objForm=this.$(frm);
		else
			objForm=frm;
		
		var sXml="<xjxquery><q>";
		if(objForm&&objForm.tagName=='FORM'){
			var formElements=objForm.elements;
			for(var i=0;i < formElements.length;i++){
				if(!formElements[i].name)
					continue;
				if(formElements[i].name.substring(0,prefix.length)!=prefix)
					continue;
				if(formElements[i].type&&(formElements[i].type=='radio'||formElements[i].type=='checkbox')&&formElements[i].checked==false)
					continue;
				if(formElements[i].disabled&&formElements[i].disabled==true&&submitDisabledElements==false)
					continue;
					
				var name=formElements[i].name;
				if(name){
					if(sXml!='<xjxquery><q>')
						sXml+='&';
					if(formElements[i].type=='select-multiple'){
						for(var j=0;j < formElements[i].length;j++){
							if(formElements[i].options[j].selected==true)
								sXml+=name+"="+encodeURIComponent(formElements[i].options[j].value)+"&";
						}
					}else{
						sXml+=name+"="+encodeURIComponent(formElements[i].value);
					}
				}
			}
		}
		sXml+="</q></xjxquery>";
		return sXml;
	}
	
	this.objectToXML=function(obj){
		var sXml="<xjxobj>";
		for(i in obj){
			try{
				if(i=='constructor')
					continue;
				if(obj[i]&&typeof(obj[i])=='function')
					continue;
				
				var key=i;
				var value=obj[i];
				if(value&&typeof(value)=="object"&&this.depth <=50){
					this.depth++;
					value=this.objectToXML(value);
					this.depth--;
				}
				sXml+="<e><k>"+key+"</k><v>"+value+"</v></e>";
			}catch(e){
				if(xajaxDebug)this.DebugMessage(e.name+": "+e.message);
			}
		}
		
		sXml+="</xjxobj>";
		return sXml;
	}

	this._nodeToObject=function(node){
		if(node.nodeName=='#cdata-section'){
			var data="";
			for(var j=0;j<node.parentNode.childNodes.length;j++){
				data+=node.parentNode.childNodes[j].data;
			}
			return data;
		}else if(node.nodeName=='xjxobj'){
			var data=new Array();
			for(var j=0;j<node.childNodes.length;j++){
				var child=node.childNodes[j];
				var key;
				var value;
				if(child.nodeName=='e'){
					for(var k=0;k<child.childNodes.length;k++){
						if(child.childNodes[k].nodeName=='k'){
							key=child.childNodes[k].firstChild.data;
						}else if(child.childNodes[k].nodeName=='v'){
							value=this._nodeToObject(child.childNodes[k].firstChild);
						}
					}
					if(key!=null&&value!=null){
						data[key]=value;key=value=null;
					}
				}
			}
			return data;
		}
	}

	this.loadingFunction=function(){};	
	this.doneLoadingFunction=function(){};
	
	var loadingTimeout;
	//"getStart", arguments, 1
	this.call=function(sFunction,aArgs,sRequestType){
		var i,r,postData;
		if(document.body&&xajaxWaitCursor)
			document.body.style.cursor='wait';
		if(xajaxStatusMessages==true)
			window.status='Sending Request...';
		clearTimeout(loadingTimeout);
		//loadingTimeout=setTimeout("xajax.loadingFunction();",400);
		loadingTimeout=setTimeout("xajax.loadingFunction();");
		if(xajaxDebug)
			this.DebugMessage("Starting xajax...");
		
		if(sRequestType==null){
			var xajaxRequestType=xajaxDefinedPost;
		}else{
			var xajaxRequestType=sRequestType;
		}

		var uri=xajaxRequestUri;
		var value;
		switch(xajaxRequestType){
			case xajaxDefinedGet:{
				var uriGet=uri.indexOf("?")==-1?"?xajax="+encodeURIComponent(sFunction):"&xajax="+encodeURIComponent(sFunction);
				if(aArgs){
					for(i=0;i<aArgs.length;i++){
						value=aArgs[i];
						if(typeof(value)=="object")
							value=this.objectToXML(value);
						uriGet+="&xajaxargs[]="+encodeURIComponent(value);
					}
				}
				uriGet+="&xajaxr="+new Date().getTime();
				uri+=uriGet;
				postData=null;
			}break;
			case xajaxDefinedPost:{
				postData="xajax="+encodeURIComponent(sFunction);
				postData+="&xajaxr="+new Date().getTime();
				if(aArgs){
					for(i=0;i <aArgs.length;i++){
						value=aArgs[i];
						if(typeof(value)=="object")
							value=this.objectToXML(value);
						postData=postData+"&xajaxargs[]="+encodeURIComponent(value);
					}
				}
			}break;
			default:
				alert("Illegal request type: "+xajaxRequestType);
				return false;
			break;
		}
		//alert(postData)
		r=this.getRequestObject();
		if(!r)
			return false;
		r.open(xajaxRequestType==xajaxDefinedGet?"GET":"POST",uri,true);
		if(xajaxRequestType==xajaxDefinedPost){
			try{
				r.setRequestHeader("Method","POST "+uri+" HTTP/1.1");
				r.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			}catch(e){
				alert("Your browser does not appear to  support asynchronous requests using POST.");
				return false;
			}
		}
		r.onreadystatechange=function(){
			if(r.readyState!=4)
				return;
			if(r.status==200){
				if(xajaxDebug)
					xajax.DebugMessage("Received:\n"+r.responseText);
				if(r.responseXML&&r.responseXML.documentElement){
					//alert(xajax.processResponse(r.responseXML));
					xajax.processResponse(r.responseXML);
				}else{
					var errorString="Error: the XML response that was returned from the server is invalid.";
					errorString+="\nReceived:\n"+r.responseText;
					trimmedResponseText=r.responseText.replace(/^\s+/g,"");
					trimmedResponseText=trimmedResponseText.replace(/\s+$/g,"");
					if(trimmedResponseText!=r.responseText)
						errorString+="\nYou have whitespace in your response.";
					alert(errorString);
					document.body.style.cursor='default';
					if(xajaxStatusMessages==true)
						window.status='Invalid XML response error';
				}
			}else{
				if(xajax.responseErrorsForAlert.containsValue(r.status)){
					var errorString="Error: the server returned the following HTTP status: "+r.status;
					errorString+="\nReceived:\n"+r.responseText;
					alert(errorString);
				}
				document.body.style.cursor='default';
				if(xajaxStatusMessages==true)
					window.status='Invalid XML response error';
			}
			delete r;
			r=null;
		}
		if(xajaxDebug)
			this.DebugMessage("Calling "+sFunction+" uri="+uri+" (post:"+postData+")");
		r.send(postData);
		if(xajaxStatusMessages==true)
			window.status='Waiting for data...';
		delete r;
		return true;
	}
	
	this.getBrowserHTML=function(html){
		tmpXajax=this.$(this.workId);
		if(!tmpXajax){
			tmpXajax=document.createElement("div");
			tmpXajax.setAttribute('id',this.workId);
			tmpXajax.style.display="none";
			tmpXajax.style.visibility="hidden";
			document.body.appendChild(tmpXajax);
		}
		tmpXajax.innerHTML=html;
		var browserHTML=tmpXajax.innerHTML;
		tmpXajax.innerHTML='';
		return browserHTML;
	}

	this.willChange=function(element,attribute,newData){
		if(!document.body){
			return true;
		}
		if(attribute=="innerHTML"){
			newData=this.getBrowserHTML(newData);
		}
		elementObject=this.$(element);
		if(elementObject){
			var oldData;
			eval("oldData=this.$('"+element+"')."+attribute);
			if(newData!==oldData)
				return true;
		}
		return false;
	}
	
	this.viewSource=function(){
		return "<html>"+document.getElementsByTagName("HTML")[0].innerHTML+"</html>";
	}
	
	this.processResponse=function(xml){
		clearTimeout(loadingTimeout);
		this.doneLoadingFunction();
		if(xajaxStatusMessages==true)
			window.status='Processing...';
		var tmpXajax=null;
		xml=xml.documentElement;
		if(xml==null)
			return;
		var skipCommands=0;
		for(var i=0;i<xml.childNodes.length;i++){
			if(skipCommands > 0){
				skipCommands--;
				continue;
			}
			if(xml.childNodes[i].nodeName=="cmd"){
				var cmd;
				var id;
				var property;
				var data;
				var search;
				var type;
				var before;
				var objElement=null;
				
				for(var j=0;j<xml.childNodes[i].attributes.length;j++){
					if(xml.childNodes[i].attributes[j].name=="n"){
						cmd=xml.childNodes[i].attributes[j].value;
					}else if(xml.childNodes[i].attributes[j].name=="t"){
						id=xml.childNodes[i].attributes[j].value;
					}else if(xml.childNodes[i].attributes[j].name=="p"){
						property=xml.childNodes[i].attributes[j].value;
					}else if(xml.childNodes[i].attributes[j].name=="c"){
						type=xml.childNodes[i].attributes[j].value;
					}
				}
				if(xml.childNodes[i].childNodes.length > 1&&xml.childNodes[i].firstChild.nodeName=="#cdata-section"){
					data="";
					for(var j=0;j<xml.childNodes[i].childNodes.length;j++){
						data+=xml.childNodes[i].childNodes[j].data;
					}
				}else if(xml.childNodes[i].firstChild&&xml.childNodes[i].firstChild.nodeName=='xjxobj'){
					data=this._nodeToObject(xml.childNodes[i].firstChild);objElement="XJX_SKIP";
				}else if(xml.childNodes[i].childNodes.length > 1){
					for(var j=0;j<xml.childNodes[i].childNodes.length;j++){
						if(xml.childNodes[i].childNodes[j].childNodes.length > 1&&xml.childNodes[i].childNodes[j].firstChild.nodeName=="#cdata-section"){
							var internalData="";
							for(var k=0;k<xml.childNodes[i].childNodes[j].childNodes.length;k++){
								internalData+=xml.childNodes[i].childNodes[j].childNodes[k].nodeValue;
							}
						}else{
							var internalData=xml.childNodes[i].childNodes[j].firstChild.nodeValue;
						}
						if(xml.childNodes[i].childNodes[j].nodeName=="s"){
							search=internalData;
						}
						if(xml.childNodes[i].childNodes[j].nodeName=="r"){
							data=internalData;
						}
					}
				}else if(xml.childNodes[i].firstChild)
					data=xml.childNodes[i].firstChild.nodeValue;
				else
					data="";
				if(objElement!="XJX_SKIP")
					objElement=this.$(id);
				
				var cmdFullname;
				try{
					if(cmd=="cc"){
						cmdFullname="addConfirmCommands";
						var confirmResult=confirm(data);
						if(!confirmResult){
							skipCommands=id;
						}
					}
					if(cmd=="al"){
						cmdFullname="addAlert";
						alert(data);
					}else if(cmd=="js"){
						cmdFullname="addScript/addRedirect";
						eval(data);
					}else if(cmd=="jc"){
						cmdFullname="addScriptCall";
						var scr=id+'(';
						if(data[0]!=null){
							scr+='data[0]';
							for(var l=1;l<data.length;l++){
								scr+=',data['+l+']';
							}
						}
						scr+=');';
						eval(scr);
					}else if(cmd=="in"){
						cmdFullname="addIncludeScript";
						this.include(data);
					}else if(cmd=="as"){
						cmdFullname="addAssign/addClear";
						if(this.willChange(id,property,data)){
							eval("objElement."+property+"=data;");
						}
					}else if(cmd=="ap"){
						cmdFullname="addAppend";
						eval("objElement."+property+"+=data;");
					}else if(cmd=="pp"){
						cmdFullname="addPrepend";
						eval("objElement."+property+"=data+objElement."+property);
					}else if(cmd=="rp"){
						cmdFullname="addReplace";
						this.replace(id,property,search,data);
					}else if(cmd=="rm"){
						cmdFullname="addRemove";
						this.remove(id);
					}else if(cmd=="ce"){
						cmdFullname="addCreate";
						this.create(id,data,property);
					}else if(cmd=="ie"){
						cmdFullname="addInsert";
						this.insert(id,data,property);
					}else if(cmd=="ia"){
						cmdFullname="addInsertAfter";
						this.insertAfter(id,data,property);
					}else if(cmd=="ci"){
						cmdFullname="addCreateInput";
						this.createInput(id,type,data,property);
					}else if(cmd=="ii"){
						cmdFullname="addInsertInput";
						this.insertInput(id,type,data,property);
					}else if(cmd=="iia"){
						cmdFullname="addInsertInputAfter";
						this.insertInputAfter(id,type,data,property);
					}else if(cmd=="ev"){
						cmdFullname="addEvent";
						property=this.addOnPrefix(property);
						eval("this.$('"+id+"')."+property+"= function(){"+data+";}");
					}else if(cmd=="ah"){
						cmdFullname="addHandler";
						this.addHandler(id,property,data);
					}else if(cmd=="rh"){
						cmdFullname="addRemoveHandler";
						this.removeHandler(id,property,data);
					}
				}catch(e){
					if(xajaxDebug)
						alert("While trying to '"+cmdFullname+"' (command number "+i+"), the following error occured:\n"+e.name+": "+e.message+"\n"+(id&&!objElement?"Object with id='"+id+"' wasn't found.\n":""));
				}
				delete objElement;
				delete cmd;
				delete cmdFullname;
				delete id;
				delete property;
				delete search;
				delete data;
				delete type;
				delete before;
				delete internalData;
				delete j;
				delete k;
			}
		}
		delete xml;
		delete i;
		document.body.style.cursor='default';
		if(xajaxStatusMessages==true)
			window.status='Done';
	}
}
var xajax=new Xajax();
xajaxLoaded=true;
