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