/* Simple AJAX Code-Kit (SACK) v1.6.1 */
/* ©2005 Gregory Wild-Smith */
/* www.twilightuniverse.com */
/* Software licenced under a modified X11 licence,
   see documentation or authors website for more details */

function sack(file){
this.xmlhttp=null;
this.resetData=function(){
	this.method="POST";
	this.queryStringSeparator="?";
	this.argumentSeparator="&";
	this.URLString="";
	this.encodeURIString=true;
	this.execute=false;
	this.element=null;
	this.elementObj=null;
	this.requestFile=file;
	this.vars=new Object();
	this.responseStatus=new Array(2);
};

this.resetFunctions=function(){
	this.onLoading=function(){};
	this.onLoaded=function(){};
	this.onInteractive=function(){};
	this.onCompletion=function(){};
	this.onError=function(){};
	this.onFail=function(){};
};

this.reset=function(){
	this.resetFunctions();
	this.resetData();
};

this.createAJAX=function(){
	try{this.xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");}catch (e1){try{this.xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}catch (e2){this.xmlhttp=null;}}
	if(!this.xmlhttp){
		if(typeof XMLHttpRequest!="undefined"){this.xmlhttp=new XMLHttpRequest();}else{this.failed=true;}
	}
};

this.setVar=function(name,value){this.vars[name]=Array(value,false);};

this.encVar=function(name,value,returnvars){
	if(true==returnvars){return Array(encodeURIComponent(name),encodeURIComponent(value));
	}else{this.vars[encodeURIComponent(name)]=Array(encodeURIComponent(value),true);}
}

this.processURLString=function(string,encode){
	encoded=encodeURIComponent(this.argumentSeparator);
	regexp=new RegExp(this.argumentSeparator+"|"+encoded);
	varArray=string.split(regexp);
	for (i=0;i<varArray.length;i++){
		urlVars=varArray[i].split("=");
		if(true==encode){this.encVar(urlVars[0],urlVars[1]);}else{this.setVar(urlVars[0],urlVars[1]);}
	}
}

this.createURLString=function(urlstring){
	if(this.encodeURIString&&this.URLString.length){this.processURLString(this.URLString,true);}

	if(urlstring){
		if(this.URLString.length){this.URLString+=this.argumentSeparator+urlstring;}else{this.URLString=urlstring;}
	}

// prevents caching of URLString
	this.setVar("rndval",new Date().getTime());

	urlstringtemp=new Array();
	for(key in this.vars){
		if(false==this.vars[key][1]&&true==this.encodeURIString){
			encoded=this.encVar(key, this.vars[key][0],true);
			delete this.vars[key];
			this.vars[encoded[0]]=Array(encoded[1],true);
			key=encoded[0];
		}
		urlstringtemp[urlstringtemp.length]=key+"="+this.vars[key][0];
	}
	if(urlstring){this.URLString+=this.argumentSeparator+urlstringtemp.join(this.argumentSeparator);
	}else{this.URLString+=urlstringtemp.join(this.argumentSeparator);}
}

this.runResponse=function(){eval(this.response);}

this.runAJAX=function(urlstring){
	if(this.failed){this.onFail();
	}else{
		this.createURLString(urlstring);
		if(this.element){this.elementObj=document.getElementById(this.element);}
		if(this.xmlhttp){
			var self=this;
			if(this.method=="GET"){
				totalurlstring=this.requestFile+this.queryStringSeparator+this.URLString;
				this.xmlhttp.open(this.method, totalurlstring,true);
			}else{
				this.xmlhttp.open(this.method, this.requestFile,true);
				try{this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")}catch (e){}
			}
			this.xmlhttp.onreadystatechange=function(){
				switch (self.xmlhttp.readyState){
				case 1:
					self.onLoading();
					break;
				case 2:
					self.onLoaded();
					break;
				case 3:
					self.onInteractive();
					break;
				case 4:
					self.response=self.xmlhttp.responseText;
					self.responseXML=self.xmlhttp.responseXML;
					self.responseStatus[0]=self.xmlhttp.status;
					self.responseStatus[1]=self.xmlhttp.statusText;
					if(self.execute){self.runResponse();}
					if(self.elementObj){
						elemNodeName=self.elementObj.nodeName;
						elemNodeName.toLowerCase();
						if(elemNodeName=="input"||elemNodeName=="select"||elemNodeName=="option"||elemNodeName=="textarea"){
							self.elementObj.value=self.response;
						}else{self.elementObj.innerHTML=self.response;}
					}
					if(self.responseStatus[0]=="200"){self.onCompletion();}else{self.onError();}
					self.URLString="";
					break;
				}
			};
			this.xmlhttp.send(this.URLString);
		}
	}
};

this.reset();
this.createAJAX();
}

