var aAJAXID=new Array();
var aAJAXGROUP=new Array();
var aAJAXINITIALURL=new Array();
var aAJAXINITIALPARAMS=new Array();
var aAJAXPARAMS=new Array();
var aAJAXSCRIPTS=new Array();

var nAJAXSCRIPTSCount=new Array();
var nAJAXElementsCount=0;

var bLoadAsync=false;

addLoadEvent(setAjaxonLoadState);

function setAjaxonLoadState() {

	setAsyncElementLoading();

}

function setAsyncElementLoading(){

	bLoadAsync=true;

}

function addPrototypeElement(cAJAXID,cAJAXGROUP,cINITIALURL,cINITIALPARAMS,bLoad) { 

	var bIsNew=false;
	var nAJAXElementPos=getArrayPosViaId(cAJAXID);
	if (nAJAXElementPos==-1) {
		nAJAXElementPos=nAJAXElementsCount;
		bIsNew=true;
	}
	
	aAJAXID[nAJAXElementPos]=cAJAXID;
	aAJAXGROUP[nAJAXElementPos]=cAJAXGROUP;
	aAJAXINITIALURL[nAJAXElementPos]=cINITIALURL;
	aAJAXINITIALPARAMS[nAJAXElementPos]=cINITIALPARAMS;
	aAJAXPARAMS[nAJAXElementPos]=cINITIALPARAMS;
	aAJAXSCRIPTS[nAJAXElementPos]=new Array();
	nAJAXSCRIPTSCount[nAJAXElementPos]=0;
	
	if (bIsNew) {
		nAJAXElementsCount=nAJAXElementsCount+1;
	}
	
	if (bLoad==null) {
		bLoad=true;
	}
		
	if (bLoad) {
		reloadPrototypeElement(cAJAXID);
	}
}

function unloadPrototypeElement(cAJAXID) {

	var i=getArrayPosViaId(cAJAXID);
	if (i!=-1) {
		// Keep the place holder in order to reinitialize it on future creation of element ::: aAJAXID[i]='';
		aAJAXGROUP[i]='';
		aAJAXINITIALURL[i]='';
		aAJAXINITIALPARAMS[i]='';
		aAJAXPARAMS[i]='';
		
		// unload the javascripts
		// Not Done
		
		nAJAXSCRIPTSCount[i]=0;
	}
}

function setGroupState(nBookmarkId,cAJAXGROUP,cINITIALURL,cINITIALPARAMS) {
	var i=0;
	var q=0;
	
	aAJAXGROUPRELOAD=cAJAXGROUP.split(',');
	while (q<aAJAXGROUPRELOAD.length)	{
		i=0;	
		while (i<nAJAXElementsCount) {
			if ( aAJAXGROUP[i]==aAJAXGROUPRELOAD[q] ) {
			
//				Controller javascript code
//				aAJAXINITIALURL[i]=cINITIALURL;

				aAJAXINITIALPARAMS[i]=cINITIALPARAMS;
			}
			i=i+1;
		}
		q=q+1;
	}
}

function setGroupParams(nBookmarkId,cAJAXGROUP,cPARAMS) {
	var i=0;
	var q=0;
	var cParam='';
	var cValue='';
	var aPARAMS;
	var cUrl;
	
	aAJAXGROUPRELOAD=cAJAXGROUP.split(',');
	aPARAMS=cPARAMS.split('=');

	while (q<aAJAXGROUPRELOAD.length)	{
		i=0;	
		while (i<nAJAXElementsCount) {
			if ( aAJAXGROUP[i]==aAJAXGROUPRELOAD[q] ) {
			
//				Controller javascript code
//				aAJAXINITIALURL[i]=cINITIALURL;

				cUrl=aAJAXINITIALPARAMS[i];
				cParam=aPARAMS[0];
				cValue=aPARAMS[1];
				cUrl=setUrlParam(cUrl,cParam,cValue);

				aAJAXINITIALPARAMS[i]=cUrl;
			}
			i=i+1;
		}
		q=q+1;
	}
}

function getArrayPosViaId(cAJAXID) {

	var i=0;
	while (i<nAJAXElementsCount && cAJAXID!=aAJAXID[i]) {
		i=i+1; 
	}
	
	if (cAJAXID==aAJAXID[i]) {
		return i;
	} else {
		return -1;
	}
}

