function ajaxGetRequest() {
	var request;
	try {
   		request = new XMLHttpRequest();
	} catch (e) {
   		try {
     		request = new ActiveXObject("Microsoft.XMLHTTP");
   		} catch (e) {
     		return false;
   		}
 	}
 	return request;
}

function ajaxURL(url, notifyFunc)
{
	var request = ajaxGetRequest();
	request.onreadystatechange =
		function() {
			if (request.readyState == 4)
			{
				if (request.status==200) 
				{				
					if(notifyFunc)
					  notifyFunc(request);
				}
				else if (request.status==401 || request.status==403)
				{
					window.location.pathname = context + "/jsp/error/unauthorised.jsp";
				}
				else if (request.status==404)
				{
					window.location.pathname = context + "/jsp/error/missing.jsp";
				}
				else 
				{
					window.location.pathname = context + "/jsp/error/error.jsp";
				}
			}
		};
	request.open("POST", url, true);
	request.setRequestHeader("Content-length", 0);
	request.send(null);
}

function ajaxLoadURL(url, notifyFunc, failFunc)
{
	var request = ajaxGetRequest();
	request.onreadystatechange =
		function() {
			if (request.readyState == 4)
			{
				if (request.status==200) 
				{				
					if(notifyFunc)
					  eval(notifyFunc);
				} 
				else if (request.status==409) 
				{
					if(failFunc) 
					{
	                                    var error = request.responseText;
	                                    error = error.substring(error.indexOf("[error]") + 7, error.indexOf("[/error]"));
	                                    eval(failFunc.replace("%1", "\"" + error + "\""));
					}
				}
				else if (request.status==401 || request.status==403)
				{
					window.location.pathname = context + "/jsp/error/unauthorised.jsp";
				}
				else if (request.status==404)
				{
					window.location.pathname = context + "/jsp/error/missing.jsp";
				}
				else 
				{
					window.location.pathname = context + "/jsp/error/error.jsp";
				}
			}
		};
	request.open("POST", url, true);
	request.setRequestHeader("Content-length", 0);
	request.send(null);
}

function ajaxLoadURLIntoDIV(div,url,notifyFunc, failFunc) {
	var divelement = document.getElementById(div);
	if (!divelement) {
		return;
	}
	var request = ajaxGetRequest();
	request.onreadystatechange =
		function() 
		{
			if (request.readyState == 4)
			{
				if (request.status==200) 
				{
					loadHtmlIntoDiv(divelement, request.responseText);
					if(notifyFunc)
					  eval(notifyFunc);
				} 
				else if (request.readyState == 4 && request.status==409) 
				{
					if(failFunc) {
	                                    var error = request.responseText;
	                                    error = error.substring(error.indexOf("[error]") + 7, error.indexOf("[/error]"));
	                                    eval(failFunc.replace("%1", "\"" + error + "\""));
					}
				}
				else if (request.status==401 || request.status==403)
				{
					window.location.pathname = context + "/jsp/error/unauthorised.jsp";
				}
				else if (request.status==404)
				{
					window.location.pathname = context + "/jsp/error/missing.jsp";
				}
				else 
				{
					window.location.pathname = context + "/jsp/error/error.jsp";
				}
			}
		};
	request.open("POST", url, true);
	request.setRequestHeader("Content-length", 0);
	request.send(null);
}
function ajaxLoadURLIntoWindow(div,wdw) {
	var request = ajaxGetRequest();
	request.onreadystatechange =
		function() 
		{
			if (request.readyState == 4)
			{
				if (request.status==200) 
				{
					wdw.document.write(request.responseText);
				}
				else if (request.status==401 || request.status==403)
				{
					window.location.pathname = context + "/jsp/error/unauthorised.jsp";
				}
				else if (request.status==404)
				{
					window.location.pathname = context + "/jsp/error/missing.jsp";
				}
				else 
				{
					window.location.pathname = context + "/jsp/error/error.jsp";
				}
			}
		};
	request.open("POST", url, true);
	request.setRequestHeader("Content-length", 0);
	request.send(null);
}

