<html>
<head>
<script>
function print(message, color) 
{
    var paragraph = document.createElement("div");
    paragraph.appendChild(document.createTextNode(message));
    paragraph.style.fontFamily = "monospace";
    if (color)
        paragraph.style.color = color;
    document.getElementById("console").appendChild(paragraph);
}

function test() 
{

    var selects = document.getElementsByTagName('select');
    for (var i = 0; i < selects.length; i++) { // >
        try {
            var item = document.getElementsByTagName('select')[i].namedItem('name1');
            if (item.innerHTML)
                print("FOUND ITEM: " + item.innerHTML);
            else
                print("NO ITEM: namedItem returned" + item);
        } catch (e) {
            print("ERROR: " + e.message);
        }
    }
    if (window.layoutTestController)
        layoutTestController.dumpAsText();
}
</script>
<title>Test for HTMLSelectElement.namedItem()</title>
</head>

<body onload="test();">

<hr>
<div id='console'>
<H3>Test for HTMLSelectElement.namedItem()</H3>
</div>

<div style="visibility: hidden">
    <select>
        <option name="name1">1</option>
        <option id="name1">2</option>
    </select>

    <select>
        <option id="name1">1</option>
        <option name="name1">2</option>
    </select>

    <select>
        <option name="name1">1</option>
        <option name="name1">2</option>
    </select>

    <select>
        <option id="name1">1</option>
        <option id="name1">2</option>
    </select>

    <select name="name1">
        <option id="name2">1</option>
        <option id="name3">2</option>
    </select>

</div>

</body>
</html>
