var ajaxStateChangeFunction;
var ajaxXMLHttp = null;

/* 
Creates the XML request object.
*/
function ajaxCreateXMLHttpRequest() {
	
    if (window.ActiveXObject) {
        ajaxXMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
    } 
    else if (window.XMLHttpRequest) {
        ajaxXMLHttp = new XMLHttpRequest();
    }
}

/*
Handles the response from the Transfer Handler.
*/
function ajaxHandleStateChange() {

	//alert("handleStateChange:ajaxXMLHttp.readyState:" + ajaxXMLHttp.readyState);
    if(ajaxXMLHttp.readyState == 4) {

        if(ajaxXMLHttp.status == 200) {
			ajaxStateChangeFunction();
        }
        
    }
}

/*
Sends a ajax request to the given URL.
*/
function ajaxSendAjaxRequest(ajaxDestinationURL, stateChangeFunctionName) {
	
	// Set state change function
	ajaxStateChangeFunction = stateChangeFunctionName;
	//alert("ajaxSendAjaxRequest:ajaxStateChangeFunction:" + ajaxStateChangeFunction);
	
	// Create the http xml request object.
    ajaxCreateXMLHttpRequest();
    //alert("ajaxSendAjaxRequest:XML request created:ajaxXMLHttp="+ajaxXMLHttp);
    
    ajaxXMLHttp.onreadystatechange = ajaxHandleStateChange;
    
    // Add TS to prevent caching.
	if (ajaxDestinationURL.indexOf("?") < 0) {
		ajaxDestinationURL = ajaxDestinationURL + "?cachingTimeStamp=" + new Date().getTime();
	} else {
		ajaxDestinationURL = ajaxDestinationURL + "&cachingTimeStamp=" + new Date().getTime();
	}
	
    //alert("ajaxSendAjaxRequest:Send to Dest:"+ajaxDestinationURL);
    ajaxXMLHttp.open("GET", ajaxDestinationURL, true);
    ajaxXMLHttp.send(null);
    
}

/*
Creates a new form using a xml document and adds to the existing body element.
*/
function createForm(document) {

    // Create new form.
    var newForm = document.createElement("form");
    //alert("createForm:newForm=" + newForm);
    
    // Get the current body element.
    var currentBody = document.getElementsByTagName("body")[0];
    
    // Add form to body.
    currentBody.appendChild(newForm);
    newForm.method="POST";
    
    return newForm;
}

/*
Turns any parameters included in the XML into hidden fields on the passed in form object.
*/
function createHiddenFields(documentObj, form, parameters) {

    //alert("createHiddenFields:parameters.childNodes.length=" + parameters.childNodes.length);
    
    // Add each element as a hiddend field to the form.
    for(var i = 0; i < parameters.childNodes.length; i++) {
    
        var lField = documentObj.createElement("input");
        //alert("createHiddenFields:lField=" + lField);
        
        lField.setAttribute("type", "hidden");
        form.appendChild(lField);
        
        var lName = parameters.childNodes[i].tagName;
        //alert("createHiddenFields:lName=" + lName);
        
        var lValue = parameters.childNodes[i].childNodes[0].nodeValue;
        //alert("createHiddenFields:lValue=" + lValue);
        
        lField.setAttribute("name", lName);
        lField.setAttribute("value", lValue);
    }
}

/*
Turns all parameters included in the XML into a request parameter string.
*/
function createParameterString(parameters) {

	var parameterString = "";
    //alert("createHiddenFields:parameters.childNodes.length=" + parameters.childNodes.length);
    
    // Add each element as a hiddend field to the form.
    for(var i = 0; i < parameters.childNodes.length; i++) {
    
        var lName = parameters.childNodes[i].tagName;
        //alert("createHiddenFields:lName=" + lName);
        
        var lValue = getNodeValue(parameters.childNodes[i]);
        //alert("createHiddenFields:lValue=" + lValue);
        
        if (parameterString != "") {
        	parameterString = parameterString + "&";
        }
        
        parameterString = parameterString + lName + "=" + lValue;
    }
    
    return parameterString;
}

/*
Retrieves a node parameter, handling issues where certain browsers break element values into individual arrays.
*/
function getNodeValue(node)
{
	var lResult = "";
	
	for (var lIndex=0; lIndex<node.childNodes.length; lIndex++)
	{
		lResult += node.childNodes[lIndex].nodeValue;
	}
	
	return lResult;
}
