/* 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 */
sack.prototype={
	xmlhttp: null,
	resetData: function() {
		this.method = 'POST';
  		this.queryStringSeparator = "?";
		this.argumentSeparator = "&";
		this.URLString = "";
		this.encodeURIString = true;
  		this.execute = false;
  		this.element = null;
		this.elementObj = null;
		this.vars = {};
		this.responseStatus = [2];
  	},
  	resetFunctions:function(){
  		this.onLoading=function(){};
  		this.onLoaded=function(){};
  		this.onInteractive=function(){};
  		this.onCompletion=function(){};
  		this.onError=function(){};
		this.onFail=function(){};
	},
	reset: function() {
		this.resetFunctions();
		this.resetData();
	},	
	createAJAX: function() {
		if(window.XMLHttpRequest){this.xmlhttp = new XMLHttpRequest()}
		else{
			try{this.xmlhttp=new ActiveXObject('Msxml2.XMLHTTP')}catch(e1){
				try{this.xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")}catch(e2){this.xmlhttp=null}
		}}		
	},
	setVar: function(name, value){
		this.vars[name] = Array(value, false);
	},
	encVar: function(name, value, returnvars) {
		if (true == returnvars){return Array(encodeURIComponent(name), encodeURIComponent(value));}else{
			this.vars[encodeURIComponent(name)] = Array(encodeURIComponent(value), true)}
	},
	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]);}
		}
	},
	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);}
	},
	runResponse: function() {eval(this.response)},
	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(){self.readyStateChange()};
				this.xmlhttp.send(this.URLString);
			}
		}
	},
	readyStateChange:function(){
		switch (this.xmlhttp.readyState) {
			case 1:	this.onLoading();break;
			case 2:	this.onLoaded();break;
			case 3:	this.onInteractive();break;
			case 4:	this.response = this.xmlhttp.responseText;
					this.responseXML = this.xmlhttp.responseXML;
					this.responseStatus[0] = this.xmlhttp.status;
					this.responseStatus[1] = this.xmlhttp.statusText;
					if(this.execute){this.runResponse();}
					if(this.elementObj){elemTag=this.elementObj.nodeName;elemTag.toLowerCase();
						if (elemTag=='input'||elemTag=='select'||elemTag=='option'||elemTag=='textarea'){
							this.elementObj.value = this.response}
						else{this.elementObj.innerHTML=this.response}
					}
					if(this.responseStatus[0]=='200'){this.onCompletion()}else{this.onError()}
						this.URLString = '';break;
					}
	}
}
function sack(file) {
	this.requestFile = file;
	this.reset();
	this.createAJAX();
}

