var resultContainerId = "rxResult";

function getOptions(container) {
    var options = [];
    var inputs = container.getElementsByTagName("input");
    for (var i = 0; i < inputs.length; i++) {
        var input = inputs.item(i);
        if (input.checked && !input.disabled) {
            options.push(input.value);
        }
    }
    return options;
}

function disableExcept(input, except) {
    var disable = true;
    for (var i = 0; i < except.length; i++) {
        if (input.value == except[i]) {
            disable = false;
            break;
        }
    }
    setInputEnabled(input, !disable);
}

function setInputEnabled(input, enabled) {
    input.disabled = !enabled;
    input.nextSibling.className = (enabled ? "" : "disabled");
}

function rxScheduleUpdateOptions() {
    setTimeout(rxUpdateOptions, 1);
}

function rxUpdateOptions() {
    if (document.getElementById("rx_o_ECMAScript").checked) {
        withEachOption(function (input) { disableExcept(input, ["ECMAScript", "IgnoreCase", "Multiline"]); });
    } else {
        withEachOption(function (input) { setInputEnabled(input, true); });
    }
}

function withEachOption(f) {
    var options = document.getElementById("rxOptions").getElementsByTagName("input");
    for (var i = 0; i < options.length; i++) {
        var option = options[i];
        if (option.type == "checkbox") {
            f(option);
        }
    }
}

function rxReadyStateChange(request) {
    if (request.readyState === 4) {
        // No JSON until GoDaddy deploys .NET 3.5.
        // var rxResponse = request.responseText.parseJSON();

        var rxResponse = request.responseXML;

        var resultContainer = document.getElementById(resultContainerId);

        var loading = document.getElementById("rxLoading");
        if (loading) {
            loading.parentNode.removeChild(loading);
        }

        // Convert the XML response to JSON, since we can't write the
        // object notation directly on shared hosting.
        rxResponse = getJsonItem(rxResponse.firstChild);

        var matches = rxResponse.matches;

        if (matches.length == 0 && rxResponse.errorMessage) {
            resultContainer.appendChild(
                document.createElement("span")).appendChild(
                    document.createTextNode("Error: " +
                                            rxResponse.errorMessage));
        } else {
            resultContainer.appendChild(
                document.createElement("em")).appendChild(
                    document.createTextNode("Found " + matches.length + " match" +
                                            (matches.length == 1 ? "" : "es") +
                                            (matches.length == 0 ? "." : ":")));
        }

        if (matches.length > 0) {
            var ol = resultContainer.appendChild(document.createElement("ol"));
            for (var i = 0; i < matches.length; i++) {
                var match = matches[i];
                var li = ol.appendChild(document.createElement("li"));
                li.appendChild(document.createElement("q")).appendChild(document.createTextNode(match.value));

                if (match.groups.length > 0) {
                    li.appendChild(document.createTextNode(" has " + match.groups.length + " group" + (match.groups.length == 1 ? ":" : "s:")));
                    var olg = li.appendChild(document.createElement("ol"));
                    for (var j = 0; j < match.groups.length; j++) {
                        var lig = olg.appendChild(document.createElement("li"));
                        lig.appendChild(document.createElement("q")).appendChild(document.createTextNode(match.groups[j].value));
                    }
                }
            }

            resultContainer.appendChild(document.createElement("em")).
                appendChild(document.createTextNode("String literals for use in programs:"));

            var dl = resultContainer.appendChild(document.createElement("dl"));
            for (var i = 0; i < rxResponse.strings.length; i++) {
                var string = rxResponse.strings[i];
                dl.appendChild(document.createElement("dt")).
                    appendChild(document.createTextNode(string.language));
                dl.appendChild(document.createElement("dd")).
                    appendChild(document.createElement("code")).
                    appendChild(document.createTextNode(string.value));
            }
        }

        urchinTracker("/execute-rx.ashx");
    }
}

function getJsonArray(el) {
    var a = [];
    var children = el.childNodes;
    for (var i = 0; i < children.length; i++) {
        var child = children[i];
        if (child.nodeName == "item") {
            a.push(getJsonItem(child));
        }
    }
    return a;
}

function getJsonObject(el) {
    var o = {};
    var children = el.childNodes;
    for (var i = 0; i < children.length; i++) {
        var child = children[i];
        o[child.nodeName] = getJsonItem(child);
    }
    return o;
}

function getJsonItem(el) {
    var item;
    if (el.getAttribute("type") == "object") {
        item = getJsonObject(el);
    } else if (el.getAttribute("type") == "array") {
        item = getJsonArray(el);
    } else {
        if (el.firstChild) {
            item = el.firstChild.nodeValue;
        } else {
            item = "";
        }
    }
    return item;
}

function rxApply() {

    var input = document.getElementById("rxInput");
    var pattern = document.getElementById("rxPattern");

    var optionsContainer = document.getElementById("rxOptions");
    var options = getOptions(optionsContainer);

    var resultContainer = document.getElementById(resultContainerId);
    if (resultContainer) {
        resultContainer.parentNode.removeChild(resultContainer);
    }

    resultContainer = document.createElement("fieldset");
    resultContainer.id = resultContainerId;

    resultContainer.appendChild(document.createElement("legend")).appendChild(document.createTextNode("Result"));

    var loadingContainer = resultContainer.appendChild(document.createElement("span"));
    loadingContainer.id = "rxLoading";
    loadingContainer.appendChild(document.createTextNode("Loading"));

    var request =
        (window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"));

    request.onreadystatechange = function () { rxReadyStateChange(request); };
    request.open("POST", "execute-rx.ashx", true);
    request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    request.send("input=" + encodeURIComponent(input.value) +
                 "&pattern=" + encodeURIComponent(pattern.value) +
                 "&options=" + encodeURIComponent(options.join(",")));

    optionsContainer.parentNode.appendChild(resultContainer);
}
