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) {
    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.style.display = "none";
                    //get_previoussibling(n).style.backgroundColor = "";
                    n.parentNode.style.backgroundColor = "";
                }
            });

            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 = "";
                        //get_previoussibling(document.getElementById('error_'+foo)).style.backgroundColor = "#fff4ee";
                        document.getElementById('error_' + foo).parentNode.style.backgroundColor = "#fff4ee";

                    }
                }
                document.getElementById('submit_message').innerHTML = badMessage;
                document.getElementById('submit_message').className = "errorbox";
                alert('Unable to submit application. Please see form for details.');
            }
        }
    });
}
