/* 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;
			}
		}
		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="";
							delete self.xmlhttp['onreadystatechange'];
							self.xmlhttp=null;
							self.responseStatus=null;
							self.response=null;
							self.responseXML=null;
							break;
					}
				};
				this.xmlhttp.send(this.URLString);
			}
		}	
	};
	this.reset();
	this.createAJAX();
}
