/* 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 */
 
/* 27-7-2006 Tom:
  The function DoAjax below is a functionised set of
  instructions and functions needed to call the ajax 
  object. I put it all in a function so i could reuse 
  it by simply calling the function and passing some
  variables which need te be different from one occaision
  to the next 
  
  To call the script from html (whether static or generated)
  use: DoAjax(varFormId,varReqFile,varRepElm,varReqMethod);
  eg; OnSubmit="DoAjax('myform','path/to/datagenerator.php','ajaxcontainer','post')";
  
  var explanation:
      varFormId    : Form Id => id name of the form you want to submit.
      varReqFile   : Request File => file called by ajax, the server side file that generates
                     and prints the data you want to display. This is also the file you submit
                     your form variables to.
      varRepelm    : Replacement Element => the element to contain the ReqFile generated data
      varReqMethod : Request Method. => simply use either "post" or "get"
      
  Note: Do not forget to include a div in your form with the id 'sackdata'. this one gets filled
  with the server response is used by function 'whencompleted'.
  Forgetting to include tag like this <div id="sackdata" style="display:none"></div> will result in
  a javascript warning. (nothing serious, but hey... lets get it right)
  
  */


function DoAjax(varFormId,varReqFile,varRepElm,varReqMethod) {
  var ajax = new sack();
  var form = document.getElementById(varFormId);
      	
  for(t=0;t<form.length;t++){
    elmname = form.elements[t].name
    elmval = form.elements[t].value
    ajax.setVar(elmname, elmval)
  }
  
  ajax.requestFile = varReqFile;
  ajax.method  = varReqMethod; // get or post
  ajax.element = varRepElm;
  ajax.onLoading = whenLoading;
  ajax.onLoaded = whenLoaded; 
  ajax.onInteractive = whenInteractive;
  ajax.onCompletion = whenCompleted;
  ajax.runAJAX();	
  
  function whenLoading(){
  	var e = document.getElementById(varRepElm); 
  	e.innerHTML = "<p>Bezig data te versturen...</p>";
  }
  
  function whenLoaded(){
  	var e = document.getElementById(varRepElm); 
  	e.innerHTML = "<p>Data verzonden...</p>";
  }
  
  function whenInteractive(){
  	var e = document.getElementById(varRepElm); 
  	e.innerHTML = "<p>Bezig data te ontvangen...</p>";
  }
  
  function whenCompleted(){
    if (!document.getElementById('sackdata')) alert('You forgot to include a div with id \'sackdata\'\nin your htmlsource. Fix it idiot!\n\nTom')
  	var e = document.getElementById('sackdata'); 
  	if (ajax.responseStatus){
  		var string = "<p>Status Code: " + ajax.responseStatus[0] + "</p><p>Status Message: " + ajax.responseStatus[1] + "</p><p>URLString Sent: " + ajax.URLString + "</p>";
  	} else {
  		var string = "<p>URLString Sent: " + ajax.URLString + "</p>";
  	}
  	e.innerHTML = string;	
  }  
}

   
   
/* 27-7-2006 Tom:
   Below are the lines that need not be edited.
   The stuff above is standard stuff to call ajax */
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();
}

