function makeReqObj()
{
	if (window.XMLHttpRequest) return new XMLHttpRequest();
	else return new ActiveXObject("Microsoft.XMLHTTP");
}
function sendRequest(method, url, postdata, callback)
{
	var request = makeReqObj();
	request.open(method, url, true);
	if (method == "post") request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	request.onreadystatechange = function() { try { request.status; } catch (e) { return; } callback(request); };
	request.send(postdata);
	return request;
}

function deserialise(text)
{
	return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
		   text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
		   eval('(' + text + ')');
}

function getPostablePairs(form, additional)
{
	var vals = additional || [];
	var types = ["input", "select", "textarea"];
	for (var typeIndex in types)
	{
		var type = types[typeIndex];
		var inputs = form.getElementsByTagName(type);
		for (var i = 0; i < inputs.length; ++i)
		{
			var inp = inputs[i];
			if (inp.name && (type != "input" || inp.type != "checkbox" && inp.type != "radio" || inp.checked))
				vals.push([inputs[i].name, inputs[i].value]);
		}
	}
	return vals;
}

function getPostString(form, additional)
{
	var vals = additional || [];
	var pairs = getPostablePairs(form);
	for (var i in pairs)
	{
		var pair = pairs[i];
		vals.push(escape(pair[0]) + "=" + escape(pair[1]))
	}
	return vals.join("&");
}


function forAllDescendants(parentNode, f) {
	for (var n = parentNode.firstChild; n; n = n.nextSibling) {
		f(n);
		forAllDescendants(n, f)
	}
}

function killChildrenNodes(obj)
{
	while (obj.firstChild) obj.removeChild(obj.firstChild);
}

function get_previoussibling(n)
{
	var x=n.previousSibling;
	while (x.nodeType!=1)
	{
		x=x.previousSibling;
	}
	return x;
}

function submitContactForm(sender, goodMessage, badMessage, divName)
{

	if (divName == null)
	{
		divName = "submit_message";
	}

	document.getElementById(divName).innerHTML = "Submitting. Please wait...";
	document.getElementById(divName).classname = "pendingbox";

	str = getPostString(sender);

	sendRequest("post", sender.action + "?ajax=1", str, function(req)
	{
		if (req.readyState == 4 && req.status == 200)
		{
			forAllDescendants( sender, function(n)
								{
									if (n.id && n.id.substring(0,6) == "error_")
									{
										n.style.display = "none";
										//get_previoussibling(n).style.backgroundColor = "";
										//n.parentNode.style.backgroundColor="";
										//n.style.backgroundColor = "";
										document.getElementById(n.id.substring(6)).style.borderColor = "";
									}
								} );

			if (req.responseText == "success")
			{
				// form was completed successfully
				sender.innerHTML = goodMessage;
				sender.className = "successbox";

			}
			else
			{
				// display error texts
				errors = deserialise(req.responseText);
				for (foo in errors)
				{
					if (errors[foo])
					{
						if (!document.getElementById('error_'+foo)) alert(foo);
						document.getElementById('error_'+foo).innerHTML = errors[foo];
						document.getElementById('error_'+foo).style.display = "";
						document.getElementById(foo).style.borderColor = "#b13838";
					}
				}
				document.getElementById(divName).innerHTML = badMessage;
				document.getElementById(divName).className = "errorbox";
				//alert('Unable to submit application. Please see form for details.');
			}
		}
	});
}