/**
 * Author: Younes Bouab Date: 06 - 12- 2008 Support: YBINSF@yahoo.com website:
 * http://www.warbed.com
 * 
 * callAjax: Asynchronous Ajax Call Function
 * 
 * aMethod: Supports "GET" or "POST" aURL: URL to process request (without any
 * Parameters) - ie: "process.jsp" aParameters: parameters seperated by a "&"
 * and without "?" - ie: "paramA=1&paramB=1" aFormObj: document.FormName - ie:
 * document.myForm aResponseLayer: Name of the layer where Response will be
 * loaded - ie: "myLayer"
 * 
 * *Note: Uncomment error alerts below for debugging!
 * 
 */

var ajaxLayer = null;
var ajaxLayerPrefix = "";
var ajaxLayerSuffix = "";
var url = null;
var callBackFunction = "";

function setAjaxLayer(aAjaxLayerPrefix, aAjaxLayerSuffix) {
	ajaxLayerPrefix = aAjaxLayerPrefix;
	ajaxLayerSuffix = aAjaxLayerSuffix;
}

function callAjaxGet(aURL, aAjaxLayer) {
	callAjax("GET", aURL, null, null, aAjaxLayer);
}

function callAjaxGetReturnFunction(aURL, aReturnFunction) {
	callBackFunction=aReturnFunction;
	callAjax("GET", aURL, null, null, "");
}

function callAjaxPost(aURL, aFormObj, aAjaxLayer) {
	callAjax("POST", aURL, null, aFormObj, aAjaxLayer);
}

function callAjax(aMethod, aURL, aParameters, aFormObj, aAjaxLayer) {
	var method = aMethod;
	url = aURL;
	var parameters = aParameters;
	var formObj = aFormObj;
	ajaxLayer = aAjaxLayer;
	var randomnumber = Math.floor(Math.random() * 999999999);

	// Prefix for layer contect
	if (url.indexOf("home.jsp") == -1) {
		ajaxLayerPrefix = "<br>";
	} else {
		ajaxLayerPrefix = "";
	}

	if (url.indexOf("?") == -1) {
		url = url + "?";
	}
	if (parameters == null)
		parameters = "";
	else
		parameters = parameters;
	url = url + parameters + "&r=" + randomnumber;

	// Build Parameters as QS
	var parameters = buildQS(parameters, formObj, method);

	// Mozilla, Safari
	if (window.XMLHttpRequest) {
		httpRequest = new XMLHttpRequest();
		if (httpRequest.overrideMimeType) {
			httpRequest.overrideMimeType("text/html");
		}
	}
	// IE
	else if (window.ActiveXObject) {
		try {
			httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
				alert("Could not create window.ActiveXObject instance: " + e);
				return false;
			}
		}
	}

	// Check if httpRequest was created
	if (httpRequest == null) {
		alert("Could not create XMLHTTP instance");
		return false;
	}

	// Set Response Function
	httpRequest.onreadystatechange = processResponse;

	// GET Method
	if (method == "GET") {
		// alert("Ajax Get "+url+" & display in layer "+aAjaxLayer);
		httpRequest.open("GET", url, true);
		httpRequest.send(null);
	}
	// POST Method
	else if (method == "POST") {
		try {
			// alert("Ajax POST\n"+url+" & display in layer
			// "+aAjaxLayer+"\n"+parameters);
			httpRequest.open("POST", url, true);
			httpRequest.setRequestHeader("Content-type",
					"application/x-www-form-urlencoded");
			httpRequest.setRequestHeader("Content-length", parameters.length);
			httpRequest.setRequestHeader("Connection", "close");
			httpRequest.send(parameters);
		} catch (e) {
			// alert("Error occured while trying to send POST "+e);
		}
	} else {
		alert("Did not find a valid makeRequest method argument!");
		return false;
	}
}

// Build Parameters as QueryString from a Paraemerts String & a Form Object
function buildQS(aParameters, aFormObj, aMethod) {
	var parameters = aParameters;
	var qsStr = "";
	var formObj = aFormObj;
	var method = aMethod;

	if (formObj != null) {
		for ( var i = 0; i < formObj.elements.length; i++) {
			if (formObj.elements[i].tagName == "INPUT"
					|| formObj.elements[i].tagName == "TEXTAREA") {
				if (formObj.elements[i].type == "text"
						|| formObj.elements[i].type == "password"
						|| formObj.elements[i].type == "textarea"
						|| formObj.elements[i].type == "submit"
						|| formObj.elements[i].type == "button") {
					qsStr += formObj.elements[i].name + "="
							+ formObj.elements[i].value + "&";
				}
				if (formObj.elements[i].type == "checkbox") {
					if (formObj.elements[i].checked) {
						qsStr += formObj.elements[i].name + "="
								+ formObj.elements[i].value + "&";
					} else {
						qsStr += formObj.elements[i].name + "=&";
					}
				}
				if (formObj.elements[i].type == "radio") {
					if (formObj.elements[i].checked) {
						qsStr += formObj.elements[i].name + "="
								+ formObj.elements[i].value + "&";
					}
				}
			}
			if (formObj.elements[i].tagName == "SELECT") {
				var sel = formObj.elements[i];
				for ( var j = 0; j < sel.length; j++) {
					if (sel.options[j].selected) {
						qsStr += sel.name + "=" + sel.options[j].value + "&";
					}
				}
			}
		}
	}
	// Correct Parameters Syntax
	if (qsStr.length > 0) {
		qsStr = qsStr.substring(0, qsStr.length - 1);
	}
	if (parameters == null) {
		parameters = "";
	}
	if (parameters.length > 0) {
		if (parameters.substring(0, 1) == "?") {
			parameters = parameters.substring(1, parameters.length);
		}
		if (parameters.substring(parameters.length - 1, parameters.length) == "&") {
			parameters = parameters.substring(0, parameters.length - 1);
		}
	}
	if (parameters.length > 0 && qsStr.length > 0) {
		parameters = parameters + "&" + qsStr;
	} else {
		parameters = parameters + qsStr;
	}
	return parameters;
}

// Default Ajax Response Function
function processResponse() {
	/**
	readyState
	0: not initialized.
	1: connection established.
	2: request received.
	3: answer in process.
	4: finished. 
	**/
	// alert("httpRequest.readyState is "+httpRequest.readyStat);
	if (httpRequest.readyState == 4) {
		//if(httpRequest.status == 200)
		{
			result = httpRequest.responseText;
			if(ajaxLayer!="")
			document.getElementById(ajaxLayer).innerHTML = ajaxLayerPrefix	+ result + ajaxLayerSuffix;
			else 
			return eval(callBackFunction+"('"+result+"')");
		}
		//else
		{
			//alert("Response code returned ("+httpRequest.status+") is not 200!");
		}
	}
}

