<html>
<head>
<title>Implicit Form Submission</title>
<script>

var currentTest = 0;

// match IE and FF unless specified otherwise.
var allTests = [
    [ "Single text input", "!text", "y" ],
    [ "Single text input with submit disabled", "!text,-submit", "y" ],
    [ "Multiple text inputs", "!text,text,text", "n" ],
    [ "Multiple text inputs with submit", "!text,text,text,submit", "y" ],
    [ "Multiple text inputs with submit disabled", "!text,text,text,-submit", "n" ],
    [ "Multiple text inputs and multiple submits, first submit disabled", "!text,text,text,-submit,submit", "y" ], // match IE, not FF.
    [ "Text input and text area, text input focused", "!text,textarea", "y" ],
    [ "Text input and text area and a submit, text input focused", "!text,textarea,submit", "y" ],
    [ "Text input and text area and a disabled submit, text input focused", "!text,textarea,-submit", "y" ], // match IE, not FF.
    [ "Text input and checkbox, text input focused", "!text,checkbox", "y" ],
    [ "Text input and radio, text input focused", "!text,radio", "y" ],
    [ "Text input and text area, textarea focused", "text,!textarea", "n" ],
    [ "Text input and checkbox, checkbox focused", "text,!checkbox", "n" ], // match IE, not FF.
    [ "Text input and radio, radio focused", "text,!radio", "n" ], // match IE, not FF.
    [ "Single radio", "!radio", "n" ], // match IE, not FF.
    [ "Single checkbox", "!checkbox", "n" ],
    [ "Single checkbox with a submit", "!checkbox,submit", "y" ],
    [ "Single checkbox with a submit disabled", "!checkbox,-submit", "n" ],
    [ "Single select", "!select", "n" ],
    [ "Select with a submit", "!select,submit", "y" ], // match neither FF nor IE, instead follow logic.
    [ "Select with a disabled submit", "!select,-submit", "n" ],
    [ "Multi-line select with a submit", "!selectBox,submit", "y" ], // match neither FF nor IE, instead follow logic.
    [ "Multi-line select with a disabled submit", "!selectBox,-submit", "n" ],
    [ "Text field and single select, text focused", "!text,select", "y" ],
    [ "Text field and single select, select focused", "text,!select", "n" ],
    [ "Multiple text inputs with a button", "!text,text,button", "y"],
    [ "Multiple text inputs with a disabled button", "!text,text,-button", "n"]
];

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

var results = {
    submissionReported: false,
    data: [],
    submitted: function()
    {
        this.submissionReported = true;
        if (!window.eventSender)
            this.testCompleted();
    },
    testCompleted: function()
    {
        this.data.push(this.submissionReported ? 'y' : 'n');
        this.submissionReported = false;
        runNextTest();
    },
    publish: function()
    {
        document.getElementById("log").innerHTML = allTests.map(function(manifest, i)
        {
            return manifest[0] + " should " + (manifest[2] == 'n' ? "not" : "") + " submit: " + (this.data[i] == manifest[2] ? "PASS" : "FAIL");
        }, this).join("<br>");
    }
};

function runNextTest()
{
    ++currentTest;
    if (currentTest < allTests.length) {
        runTest();
        return;
    }
    document.getElementById('arena').textContent = '';
    results.publish();
    if (window.testRunner)
        testRunner.notifyDone();
}

function buildAndTestForm(arena, inputs, description)
{
    arena.textContent = '';
    var form = arena.appendChild(document.createElement("form"));
    form.addEventListener('submit', function(evt) {
        results.submitted();
        evt.preventDefault();
    })
    if (!window.eventSender)
        form.appendChild(document.createElement("p")).innerHTML = "Press Enter key";
    inputs.forEach(function(type, i)
    {
        var focused;
        if (type[0] == '!') {
            type = type.substr(1);
            focused = true;
        }
        var disabled;
        if (type[0] == '-') {
            type = type.substr(1);
            disabled = true;
        }
        var control;
        if (type == "textarea") {
            control = document.createElement(type);
        } else if (type == "select") {
            control = document.createElement(type);
            control.options.add(new Option("a"));
        } else if (type == "selectBox") {
            control = document.createElement("select");
            control.size = 5;
            control.options.add(new Option("a"));
        } else if (type == "button") {
            control = document.createElement(type);
            control.type = "submit";
        } else {
            control = document.createElement("input");
            control.type = type;
        }
        control.id = focused ? "focused" : ("input" + i);
        control.disabled = !!disabled;
        form.appendChild(control);
    });
    var input = document.getElementById("focused");
    if (input)
        input.focus();
    if (window.eventSender) {
        eventSender.keyDown("\r", []);
        results.testCompleted();
    } else {
        var a = document.createElement("a");
        a.href = "javascript:results.testCompleted();";
        a.innerText = "Click if didn't submit";
        arena.appendChild(a);
    }
}

function runTest()
{
    var manifest = allTests[currentTest];
    buildAndTestForm(document.getElementById('arena'), manifest[1].split(','), manifest[0]);
}

</script>
</head>
<body onload="runTest()">
    <p>Tests various combinations of form elements and how implicit submission works with them.
    <div id="arena"></div>
    <div id="log"></div>
</body>
</html>
