// JavaScript Document
//©Copyright 2008-2009 Jon Roose


/*Declare global control variables*/
var AJAXDefault=new Object();
var AJAXDebug=true;
var resCache=new Array();
var cacheTime=1500;

var cacheCount=0;

function AJAX(url,cb,ajaxParams,cbParams){
	/*Initialize AJAX object*/
	this.httpRequest = false;
	this.action=url||null;
	this.parameters=ajaxParams||new Object();
	this.callback=cb||null;
	this.skipUpdate=new Array();
	this.cbParams=cbParams||new Object();
}

AJAX.prototype.submitWait=function(){
	/*Stub*/
	this.submit();
}

/*Simple alert Callback*/
AJAX.prototype.cbAlert = function (result) {
	alert("AJAX Result: "+jsonStringify(result));
}

/*Parses an object into a request string*/
AJAX.prototype.makeParameters = function (addArrays){
	var ret='';
	var paramArrays=new Array(AJAXDefault,this.parameters);
	if(isArray(addArrays)) paramArrays=paramArrays.concat(addArrays);
	
	if(this.parameters.req=='f' && vgLib['ajaxSearch']){
		sObjs=new Array();
		srch=vgLib['ajaxSearch'].elements;
		for(var s in srch) if(srch[s].ajaxSearch && isObject(nParams=srch[s].ajaxSearch.getParams()))
			sObjs[sObjs.length]=(nParams);
		paramArrays.push(sObjs);
	}
	
	
	for(var p in paramArrays)
		if(paramArrays[p] && typeof(paramArrays[p])=='object'){
			for (var str in paramArrays[p]){
				if(isArray(paramArrays[p][str])||isObject(paramArrays[p][str])){
					for(var i in paramArrays[p][str]){
						if(ret) ret+='&';
						ret+=encURI(str+"[]")+'='+encURI(paramArrays[p][str][i]);
					}
				}else{
					if(ret) ret+='&';
					ret+=encURI(str)+'='+encURI(paramArrays[p][str]);
				}
			}
		}else
			alert("Invalid parameter object " + jsonStringify(paramArrays[p]));
	
	this.paramString=ret;
	return ret;
}

AJAX.prototype.error=function(code){
	alert(errorMessages[code]);
	return null;
}

AJAX.prototype.makeResultsNode=function(title,text){
	var nP=document.createElement('p');
	nP.appendChild(document.createTextNode(title));
	nP.appendChild(document.createElement('br'));
	if(!isArray(text)){
		nP.appendChild(document.createTextNode(jsonStringify(text)));
		nP.appendChild(document.createElement('br'));
	}else{
		for(var t in text){
			nP.appendChild(document.createTextNode(jsonStringify(text[t])));
			nP.appendChild(document.createElement('br'));
		}
	}
	return nP;
}

AJAX.prototype.killCache=function(cachevar){
	delete resCache[cachevar];
}

AJAX.prototype.initCB=function(request){
	if(request.status==200){
		r={"results":String(request.responseText)};
		
		if(AJAXDebug && vgLib['divwin']){
			nDiv=document.createElement('div');
			nDiv.appendChild(this.makeResultsNode('Request',this.action+"?"+this.paramString));
			nDiv.appendChild(this.makeResultsNode('Results',request.responseText));
			
			if(isArray(r.results) && r.results.length) nDiv.appendChild(this.makeResultsNode('Results',r.results));
			if(isArray(r.sql) && r.sql.length) nDiv.appendChild(this.makeResultsNode('SQL',r.sql));
			if(isArray(r.error) && r.error.length) nDiv.appendChild(this.makeResultsNode('Error',r.error));
			if(isArray(r.warning) && r.warning.length) nDiv.appendChild(this.makeResultsNode('Warning',r.warning));
	
			if(this.sendTime){
				var now=new Date();
				var time=now-this.sendTime;
	//			nDiv.appendChild(this.makeResultsNode('Time',self.sendTime+","+now+","+time));
				nDiv.appendChild(this.makeResultsNode('Time',(Math.floor((time/1000/60) % 60)+':'+(Math.floor(time/1000) % 60)+':'+(Math.floor(time) % 1000))));
			}
			
			nDiv.setAttribute('width',"400px");
			nDiv.setAttribute('height',"300px");
			nDiv.setAttribute('title',"OO-Ajax Results");
			nWin=new vgClass(nDiv,"divwin");
			nWin.minimize();
//			alertLog();
		}
		if(r && isObject(r) && !r.error)
			if(this.callback) this.callback(r.results,this.cbParams);
	}else
		alert('AJAX script ['+this.action+'] returned error status ' + request.status);
}

errorMessages={"1":'An AJAX race condition error has occured',
		"2":'Invalid AJAX action!',
		"3":'Please enable ActiveX controls',
		"4":'Cannot create XMLHTTP instance'
	};

AJAX.prototype.submit=function () {
	var error=0;
	if(this.httpRequest) error=1;
	if(!this.action) error=2;
	
	if(!error){
		this.lastSubmit=this.submit;
		var ajaxself=this;
		ajaxself.saveself=self;
		
		if (window.XMLHttpRequest) ajaxself.httpRequest = new XMLHttpRequest(); // Mozilla, Safari,...
		else if(window.ActiveXObject) //IE
			{try{ajaxself.httpRequest = new ActiveXObject("Msxml2.XMLHTTP")}
			catch(e){window.status="";
			try{ajaxself.httpRequest = new ActiveXObject("Microsoft.XMLHTTP")}
			catch(e){window.status="";}}}
			
		if(ajaxself.httpRequest.overrideMimeType) ajaxself.httpRequest.overrideMimeType('text/html');
		
		if(!this.httpRequest) {
			if(isIE) error=3;
			else error=4;
		}
		
		this.httpRequest.onreadystatechange=function(){
			if(ajaxself.httpRequest.readyState==4){
				var request=ajaxself.httpRequest;
				ajaxself.cacheID=cacheCount++;
				resCache[ajaxself.cacheCount]={"paramString":ajaxself.paramString,"httpRequest":request};
				window.setTimeout(function(){ajaxself.killCache(ajaxself.lastCacheID);},cacheTime);
				ajaxself.initCB(request);
				ajaxself.httpRequest=false;
			}
		}
		
		if(!error){
			this.makeParameters();
			
			if(resCache)
				for(var c in resCache)
					if(resCache[c].paramString==ajaxself.paramString){
						ajaxself.httpRequest=null;
						ajaxself.initCB(resCache[c].httpRequest);
						return false;
					}
			
			
			this.httpRequest.open('GET', this.action);
			this.httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			this.httpRequest.setRequestHeader("Connection", "close");
			this.sendTime=new Date();
//			alert(this.paramString);
			this.httpRequest.send("");
			return 0;
		}
	}
	if(error) alert(errorMessages[error]);
}