function ajaxSubmitFormIntoDIV(name,div,url) {
	var divelement = document.getElementById(div);
	if (!divelement) {
		return;
	}
	document.onmouseup = null;
	var request = ajaxGetRequest();
	request.onreadystatechange =
		function() 
		{
			if (request.readyState == 4)
			{
				if (request.status==200) 
				{
					loadHtmlIntoDiv(divelement, request.responseText);
				}
				else if (request.status==401 || request.status==403)
				{
					window.location.pathname = context + "/jsp/error/unauthorised.jsp";
				}
				else if (request.status==404)
				{
					window.location.pathname = context + "/jsp/error/missing.jsp";
				}
				else 
				{
					window.location.pathname = context + "/jsp/error/error.jsp";
				}
			}
		};
	request.open("POST", url, true);
	request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	var params = ajaxGetFormValues(name);
	request.setRequestHeader("Content-length", params.length);
	request.send(params);
}

function ajaxSubmitFormAndValidate(name,url,func1,func2) {
	document.onmouseup = null;
	var request = ajaxGetRequest();
	request.onreadystatechange =
		function() {
			if (request.readyState == 4)
			{
				if (request.status==200) 
				{
					if(func1) 
					{
					  eval(func1);
					}
				} 
				else if (request.status==409) 
				{
					if(func2) {
					  eval(func2);
					}
				}
				else if (request.status==401 || request.status==403)
				{
					window.location.pathname = context + "/jsp/error/unauthorised.jsp";
				}
				else if (request.status==404)
				{
					window.location.pathname = context + "/jsp/error/missing.jsp";
				}
				else 
				{
					window.location.pathname = context + "/jsp/error/error.jsp";
				}
			}
		};
	request.open("POST", url, true);
	request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	var params = ajaxGetFormValues(name);
	request.setRequestHeader("Content-length", params.length);
	request.send(params);
}

function ajaxSubmitParametersIntoFunc(params,url,notifyFunc, preLoadFunc) 
{
	var request = ajaxGetRequest();
	
	request.onreadystatechange =
		function() 
		{
			if (request.readyState == 4 )
			{
				if (request.status==200) 
				{
					if (preLoadFunc);
					  eval(preLoadFunc);
					  
					if(notifyFunc)
					  notifyFunc(request.responseText);
				}
				else if (request.status==401 || request.status==403)
				{
					window.location.pathname = context + "/jsp/error/unauthorised.jsp";
				}
				else if (request.status==404)
				{
					window.location.pathname = context + "/jsp/error/missing.jsp";
				}
				else 
				{
					window.location.pathname = context + "/jsp/error/error.jsp";
				}
			}
		};
	request.open("POST", url, true);
	request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	request.setRequestHeader("Content-length", params.length);
	request.send(params);
}

function ajaxSubmitParametersIntoDIV(params,div,url,notifyFunc, preLoadFunc) {
	var divelement = document.getElementById(div);
	if (!divelement) {
		return;
	}
	var request = ajaxGetRequest();
	request.onreadystatechange =
		function() 
		{
			if (request.readyState == 4 )
			{
				if (request.status==200) 
				{
					if (preLoadFunc);
					  eval(preLoadFunc);
					  
					loadHtmlIntoDiv(divelement, request.responseText);
					
					if(notifyFunc)
					  eval(notifyFunc);
				}
				else if (request.status==401 || request.status==403)
				{
					window.location.pathname = context + "/jsp/error/unauthorised.jsp";
				}
				else if (request.status==404)
				{
					window.location.pathname = context + "/jsp/error/missing.jsp";
				}
				else 
				{
					window.location.pathname = context + "/jsp/error/error.jsp";
				}
			}
		};
	request.open("POST", url, true);
	request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	request.setRequestHeader("Content-length", params.length);
	request.send(params);
}

function ajaxSubmitParameters(params,url,notifyFunc) {
	var request = ajaxGetRequest();
	request.onreadystatechange =
		function() {
			if (request.readyState == 4)
			{
				if (request.status==200) 
				{
					if(notifyFunc)
				  		eval(notifyFunc);
				}
				else if (request.status==401 || request.status==403)
				{
					window.location.pathname = context + "/jsp/error/unauthorised.jsp";
				}
				else if (request.status==404)
				{
					window.location.pathname = context + "/jsp/error/missing.jsp";
				}
				else 
				{
					window.location.pathname = context + "/jsp/error/error.jsp";
				}
			}
		};
	request.open("POST", url, true);
	request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	request.setRequestHeader("Content-length", params.length);
	request.send(params);
}

