/**
 * 
 *
 */
function AjaxRequest(url) {

	// Private objects
	var xmlHttpRequest = createXMLHttpRequest();	
	var requestURL = url;
	var queryString = null;
	var method = "GET";
	var preRequestFunction = null;
	var responseHandlerFunction = null;
	var textResponseHandlerFunction = null;
	var postRequestFunction = null;
	
	this.getXMLHttpRequest = function() {
		return xmlHttpRequest;
	}
	
	this.setPreRequestFunction = function(func) {
		preRequestFunction = func;
	}
	
	this.setResponseHandlerFunction = function(func) {
		responseHandlerFunction = func;
	}
	
	this.setTextResponseHandlerFunction = function(func) {
		textResponseHandlerFunction = func;
	}
	
	this.setPostRequestFunction = function(func) {
		postRequestFunction = func;
	}
	
	this.setMethod = function(met) {
		method = met.toUpperCase();
	}
	
	this.setUsePOSTMethod = function() {
		method = "POST";
	}
	
	this.setUseGETMethod = function() {
		method = "GET";
	}
	
	this.setQueryString = function(qs) {
		queryString = qs;
	}
	
	this.getQueryString = function() {
		return queryString;
	}
	
	this.addForm = function(form) {
		var qs = createQueryString(form.elements);
		appendQueryString(qs);
	}
	
	this.addFormById = function(formId) {
		var form = document.getElementById(formId);
		addForm(form);
	}
	
	this.addParameter = function(name, value) {
		var qs = name + "=" + value;
		appendQueryString(qs);
	}
	
	this.addFormFieldByName = function() {
		var elementName = null;
		var elements = null;
		var qs = null;
		for (var i = 0; i < arguments.length; i++) {
			elementName = arguments[i];
			elements = document.getElementsByName(elementName);
			qs = createQueryString(elements);
			appendQueryString(qs);
		}
	}
	
	this.addFormFieldById = function() {
		var element = null;
		var elements = new Array(arguments.length);
		for (var i = 0; i < arguments.length; i++) {
			element = document.getElementById(arguments[i]);
			if (element != null) {
				elements[i] = element;
			}
		}
		qs = createQueryString(elements);
		appendQueryString(qs);
	}
	
	this.send = function() {
		if (preRequestFunction) {
			preRequestFunction(this);
		}
		
		var thisObj = this;
		xmlHttpRequest.onreadystatechange = function() {
			handleResponse(thisObj);
		};
		
		if (method.toUpperCase() == "GET") {
			if (queryString != null && queryString.length > 0) {
				if (requestURL.indexOf("?") != -1) {
					requestURL = requestURL + "&" + queryString;
				} else {
					requestURL = requestURL + "?" + queryString;
				}
			}
			xmlHttpRequest.open(method, encodeURI(requestURL), true);
			xmlHttpRequest.send(null);
		} else {
			xmlHttpRequest.open(method, encodeURI(requestURL), true);
			xmlHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			xmlHttpRequest.send(queryString);
		}
	}
	
	appendQueryString = function(str) {
		if (queryString != null && queryString.length > 0) {
			queryString = queryString + "&" + str;
		} else {
			queryString = str;
		}
	}
	
	createQueryString = function(elements) {
		var tempQueryString = "";
		var temp = "";
		var name = null;
		var formElement = null;
		for (var i = 0; i < elements.length; i++) {
			formElement = elements[i];
			name = formElement.getAttribute("name");

			if (formElement.tagName.toLowerCase() == "input") {
				if ((formElement.type.toLowerCase() == "radio"
					|| formElement.type.toLowerCase() == "checkbox")
					&& (formElement.checked)) {
					temp = name + "=" + formElement.value;
				} else if (formElement.type.toLowerCase() != "submit"
							&& formElement.type.toLowerCase() != "button"
							&& formElement.type.toLowerCase() != "reset") {
					temp = name + "=" + formElement.value;
				}
			} else if (formElement.tagName.toLowerCase() == "textarea") {
				temp = name + "=" + formElement.value;
			} else if (formElement.tagName.toLowerCase() == "select") {
				var options = formElement.options;
				var optionsTempQS = "";
				for (var j = 0; j < options.length; j++) {
					if (options[j].selected) {
						if (optionsTempQS.length > 0) {
							optionsTempQS = optionsTempQS + "&" + name + "=" + options[j].value;
						} else {
							optionsTempQS = name + "=" + options[j].value;
						}
					}
				}
				temp = optionsTempQS;
			}

			if (temp != null && temp.length > 0) {
				if (tempQueryString != null && tempQueryString.length > 0) {
					tempQueryString = tempQueryString + "&" + temp;
				} else {
					tempQueryString = temp;
				}
			}
		}
		return tempQueryString;
	}
	
	handleResponse = function(ajaxRequest) {
		var req = ajaxRequest.getXMLHttpRequest();
		// readyState 4 means 'complete'
		if (req.readyState != 4) {
			return false;
		}
		if (req.status == 200) {
			if (responseHandlerFunction) {
				responseHandlerFunction(req.responseXML);
			}
			if (textResponseHandlerFunction) {
				textResponseHandlerFunction(req.responseText);
			}
			if (postRequestFunction) {
				postRequestFunction(ajaxRequest);
			}
			return true;
		} else {
			return false;
		}
	}

}

/**
 * Creates a new XMLHttpRequest object in any browser that supports it.
 */
function createXMLHttpRequest() {
	var request = false;

	if (window.XMLHttpRequest) {
		// Create XMLHttpRequest object in non-Microsoft browsers
		request = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		// Create XMLHttpRequest via MS ActiveX
		try {
			// Try to create XMLHttpRequest in later versions
			// of Internet Explorer
			request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (ex1) {
			// Failed to create required ActiveXObject
			try {
				// Try version supported by older versions
				// of Internet Explorer
				request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (ex2) {
				// Unable to create an XMLHttpRequest with ActiveX
			}
		}
	}
	return request;
}