function initializePrototypeElement(cAJAXID) {

	var i=getArrayPosViaId(cAJAXID);	
	if (i!=-1) {
		aAJAXPARAMS[i]=aAJAXINITIALPARAMS[i];
	}
}

function clearPrototypeElementGroups(cAJAXGROUP) {

	var i=0;
	var q=0;
	var cDivId;
	
	aAJAXGROUPRELOAD=cAJAXGROUP.split(',');

	while (q<aAJAXGROUPRELOAD.length)	 {
		i=0;	
		while (i<nAJAXElementsCount) {
			if ( aAJAXGROUP[i]==aAJAXGROUPRELOAD[q] ) {
				cDivId='prototype_' + aAJAXID[i];
				if (document.getElementById(cDivId)!=null) {
					document.getElementById(cDivId).innerHTML='';
				}
			}
			i=i+1;
		}
		q=q+1;
	}

}

function reloadPrototypeElementGroups(cAJAXGROUP, cUrlParams) {

	var i=0;
	var q=0;
	var bStateStore;
	var cOut='';
	
	aAJAXGROUPRELOAD=cAJAXGROUP.split(',');
	
	while (q<aAJAXGROUPRELOAD.length)	 {
	
		if (aAJAXGROUPRELOAD[q].indexOf('.NOSTORE')!=-1) {
			bStateStore=false;
		} else {
			bStateStore=true;
		}
		
		aAJAXCOMMANDS=aAJAXGROUPRELOAD[q].split('.');
		if (aAJAXCOMMANDS.length>0) {
			aAJAXGROUPRELOAD[q]=aAJAXCOMMANDS[0];
		}	
		
		i=0;	
		while (i<nAJAXElementsCount) {
			if ( aAJAXGROUP[i]==aAJAXGROUPRELOAD[q] ) {
				if (aAJAXCOMMANDS.length>0) {
					var cFormIds=executeAJAXCommands(aAJAXID[i],aAJAXCOMMANDS,1);
				}
				reloadPrototypeElement( aAJAXID[i], cUrlParams, cFormIds, bStateStore);
			}
			i=i+1;
		}
		q=q+1;
	}
}

function reloadPrototypeElement(cAJAXID,cUrlParams,cFormIds,bStateStore) {

	var i=getArrayPosViaId(cAJAXID);
	
	if (i!=-1) {
	
		if (cUrlParams=='') {
			cUrlParams=null;
		}
		
		if (bStateStore==null) {
			bStateStore=true;
		}
	
		var nElementArrayPos=i;
		var cAJAXGROUP=aAJAXGROUP[i];
		var cINITIALURL=aAJAXINITIALURL[i];
		var cSTATEPARAMS=aAJAXPARAMS[i];
		
		if (cFormIds!=null) {
			var bFormSubmitEvents=checkFormSubmitEvents(cFormIds);
			if (!bFormSubmitEvents) {
				return;
			}
		}
	
		if (cUrlParams!=null) {
			var aURLParams=cUrlParams.split("&");
			var q=0;
			while (q<aURLParams.length) {
				var aParam=aURLParams[q].split("=");
				if (aParam[0]!="catid" && aParam[0]!="subid") {
					cSTATEPARAMS=setUrlParam(cSTATEPARAMS,aParam[0],aParam[1]);
				}
				q=q+1;
			}
		}
		
		var cElemCatId=getUrlParam(cUrlParams,"catid");
		var cElemCatIdLocal=getUrlParam(cUrlParams,"catidlocal");
		if (cElemCatId!="" && cElemCatIdLocal=="") {
			cSTATEPARAMS=setUrlParam(cSTATEPARAMS,"catidlocal",cElemCatId);
		}
		
		var cElemSubId=getUrlParam(cUrlParams,"subid");
		var cElemSubIdLocal=getUrlParam(cUrlParams,"subidlocal");
		if (cElemSubId!="" && cElemSubIdLocal=="") {
			cSTATEPARAMS=setUrlParam(cSTATEPARAMS,"subidlocal",cElemSubId);
		}

		if (bStateStore) {
			aAJAXPARAMS[i]=cSTATEPARAMS;
		}
		
		if (cFormIds!=null) {
			var cFormParams=serializeForm(cFormIds);
			var aURLParams=cFormParams.split("&");
			var q=0;
			while (q<aURLParams.length) {
				var aParam=aURLParams[q].split("=");
				cSTATEPARAMS=setUrlParam(cSTATEPARAMS,aParam[0],aParam[1]);
				q=q+1;
			}
		}
		var url=cINITIALURL + "?" + cSTATEPARAMS;
		var cDivId='prototype_' + cAJAXID;
		
		// Clean up old Scripts of element !!!
		var q=0;
		while (q<nAJAXSCRIPTSCount[nElementArrayPos]) {
			// Unload of element javascripts NOT DONE
			// aAJAXSCRIPTS[nElementArrayPos][q].text='';
			q=q+1;
		}
	
		url=setUrlParam(url,"ajaxid",cAJAXID);
		url=setUrlParam(url,"ajaxgroup",cAJAXGROUP);
  
		var xmlHttp=GetXmlHttpObject(function() {
			if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
				if (document.getElementById(cDivId)!=null) {
					document.getElementById(cDivId).innerHTML=xmlHttp.responseText;
				
					nAJAXSCRIPTSCount[nElementArrayPos]=0;
					var divId = document.getElementById(cDivId);
					var x = divId.getElementsByTagName("script");
					var h = document.getElementsByTagName("head")[0];
					for(var i=0;i<x.length;i++)
					{
						var s = document.createElement("script");
						s.type="text/javascript";
						h.appendChild(s);
						s.text=x[i].text;
					
						nAJAXSCRIPTSCount[nElementArrayPos]=nAJAXSCRIPTSCount[nElementArrayPos]+1;
						aAJAXSCRIPTS[nElementArrayPos][nAJAXSCRIPTSCount[nElementArrayPos]]=s;
					}
				} else {
					// Destroy Element Position
					unloadPrototypeElement(cAJAXID);
				}
			}	
		});
				
		xmlHttp.open("GET", url , bLoadAsync);
		xmlHttp.send(null);	
	}
}

