function createXHR() {
	if(typeof XMLHttpRequest != "undefined") {
		return new XMLHttpRequest();
	}
	else {
		// IE - we prefer latest version for stability & security, and gradually fallback if unavailable
		var aVersions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
		
		for(var i=0; i < aVersions.length; i++) {
			try {
				var oXHR = new ActiveXObject(aVersions[i]);
				return oXHR;
			}
			catch(error) {
				// do nothing, try next one
			}
		}
	}
	throw new Error("XMLHttp object could not be created.");
}

function ajaxRequestGet(url, divId, preAppendText) {
	ajaxRequest(url, divId, preAppendText, "GET");
}

function ajaxRequestPost(url, divId, preAppendText) {
	ajaxRequest(url, divId, preAppendText, "POST");
}

function ajaxRequest(url, divId, preAppendText, method)
{
	var post = (method == "POST");
	var queryCheck = url.indexOf("?");
	var ajaxUrl;
	var ajaxQueryParams;
	
	if(queryCheck > 0) {
		ajaxUrl = url.substring(0, queryCheck);
		ajaxQueryParams = url.substring(queryCheck+1);
	}
	else {
		ajaxUrl = url;
	}
	
	var xmlHttp = createXHR();
    
  	xmlHttp.onreadystatechange=function()
    {
    if(xmlHttp.readyState==4)
      { 
      	var responseText = xmlHttp.responseText;
      	
      	if(preAppendText != null) {
      		responseText = preAppendText + responseText;       		
      	} 
      		
      	document.getElementById(divId).innerHTML = responseText;
      }
    }

  	if(!post) {
  		ajaxUrl += "?" + ajaxQueryParams;
  	}
  	
  	xmlHttp.open(method, ajaxUrl, true);
	xmlHttp.setRequestHeader("Connection", "close");
	
	if(post) {
		xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlHttp.setRequestHeader("Content-length", ajaxQueryParams.length);
		xmlHttp.send(ajaxQueryParams);
	}
	else {
		xmlHttp.send(null);
	}
} 

function ajaxFormSubmit(formId) {

  document.body.style.cursor = 'wait';

  var form = document.getElementById(formId);
  var url = form.action;
  var queryCheck = url.indexOf("?");
  
  var AJAX_INDICATOR = "ajaxsubmit=y";
  var indicatorPrefix;

  var ajaxUrl;
  var ajaxQueryParams = "";
  
  if(queryCheck > 0) {
	indicatorPrefix = "&";
	ajaxUrl = url.substring(0, queryCheck);
    ajaxQueryParams = url.substring(queryCheck+1) + indicatorPrefix;
  }
  else {
	indicatorPrefix = "?";
	ajaxUrl = url;
  }

  ajaxQueryParams += AJAX_INDICATOR;

	var xmlHttp = createXHR();

  	xmlHttp.onreadystatechange=function()
    {
    if(xmlHttp.readyState==4)
      { 
      	var responseText = xmlHttp.responseText;
      	if(responseText != '' && responseText != null) {
      	 displayErrorMessages(responseText);
      	}
      	else {
      	 form.action = ajaxUrl + indicatorPrefix + AJAX_INDICATOR;
      	 form.submit();
      	}
      }
    }

 	ajaxQueryParams += getFormAsString(formId);

	xmlHttp.open("POST", ajaxUrl, true);
	xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xmlHttp.setRequestHeader("Content-length", ajaxQueryParams.length);
	xmlHttp.setRequestHeader("Connection", "close");
 	xmlHttp.send(ajaxQueryParams);  
}

function getFormAsString(formName){
        
  //Setup the return String
  returnString ="";
        
  //Get the form values
  formElements=document.forms[formName].elements;
        
  //loop through the array, building up the url
  //in the format '/strutsaction.do&name=value'
 
  //for(var i=formElements.length-1;i>=0; --i ){
  for(var i = 0;i < formElements.length;i++) { 
        //we escape (encode) each value
        var element = formElements[i];
        var elementName = element.name;
        if(elementName == '') elementName = element.id;
        if(elementName == '' || elementName == null) continue;
        var elementValue;
        switch(element.type) { 
					case "text":  
					case "hidden":  
					case "password":  
					case "textarea":
						elementValue = element.value; 
						returnString+="&"+encodeURIComponent(elementName)+"="+encodeURIComponent(elementValue);
						break;
					case "checkbox":  
					case "radio":  
						if(element.checked) {
							elementValue = element.value;
							returnString+="&"+encodeURIComponent(elementName)+"="+encodeURIComponent(elementValue);
						}
						break;
					case "select-one":
						elementValue = element.options[element.selectedIndex].value;
						returnString+="&"+encodeURIComponent(elementName)+"="+encodeURIComponent(elementValue);
						break;
        } // switch
	} // for
        
 //return the values
 return returnString; 
}