/* AJAX INITIALIZATION */
var request = null;

// Gets the response of an ajax request synchronously as a string (request method is optional, POST is default)
function getHttpResponseContent(url, requestMethod) {
	if (! requestMethod) requestMethod = "POST";
	
	var responseContent;
	responseHandler = function() {
		if (request.readyState == 4) {
			if (request.status == 200) {
				responseContent = request.responseText;
			}
		}
	}
	
  	if (requestMethod.toUpperCase() == "POST")
	{
		var query = null;
		var queryIndex = url.indexOf('?');
		if (queryIndex >= 0) {
			query = url.substring(queryIndex + 1);
			url = url.substring(0, queryIndex);
		}
		httpRequest(requestMethod, url, false, responseHandler, query);
	}
	else
	{
		httpRequest(requestMethod, url, false, responseHandler);
	}
	
	return responseContent;
}

// Waits for the response of an ajax request asynchronously and notifies the sender via call backs.
// successFn is called on a 200 HTTP response.
function httpRequestCallback(url, successFn, failureFn) {
	var requestMethod = "POST";
	
	responseHandler = function() {
		if (request.readyState == 4) {
			if (request.status == 200) {
				if (successFn) successFn();
			}
			else {
				if (failureFn) failureFn(request.status);
			}
		}
	}
	
	var query = null;
	var queryIndex = url.indexOf('?');
	if (queryIndex >= 0) {
		query = url.substring(queryIndex + 1);
		url = url.substring(0, queryIndex);
	}
	
	httpRequest("POST", url, true, responseHandler, query);
}

// NOTE: if using synchronous, getHttpResponseContent() is simpler to use.
function httpRequest(reqType, url, asynch, respHandle) {
	try {
		if (window.XMLHttpRequest) {
			request = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			request = new ActiveXObject("Msxml2.XMLHTTP");
			if (!request) {
				request = new ActiveXObject("Microsoft.XMLHTTP");
			}
		}
	}
	catch (e) {
		request = null;
	}
	
	//if neither ActiveXObject was initialized
	if (request) {
		if (reqType.toLowerCase() != "post") {
			initReq(reqType, url, asynch, respHandle);
		} else {
			//the POSTed data
			var args = arguments[4];
			if (args != null && args.length > 0) {
				initReq(reqType, url, asynch, respHandle, args);
			}
		}
	} else {
		alert("Your browser does not support instant saving of data, please click Next to save any data on this page");
	}
}

/* Initialize request obj that is already constructed */
function initReq(reqType, url, bool, respHandle) {
	try {
		request.onreadystatechange=respHandle;
		request.open(reqType, url, bool);
		//if it is a POST, then 5th arg is the POSTed data
		if (reqType.toLowerCase() == "post") {
			request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
			request.send(arguments[4]);
		} else {
			request.send(null);
		}
	} catch(errv) {
		alert("The application cannot contact the server at the moment.\n" +
				"Please try again in a few seconds.\n" +
				"Error message: " + errv.message);
	}
}
	
function getFormValuesAsQueryString(frm, removeViewStateParameter) {
	var queryString="";
	if (frm == null) frm = document.forms[0];
	var numberElements = frm.elements.length;
	for (var i=0; i < numberElements; i++) {
		var name = frm.elements[i].name;
		var value = frm.elements[i].value;
		if (removeViewStateParameter && name == "__VIEWSTATE") {
			continue;
		}
		
		queryString += name + "=" + encodeURIComponent(value);
		if (i < numberElements - 1) {
			queryString += "&";
		}
	}
	return queryString;
}