function executeAJAXCommands( cAJAXID, aAJAXCOMMANDS,nArrayStartPos) {

	var q=0;
	if (nArrayStartPos!=null){
		q=nArrayStartPos;	
	}
	
	while (q<aAJAXCOMMANDS.length) {
	
		var cAJAXCOMMAND=aAJAXCOMMANDS[q];	
		var nBracketPosStart=cAJAXCOMMAND.indexOf("(");
		if (nBracketPosStart!=-1) {
			var nBracketPosEnd=cAJAXCOMMAND.indexOf(")");	
			cAJAXCOMMANDParams=cAJAXCOMMAND.substring(nBracketPosStart+1,nBracketPosEnd);
			cAJAXCOMMAND=cAJAXCOMMAND.substring(0,nBracketPosStart);
			aAJAXCOMMANDParams=cAJAXCOMMANDParams.split(",");
		}

		switch (cAJAXCOMMAND) {
			case "INITIAL" :
				initializePrototypeElement(cAJAXID);
				return null;
				break;
				
			case "NOSTORE" :
				return null;			
				break;
			
			case "FORMSUBMIT" :
				return aAJAXCOMMANDParams[0];
				break;
				
			case "JUMPTOANCHOR" :
				window.location.hash=aAJAXCOMMANDParams[0];
				break;
		}
		q=q+1;
	}
}

function setUrlParam(cURL,cParam,cValue) {

	if (cURL!=null) {
		var cURLOut="";
		var cParamName=cParam + "=";
		var nParamPos=cURL.indexOf(cParamName);
		var cParamString=cParam + "=" + cValue;
	
		if (nParamPos==-1) {
			if (cURL.indexOf("?")!=0) {
				cURLOut=cURL + "&" + cParamString;
			} else {
				cURLOut=cURL + "?" + cParamString;
			}
		} else {
			nParamPosTo=cURL.indexOf("&",nParamPos);
			if (nParamPosTo==-1) {
				cURLOut=cURL.substring(0,nParamPos) + cParamString;
			} else {
				cURLOut=cURL.substring(0,nParamPos) + cParamString + cURL.substring(nParamPosTo);
			}
		}
		return cURLOut;
	} else {
		return "";
	}
}

function getUrlParam(cURL,cParam) {

	if (cURL!=null) {
		var cValue="";
		var cParamName=cParam + "=";
		var nParamPos=cURL.indexOf(cParamName);
	
		if (nParamPos!=-1) {
			nParamPos=nParamPos + cParam.length + 1;
			nParamPosTo=cURL.indexOf("&",nParamPos);
			if (nParamPosTo==-1) {
				cValue=cURL.substring(nParamPos);
			} else {
				cValue=cURL.substring(nParamPos,nParamPosTo);
			}
		}
		return cValue;
	} else {
		return "";
	}
}