function ajaxSubmitFormAndReload(name,url) {
	var request = ajaxGetRequest();
	request.onreadystatechange =
		function() 
		{
			if (request.readyState == 4)
			{
				if (request.status==200) 
				{
					window.location.reload();
				}
				else if (request.status==401 || request.status==403)
				{
					window.location.pathname = context + "/jsp/error/unauthorised.jsp";
				}
				else if (request.status==404)
				{
					window.location.pathname = context + "/jsp/error/missing.jsp";
				}
				else 
				{
					window.location.pathname = context + "/jsp/error/error.jsp";
				}
			}
		};
	request.open("POST", url, true);
	request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	var params = ajaxGetFormValues(name);
	request.setRequestHeader("Content-length", params.length);
	request.send(params);
}

function ajaxGetFormValues(name,attr,value)
{
  	var frm = document.getElementById(name);
	var params = "";
	var delimiter = "";
        
	for(var i = 0;i < frm.elements.length;i++) {
    // IE breaks if this isn't here
    if(frm.elements[i].id == "browserObject")
      continue;
  
		if (attr && value && (frm.elements[i].getAttribute(attr) == null || frm.elements[i].getAttribute(attr).indexOf(value) == -1)) {
			continue;
		}
     
		switch(frm.elements[i].type) {
		
			case "hidden":
			case "password":
			case "text":				
			case "textarea":				
				params = params + delimiter + frm.elements[i].name + "=" + URLencode(frm.elements[i].value);
				delimiter = "&";
			break;
			case "select-one":
				if (frm.elements[i].selectedIndex>-1)
				{	params = params + delimiter + frm.elements[i].name + "=" + URLencode(frm.elements[i].options[frm.elements[i].selectedIndex].value);
					delimiter = "&";
				}
			break;
			case "select-multiple":
				if (frm.elements[i].selected == true) {
					params = params + delimiter + frm.elements[i].name + "=" + URLencode(frm.elements[i].value);
					delimiter = "&";
				} else {
					for (var j = 0; j < frm.elements[i].length; j++) {
						if (frm.elements[i][j].selected == true) {
							params = params + delimiter + frm.elements[i].name + "=" + URLencode(frm.elements[i][j].value);
							delimiter = "&";
						}
					}
				}
				delimiter = "&";
			break;
			case "radio":
			case "checkbox":
				if (frm.elements[i].checked == true) {
					params = params + delimiter + frm.elements[i].name + "=" + URLencode(frm.elements[i].value);
					delimiter = "&";
				} else {
					for (var j = 0; j < frm.elements[i].length; j++) {
						if (frm.elements[i].checked[j] == true) {
							params = params + delimiter + frm.elements[i].name + "=" + URLencode(frm.elements[i].value[j]);
							delimiter = "&";
						}
					}
				}
			break;
		}
	}

	return params;
}

function loadHtmlIntoDiv(div, html)
{
	//Let's try just setting the innerHTML
	try
	{
		div.innerHTML = html;
		return;
	}
	catch(ex)
	{
		//Div has been loaded and doesn't like the content of the html
		//Need to create a new div and swap it for existing div
		var newDiv;
		
		if (div.tagName)
			newDiv = document.createElement(div.tagName);
		else
			newDiv = document.createElement("div");
			
		//Replicate existing div and fill it with the html
		newDiv.innerHTML = div.outerHTML;
		newDiv = newDiv.childNodes[0];
		
		newDiv.innerHTML = html;
		
		//Swap newDiv for existing div
		var parent = div.parentElement;
		
		var preElements = new Array();
		var postElements = new Array();
		var flag = false;
		
		for(var z = 0; z < parent.childNodes.length; z++)
		{
			if (parent.childNodes[z] == div)
			{
				flag = true;
				continue;
			}
			
			if (flag)
			{
				postElements[postElements.length] = parent.childNodes[z];
			}
			else
			{
				preElements[preElements.length] = parent.childNodes[z];
			}
		}
		
		for(var z = parent.childNodes.length - 1; z >= 0; z--)
			parent.removeChild(parent.childNodes[z]);

		for(var z = 0; z < preElements.length; z++)
			parent.appendChild(preElements[z]);
		
		parent.appendChild(newDiv);
		
		for(var z = 0; z < postElements.length; z++)
			parent.appendChild(postElements[z]);			
	}
}
 
