/* 
 * Ajax support - based on standard patterns in the "Ajax In Action" book.
 */
function Ajax() {
    this.UNINITIALIZED = 0;
    this.SENDING       = 1;
    this.SENT          = 2;
    this.LOADING       = 3;
    this.COMPLETE      = 4;
    this.RESULT_OK     = 200;
    this.TYPES = [
	    "MSXML3.XMLHTTP", "MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", 
	    "Microsoft.XMLHTTP", "MSXML.XMLHTTP"
	];	
    this.req = null;
    this.responseFunction = null;
    this.debug = false;
    this.errors = null;
    this.result = null;
    this.errorsDetected = false;
    this.url = null;
    this.parameters = null;
    this.returnedObject = null;
    this.type = null; 
}

Ajax.prototype.getType = function() {
	if (this.type == null) {
	    var o = null;
	    for (var i = 0; i < this.TYPES.length; i++) {
		    try {
			    o = new ActiveXObject(this.TYPES[i]);
			    this.type = this.TYPES[i];
			    break;
		    }
		    catch (ex) {};
		}
	}
	return this.type;
}

Ajax.prototype.getXMLHttpRequest = function() {
    if (window.XMLHttpRequest) {
        this.req = new XMLHttpRequest();
        this.type = "XMLHttpRequest";
    }
    else if (window.ActiveXObject) {
        try {
            this.req = new ActiveXObject(getXmlHttpType());
        }
        catch (e) {
            this.req = null;
        }
    }
    return this.req;
}

Ajax.prototype.post = function() {
    this.req = this.getXMLHttpRequest();
    this.req.onreadystatechange = processAjaxStateChange;
    this.req.open("POST",this.url,true);
    this.req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    this.req.send(this.parameters);
}

function AjaxParameters() {
    this.list = null;
}

AjaxParameters.prototype.add = function(name,value) {
    if (this.list == null) {
        this.list = name + "=" + value;
    }
    else {
        this.list = this.list + "&" + name + "=" + value;
    }
}

AjaxParameters.prototype.addFromForm = function(formName) {
    var formElements = document.forms[formName].elements;
    for (var i = formElements.length-1; i>=0; i--) {
        var field = formElements[i];
        var name = field.name;
        if (name == "") {
            name = field.id;
        }
        if (field.type == "checkbox") {
            this.add(name,Boolean(field.checked).toString());
        }
        else {
            this.add(name,field.value);
        }
    }
}

AjaxParameters.prototype.reset = function() {
    this.list = null;
}

AjaxParameters.prototype.toString = function() {
    return this.list;
}

var ajax = new Ajax();

function retrieveURL(url,parameters,responseFunction) {
    ajax.url = url;
    ajax.parameters = parameters;
    ajax.responseFunction = responseFunction;
    try {
        ajax.post();
    }
    catch (e) {
        alert("Problem communicating with server.\n" + e);
    }
}

function retrieveURLWithForm(url,formName,responseFunction) {
    var parameters = new AjaxParameters();
    parameters.addFromForm(formName);
    retrieveURL(url,parameters.toString(),responseFunction);
}

function processAjaxStateChange() {
    if (ajax.req.readyState == ajax.COMPLETE) {
        var retry = false;
        if (ajax.req.status == ajax.RESULT_OK) {
           if (ajax.responseFunction) {
               ajax.responseFunction(ajax.req);
           }
        }
        else {
            switch(ajax.req.status) {
				case 12029:
				case 12030:
				case 12031:
				case 12152:
				case 12159:
				    retry = true;   
                    break;
                default:
                    alert("Server error.\n\n" 
                        + "Type : " + ajax.type + "\n"
                        + "Status : " + ajax.req.status + "\n"
                        + "Message : " + ajax.req.statusText + "\n"
                        + "Contents : " + ajax.req.responseText);                   
            }
        }
        ajax.req.close;
        ajax.req = null;
        if (retry) {
            window.setTimeout(ajaxRetry,10);
        }
    }
}

function ajaxRetry() {
    retrieveURL(ajax.url,ajax.parameters,ajax.responseFunction);
}

function ajaxResponseChecks(response) {
   var text = response.responseText;
   try {
       ajax.returnedObject = eval("(" + text + ")");
       if (ajax.debug) {
           debugger;
	   }  
	   if (ajax.returnedObject.errorMessage != undefined) {
	       ajax.errorsDetected = true;
	       ajax.errors = ajax.returnedObject.errorMessage;
	   }
	   else {
	       ajax.errorsDetected = false;
	       ajax.errors = null;
	   }
	   ajax.result = ajax.returnedObject.ajaxCallResult;
   }
   catch (e) {
       alert("AJAX Error : Status = " + ajax.req.status);
   }
}
