﻿// holds an instance of XMLHttpRequest
var xmlHttp = createXmlHttpRequestObject();
// holds the remote server address
var serverAddress = "/include/ajax.php";
// when set to true, display detailed error messages
var showErrors = true;
// initialize the validation requests cache
var cache = new Array();
// creates an XMLHttpRequest instance
function createXmlHttpRequestObject(){
    // will store the reference to the XMLHttpRequest object
    var xmlHttp;
    // this should work for all browsers except IE6 and older
    try{
        // try to create XMLHttpRequest object
        xmlHttp = new XMLHttpRequest();
    }
    catch(e){
        // assume IE6 or older
        var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
                                        "MSXML2.XMLHTTP.5.0",
                                        "MSXML2.XMLHTTP.4.0",
                                        "MSXML2.XMLHTTP.3.0",
                                        "MSXML2.XMLHTTP",
                                        "Microsoft.XMLHTTP");
        // try every id until one works
        for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++){
            try{
                // try to create XMLHttpRequest object
                xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
            }
            catch (e) {} // ignore potential error
            }
        }
    // return the created object or display an error message
    if (!xmlHttp)
        displayError("Error creating the XMLHttpRequest object.");
    else
        return xmlHttp;
}

// function that displays an error message
function displayError($message){
    // ignore errors if showErrors is false
    if (showErrors){
        // turn error displaying Off
        //showErrors = false;
        // display error message
        alert("Error encountered: \n" + $message);
        // retry validation after 10 seconds
        //setTimeout("validate();", 10000);
    }
}

// the function handles the validation for any form field
function ajaxRequest(type, action, params){
    // only continue if xmlHttp isn't void
    if (xmlHttp){
        // if we received non-null parameters, we add them to cache in the
        // form of the query string to be sent to the server for validation
        if(type){
            if (params != "")
		        params = "type=" + type + "&action=" + action + "&" + params;
            
            random = Math.floor(Math.random()*1000000);
	        params += "&ts=" + random;
    	    
            // add the values to the queue
            cache.push(params);
        }
        // try to connect to the server
        try{
            // continue only if the XMLHttpRequest object isn't busy
            // and the cache is not empty
            if ((xmlHttp.readyState == 4 || xmlHttp.readyState == 0) && cache.length > 0){
                // get a new set of parameters from the cache
                var cacheEntry = cache.shift();
                // make a server request to validate the extracted data
                xmlHttp.open("POST", serverAddress, true);
                xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                xmlHttp.onreadystatechange = handleRequestStateChange;
                xmlHttp.send(cacheEntry);
            }
        }
        catch (e){
            // display an error when failing to connect to the server
            displayError("ajaxRequest:" + e.toString());
        }
    }
}

// function that handles the HTTP response
function handleRequestStateChange(){
    // when readyState is 4, we read the server response
    if (xmlHttp.readyState == 4){
        // continue only if HTTP status is "OK"
        if (xmlHttp.status == 200){
            try{
                // read the response from the server
                readResponse();
            }
            catch(e){
                // display error message
                displayError("handleRequestStateChange1:" + e.toString());
            }
        }
        else{
            // display error message
            displayError("handleRequestStateChange2:" + xmlHttp.statusText);
        }
    }
}

// read server's response
function readResponse(){
    // retrieve the server's response
    var response = xmlHttp.responseText;
    // server error?
    
    if (response.indexOf("||") != -1) {
	    var el = response.split("||");
		var code = el[0];
		
		if (code == "OK") {
			//	OK response from server, handle it!
            
			var command = el[1];
			if (command == "write") {
				//	Adds html to a DOM element
				var documentId = el[2];
				var elementId = el[3];
				var elementHTML = el[4];
				if(documentId == "parent")
					var element = parent.document.getElementById(elementId);
				else 
					var element = document.getElementById(elementId);
				if (!element)
					displayError("ajax: Server tried to write unknown element: " + elementId);
				else {
					//	Load the response into a div and display it
					element.innerHTML = element.innerHTML + "<br />" + elementHTML;
					element.style.display = "inline";
				}
			} else if (command == "overview") {
				//	Write to a DOM element
				var elementId = el[2];
				var elementHTML = el[3];
				var element = document.getElementById(elementId);
				
				if (!element)
					displayError("ajax: Server tried to write unknown element: " + elementId);
				else {
					//	Load the response into a div and display it
					element.innerHTML = elementHTML;
				}
			} else if (command == "messageid") {
				var functionName = el[2];
				var id = el[3];
				var message = el[4];
				
				eval("" + functionName +"(" + id + ",'" + message + "')");
		    } else if (command == "redirect") {
				var pageUrl = el[2];
				
				location.href = pageUrl;
			} else if (command == "call") {

				//	Call a Javascript function
				var functionName = el[2];
				if (window[functionName]) {

					//	Evaluate the function name and arguments
					var evalText = functionName + "(";
					for (i=3;i<el.length;i++) {
						evalText += "'" + escape(el[i]) + "'";
						if (i != el.length-1) {
							evalText += ",";
						}
					}
					evalText += ")";
					eval(evalText);
				} else {
					//	Function not found
					displayError("ajax: Server called unknown function: " + functionName);
				}

				//alert("call: " + evalText);
			} else if (command == "eval") {
				
				//Evaluate something
				var evalText = el[2];
				eval(evalText);
			} else {
				displayError("ajax: Server issued unknown command: " + command);
			}
        }
    }
    // call validate() again, in case there are values left in the cache
    setTimeout("ajaxRequest();", 500);
}