/* 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 = "GET";
						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;
																	}
															}
														//alert(self.responseStatus[0]);
														if (self.responseStatus[0] == "200")
															{
																self.onCompletion();
							} 
							else
							{
								//self.onCompletion();
								self.onError();
							}

							self.URLString = "";
							/* These lines were added by Alf Magne Kalleland ref. info on the sack home page. It prevents memory leakage in IE */

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

