<!DOCTYPE html>
<html>
<body>
<script src="../../resources/js-test.js"></script>
<div id="container"></div>
<form></form>
<script>

description("This tests verifies that namedItem and named getter returns the first matched item for all but all, options, and form controls collections.");

function createElementWithId(name, id, attributes) {
    var element = document.createElement(name);
    element.id = id;
    for (var attr in attributes)
        element.setAttribute(attr, attributes[attr]);
    return element;
}

function insertElementWithId(name, id, attributes) {
    var element = createElementWithId(name, id, attributes);
    document.getElementById('container').appendChild(element);
    return element;
}

function removeTestElements() {
    document.getElementById('container').innerHTML = '';
    document.querySelector('form').innerHTML = '';
}

var elements;
debug('document.all');
shouldBeTrue("document.all instanceof HTMLAllCollection");
shouldBeTrue("document.all instanceof HTMLCollection");
shouldBe("initialLength = document.all.length; elements = [insertElementWithId('b', 'foo'), insertElementWithId('q', 'foo')];\n"
    + "     document.all.length", "initialLength + 2;");
shouldBe("document.all['foo'].length", "2");
shouldBe("document.all['foo'][0]", "elements[0]");
shouldBe("document.all['foo'][1]", "elements[1]");
shouldBe("elements[0].parentNode.removeChild(elements[0]); document.all['foo']", 'elements[1]');
shouldBeUndefined("document.all['no-such-element']");
debug("");

var form = document.querySelector('form');
debug("form.elements");
shouldBeTrue("form.elements instanceof HTMLFormControlsCollection");
shouldBeTrue("form.elements instanceof HTMLCollection");
shouldBe("form.elements.length", "0");
shouldBe("elements = [createElementWithId('input', 'foo'), createElementWithId('input', 'foo')];\n"
    + "     form.appendChild(elements[0]); form.elements.length", "1");
shouldBe("form.elements['foo']", "elements[0]");
shouldBe("form.appendChild(elements[1]); form.elements.length", "2");
shouldBe("form.elements['foo'].toString()", "'[object RadioNodeList]'");
shouldBe("form.elements['foo'].length", "2");
shouldBe("form.elements['foo'][0]", "elements[0]");
shouldBe("form.elements['foo'][1]", "elements[1]");
shouldBe("form.removeChild(elements[0]); form.elements['foo']", "elements[1]");
shouldBe("removeTestElements(); form.elements.length", "0");
shouldBeUndefined("form.elements['no-such-element']");
debug("");

function testFirstItemReturnsFirstMatch(collection, initialLength, elementNames, attributes) {
    debug(collection);
    shouldBe(collection + ".length", initialLength.toString());
    elements = [];
    for (var i = 0; i < elementNames.length; i++) {
        var attrs = attributes ? ", " + JSON.stringify(attributes) : '';
        shouldBe("elements[" + i + "] = insertElementWithId('" + elementNames[i] + "', 'foo'" + attrs + "); "
            + collection + ".length", (initialLength + i + 1).toString());
    }
    shouldBe(collection + "['foo']", "elements[0]");
    shouldBe("removeTestElements(); " + collection + ".length", initialLength.toString());
    debug("");
}

testFirstItemReturnsFirstMatch('document.images', 0, ['img', 'img']);
testFirstItemReturnsFirstMatch('document.applets', 0, ['object', 'object'], {'type': 'application/x-java-applet'});
testFirstItemReturnsFirstMatch('document.embeds', 0, ['embed', 'embed']);
testFirstItemReturnsFirstMatch('document.forms', 1, ['form', 'form']);
testFirstItemReturnsFirstMatch('document.links', 0, ['a', 'a', 'area'], {'href': 'some url'});
testFirstItemReturnsFirstMatch('document.anchors', 0, ['a', 'a'], {'name': 'some name'});
testFirstItemReturnsFirstMatch('document.scripts', 2, ['script', 'script']);

var successfullyParsed = true;

</script>
</body>
</html>
