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 submitContactForm(sender, goodMessage, badMessage)
{
	document.getElementById('submit_message').innerHTML = "Submitting. Please wait...";
	document.getElementById('submit_message').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.innerHTML = "";  } );
	
			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) 
				{
					//alert(foo + ": " + errors[foo]);
					document.getElementById('error_'+foo).innerHTML = errors[foo];
				}
				document.getElementById('submit_message').innerHTML = badMessage;
				document.getElementById('submit_message').className = "errorbox";
				
			}
			
			//alert(req.responseText);
			//document.getElementById(target).innerHTML = req.responseText;
		}
	});
}