/* 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);
  
  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"
      
  In the html which you want to perform the ajax call from and recieve to, you need to add a 
  container which will display the data from the ReqFile. You need to give it an id. Ive tested
  it with span and div containers and it seems to work like a charm.
 
  Quick Copy Paste snippets: (example is a simple dynamic title changer)
    
    OnSubmit="DoAjax('frmForm1','path/to/datagenerator.php','divDatacontainer','post')";
    <div id="divDatacontainer" name="divDatacontainer"></div>

    <div id="yourtitle">
      <form id="frmTitleform">
        <a><div id="divDatacontainer" OnClick="ShowTxttitle()">$html[strNewtitle]</span></a>
        <input type="text" id="txtTitle" name="txtTitle" value="" maxlength="50" OnClick="this.value=''" OnBlur="TitleActions()" onkeypress="return noenter()" style="display:none" />
      </form>
    </div>

    
    function ShowTxttitle() {
    // hide the datacontainer, show the textfield
      document.getElementById('txtTitle').style.display='block';
      document.getElementById('txtTitle').focus();
      document.getElementById('divDatacontainer').style.display='none';
    }
    
    function TitleActions() {
    // Call ajax, hide the textfield, show the datacontainer
      DoAjax('frmForm1','lib/storetitle.php','divDatacontainer','post');
      document.getElementById('divDatacontainer').style.display='block';
      document.getElementById('txtTitle').style.display='none';
    }
    
    function noenter() {
    // Prevents form submission if enter is pressed. (IE only...... fark)
      if(window.event && window.event.keyCode == 13){
          document.getElementById('txtTitle').blur();
          return false
        }
    }

  
  */


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>Sending Data...</p>";
  }
  
  function whenLoaded(){
  	var e = document.getElementById(varRepElm); 
  	e.innerHTML = "<p>Data Sent...</p>";
  }
  
  function whenInteractive(){
  	var e = document.getElementById(varRepElm); 
  	e.innerHTML = "<p>getting data...</p>";
  }
  
  function whenCompleted(){
  	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();
}

