/* 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();
}