function GetXmlHttpObject(handler) { 
	var objXmlHttp=null;

	if (navigator.userAgent.indexOf("MSIE")>=0)	{ 
		
		var strName="Msxml2.XMLHTTP";
		if (navigator.appVersion.indexOf("MSIE 5.5")>=0) {
			strName="Microsoft.XMLHTTP";
		} 
		
		try { 
			objXmlHttp=new ActiveXObject(strName);
			objXmlHttp.onreadystatechange=handler;
			return objXmlHttp;
		} catch(e) { 
			alert("Error. Scripting for ActiveX might be disabled");
			return;
		} 
		
	} else {

		objXmlHttp=new XMLHttpRequest();
		objXmlHttp.onload=handler;
		objXmlHttp.onerror=handler;
		return objXmlHttp;
		
	}
} 

function serializeForm(formId) {

	var oForm=document.getElementById(formId);
	
	var q=0;
	var querystr="";
	var oFormInputNamePrv="";

	while (q<oForm.length) {

		var oFormInputName=escape(oForm[q].name) ;
		var oFormInputValue=escape(oForm[q].value) ;
		var oFormInputType=oForm[q].type;
		

		if (oFormInputNamePrv!=oFormInputName || oFormInputType=='checkbox') {
		
			switch (oFormInputType) {
		
				case "button" :
					oFormInputValue="";
					break;

				case "checkbox" :	
					try {
						if (oForm[q].checked) {
							oFormInputValue=oFormInputValue;
						} else {
							oFormInputValue="";
						}
					} catch(err) {
						oFormInputValue="";
					}
					break;
		
				case "file" :			
					oFormInputValue="";
					break;

				case "hidden" :			
					break;

				case "image" :			
					break;

				case "password" :	
					break;
					
				case "radio" :			
					oFormInputValue=checkFormChilds(formId,q,"checked")
					break;
					
				case "reset" :			
					break;
					
				case "select-one" :
					try {
						oFormInputValue=oForm[q].options[oForm[q].selectedIndex].value;
					} catch(err) {
						oFormInputValue="";
					}					
					break;
					
				case "select-multiple" :			
					break;
					
				case "submit" :			
					break;
					
				case "text" :			
					break;

				case "textarea" :			
					break;
			}
			
			if (oFormInputValue!="") {
				var oFormInputPair=oFormInputName + "=" + oFormInputValue;
				if (querystr!="") {
					querystr=querystr + "&";
				}
				querystr=querystr + oFormInputPair;
			}
			var oFormInputNamePrv=oFormInputName;
		}
		
		q=q+1;
	}
	
	return querystr;
	
}

function checkFormChilds(formId,nFormElem,oElementSelected) {

	var oForm=document.getElementById(formId);
	var cInitialFormInputName=oForm[nFormElem].name;
	var cOut="";
	
	while (cInitialFormInputName==oForm[nFormElem].name) {

		if (oForm[nFormElem].checked) {
			cOut=oForm[nFormElem].value;
		}
		
		nFormElem=nFormElem+1;
		
		if (nFormElem==oForm.length) {
			break;
		}		
	}
	
	return cOut;
	
}

function checkFormSubmitEvents(formId) {

	var oForm=document.getElementById(formId);
	var cOnSubmit=oForm.onsubmit + ' ';
	
	if (oForm.onsubmit==null) {
		return true;
	} else {
		var nOpenBracketPos=cOnSubmit.indexOf("{");
			
		if (nOpenBracketPos!=-1) {
			var nCloseBrachetPos=cOnSubmit.lastIndexOf("}");
			cOnSubmit=cOnSubmit.substr(nOpenBracketPos+1,nCloseBrachetPos-nOpenBracketPos-1);
			cOnSubmit="var onFormSubmitEvent=" + cOnSubmit;
			try {
			
				eval(cOnSubmit);
				
			} catch(e) { 
			
				var onFormSubmitEvent=true;		// have to be checked
				
			}
			if (onFormSubmitEvent==null) {
				return true;
			} else {
				return onFormSubmitEvent;
			}
		}		
	}
}

function addLoadEvent(func) {   

	var oldonload = window.onload;   

	if (typeof window.onload != 'function') {   
		window.onload = func;   
	} else {   
		window.onload = function() {   
			if (oldonload) {   
				oldonload();   
			}   
			func();   
		}   
	}   
}   

