/*
  AJAX Functions
		VERSION : 1.0
		DATE : 12 june 2007
		AUTHOR : David
		COMMENTS :   
*/



function AJAX( 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 && typeof XMLHttpRequest!='undefined') {
					if (window.XMLHttpRequest) {
						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();
}




			
			
			