<html>
<head>
<script>
function ok(b,m) {
    return external.ok(b, m);
}

function broken(expr) {
    return external.broken(expr);
}

function test_removeAttribute(e) {
    ok(e.removeAttribute('nonexisting') === false, "removeAttribute('nonexisting') didn't return false");

    e.title = "title";
    ok(e.removeAttribute('title') === true, "removeAttribute('title') didn't return true");
    ok(e.title === "", "e.title = " + e.title);
    ok(("title" in e) === true, "title is not in e");

    e["myattr"] = "test";
    ok(e.removeAttribute('myattr') === true, "removeAttribute('myattr') didn't return true");
    ok(e["myattr"] === undefined, "e['myattr'] = " + e['myattr']);
    ok(("myattr" in e) === false, "myattr is in e");

}

function test_select_index() {
    var s = document.getElementById("sel");

    ok("0" in s, "'0' is not in s");
    ok(s[0].text === "opt1", "s[0].text = " + s[0].text);
    ok("1" in s, "'1 is not in s");
    ok(s[1].text === "opt2", "s[1].text = " + s[1].text);
    ok("2" in s, "'2' is in s");
    ok(s[2] === null, "s[2] = " + s[2]);
}

function test_createDocumentFragment() {
    var fragment = document.createDocumentFragment();

    ok(typeof(fragment) === "object", "typeof(fragmend) = " + typeof(fragment));
    ok(fragment.nodeType === 11, "fragment.nodeType = " + fragment.nodeType);
    ok(fragment.nodeName === "#document-fragment", "fragment.nodeName = " + fragment.nodeName);

    var cloned = fragment.cloneNode(true);
    ok(cloned.nodeType === 11, "cloned.nodeType = " + cloned.nodeType);
    ok(cloned.nodeName === "#document-fragment", "cloned.nodeName = " + cloned.nodeName);
}

function test_document_name_as_index() {
    document.body.innerHTML = '<form name="formname"></form>';
    var e = document.getElementById("formname");
    ok(!!e, "e is null");

    ok(document.formname === e, "document.formname != getElementById('formname')");
    ok("formname" in document, "formname' is not in document");

    document.body.removeChild(e);

    ok(document.formname === undefined, "document.formname is not undefined");
    ok(!("formname" in document), "formname' is in document");

    document.body.innerHTML = '<form id="formid"></form>';
    var e = document.getElementById("formid");
    ok(!!e, "e is null");
    ok(!("formid" in document), "formid is in document");

    document.body.innerHTML = '<form name="formname"></form>';
    ok("formname" in window, "formname' is not in window");
    ok(typeof(window.formname) === "object", "typeof(window.formname) = " + typeof(window.formname));
    window.formname = 1;
    ok(window.formname === 1, "window.formname = " + window.formname);
    formname = 2;
    ok(window.formname === 2, "window.formname = " + window.formname);

    document.body.innerHTML = '<iframe id="iframeid"></iframe>';
    ok("iframeid" in window, "iframeid is not in window");
    e = document.getElementById("iframeid");
    ok(!!e, "e is null");
    ok(iframeid != e, "iframeid == e");
    ok(iframeid.frameElement === e, "frameid != e.contentWindow");
}

function test_remove_style_attribute() {
    var s = document.body.style, b;

    s.somevar = "test";
    b = s.removeAttribute("somevar", 1);
    ok(b, "removeAttribute returned " + b + " expected true");
    b = s.removeAttribute("somevar", 1);
    ok(b === false, "removeAttribute returned " + b + " expected false");
}

function test_clone_node() {
    var elem, cloned;

    elem = document.getElementById("divid");
    elem.style.filter = "alpha(opacity=50)";
    ok(elem.style.filter === "alpha(opacity=50)", "elem.style.filter = " + elem.style.filter);

    cloned = elem.cloneNode(true);
    ok(cloned.style.filter === "alpha(opacity=50)", "cloned.style.filter = " + cloned.style.filter);
}

function test_attrs() {
    var input, s, x, f, b;

    document.body.innerHTML = '<input id="inputid"></input>';
    input = document.getElementById("inputid");
    s = input.style;
    f = input.fireEvent;
    ok(input.checked === false, "input.checked = " + input.checked);

    input.setAttribute("checked", "test");
    ok(input.checked === true, "input.checked = " + input.checked);

    input.setAttribute("checked", 0);
    ok(input.checked === false, "input.checked = " + input.checked);

    input.setAttribute("checked", "");
    ok(input.checked === false, "input.checked = " + input.checked);

    input.setAttribute("Checked", 1, 0);
    ok(input.checked === true, "input.checked = " + input.checked);
    ok(!("Checked" in input), "Checked added to input");

    input.setAttribute("checked", 0, 0);
    input.setAttribute("Checked", 1, 1);
    ok(input.checked === false, "input.checked = " + input.checked);
    ok("Checked" in input, "checked not added to input");
    ok(input.Checked === 1, "input.Checked = " + input.Checked);

    input.removeAttribute("Checked", 1);
    ok(!("Checked" in input), "Checked is still in input");
    ok(input.checked === false, "input.checked = " + input.checked);

    input.setAttribute("checked", 1, 0);
    input.setAttribute("Checked", 0);
    ok(input.checked === true, "input.checked = " + input.checked);
    ok("Checked" in input, "checked not added to input");
    ok(input.Checked === 0, "input.Checked = " + input.Checked);

    input.setAttribute("Checked", 2, 2);
    ok(input.Checked === 0, "input.Checked = " + input.Checked);
    input.setAttribute("Checked", 3, 3);
    ok(input.Checked === 3, "input.Checked = " + input.Checked);

    x = input.getAttribute("style");
    ok(x === s, "getAttribute('style') = " + x);
    ok(s.cssText === "", "s.cssText = " + s.cssText);
    x = input.getAttribute("style", 2);
    ok(x === "", "getAttribute('style') = " + x);

    input.setAttribute("style", "display: none");
    x = input.getAttribute("style");
    ok(x === s, "getAttribute('style') = " + x);
    ok(s.cssText === "", "s.cssText = " + s.cssText);
    ok(s.display === "", "s.display = " + s.display);
    x = input.getAttribute("style", 2);
    ok(x === "", "getAttribute('style') = " + x);

    s.display = "none";
    ok(s.cssText != "", "s.cssText = " + s.cssText);
    ok(s.display === "none", "s.display = " + s.display);
    input.setAttribute("style", "");
    x = input.getAttribute("style");
    ok(x === s, "getAttribute('style') = " + x);
    ok(s.cssText != "", "s.cssText = " + s.cssText);
    ok(s.display === "none", "s.display = " + s.display);
    x = input.getAttribute("style", 2);
    ok(x === "", "getAttribute('style') = " + x);

    input.setAttribute("style", null);
    x = input.getAttribute("style");
    ok(input.style === s, "input.style = " + input.style);
    ok(x === s, "getAttribute('style') = " + x);
    ok(s.cssText != "", "s.cssText = " + s.cssText);
    ok(s.display === "none", "s.display = " + s.display);

    x = input.getAttribute("fireEvent");
    ok(x === input.fireEvent, "input.getAttribute('fireEvent') = " + x);
    x = input.getAttribute("fireEvent", 2);
    ok(x === "", "getAttribute('fireEvent') = " + x);

    input.setAttribute("fireEvent", 3);
    ok(input.fireEvent === 3, "input.fireEvent = " + input.fireEvent);
    x = input.getAttribute("fireEvent");
    ok(x === 3, "input.getAttribute('fireEvent') = " + x);
    x = input.getAttribute("fireEvent", 2);
    ok(x === "3", "getAttribute('fireEvent') = " + x);

    b = input.removeAttribute("style");
    ok(b === true, "removeAttribute('style') failed");
    ok(input.style === s, "input.style = " + input.style);
    x = input.getAttribute("style");
    ok(x === s, "getAttribute('style') = " + x);
    ok(s.display === "", "s.display = " + s.display);
    ok(s.cssText === "", "s.cssText = " + s.cssText);
    x = input.getAttribute("style", 2);
    ok(x === "", "getAttribute('style') = " + x);
    b = input.removeAttribute("style");
    ok(b === true, "removeAttribute('style') failed");

    b = false;
    try {
        input.setAttribute("tagName", "xxx");
    }catch(e) {
        b = true;
    }
    ok(b, "Expected exception on setAttribute(tagName)");

    b = false;
    try {
        input.setAttribute("parentElement", "xxx");
    }catch(e) {
        b = true;
    }
    ok(b, "Expected exception on setAttribute(parentElement)");

    b = input.removeAttribute("fireEvent");
    ok(b === true, "removeAttribute(fireEvent) failed");
    ok(input.fireEvent === f, "input.fireEvent = " + input.fireEvent);
    x = input.getAttribute("fireEvent");
    ok(x === f, "input.getAttribute('fireEvent') = " + x);
    b = input.removeAttribute("fireEvent");
    ok(b === false || broken(b === true), "removeAttribute(fireEvent) returned " + b);

    input.fireEvent = 3;
    x = input.getAttribute("fireEvent");
    ok(x === 3, "input.getAttribute('fireEvent') = " + x);
    ok(input.fireEvent === 3, "input.fireEvent' = " + input.fireEvent);
}

function test_attribute_collection() {
    var div, attr;

    document.body.innerHTML = '<div id="divid" class="test"></div>';
    div = document.getElementById("divid");

    attr = div.attributes["dir"];
    ok(attr === div.attributes["dir"], "attr !== div.attributes['dir']");
}

function test_getter_call() {
    document.body.innerHTML = '<div id="divid"></div>';

    var e = document.getElementById("divid");

    e.myfunc = function(x) { this.myfunc_called = x; };
    e.myfunc("test");
    ok(e.myfunc_called === "test", "e.myfunc_called = " + e.myfunc_called);

    e.onmousedown = function(x) { this.onmousedown_called = x; };
    e.onmousedown("test");
    ok(e.onmousedown_called === "test", "e.onmousedown_called = " + e.onmousedown_called);

    ok(document.all("divid").tagName === "DIV", "document.all('divid').tagName = " + document.all("divid").tagName);
}

function test_arg_conv() {
    /* this call would throw if the argument wasn't converted by JScript */
    window.clearInterval("");

    navigator.javaEnabled();
}

function test_override_functions() {
    function override_func() { return "test"; }

    ok(typeof(window.showModalDialog) === "object", "typeof(window.showModalDialog) = " + typeof(window.showModalDialog));
    window.showModalDialog = override_func;
    ok(window.showModalDialog === override_func, "window.showModalDialog != override_func");
    ok(typeof(window.showModalDialog) === "function", "typeof(window.showModalDialog) = " + typeof(window.showModalDialog));

    document.body.innerHTML = '<div id="divid"></div>';
    var div = document.getElementById("divid");
    ok(typeof(div.addBehavior) === "object", "typeof(div.addBehavior) = " + typeof(div.addBehavior));
    div.addBehavior = override_func;
    ok(div.addBehavior === override_func, "div.addBehavior != override_func");
    ok(typeof(div.addBehavior) === "function", "typeof(div.addBehavior) = " + typeof(div.addBehavior));

    var tmp = div.addBehavior();
    ok(tmp === "test", "div.addBehavior() = " + tmp);

    tmp = String(div.attachEvent);
    ok(tmp == "\nfunction attachEvent() {\n    [native code]\n}\n", "String(div.attachEvent) = " + tmp);
}

function test_forin() {
    var cnt=0;

    document.body.innerHTML = '<a id="aid"></a>';

    for(var x in document.getElementById("aid")) {
        cnt++;
    }

    ok(cnt > 100, "cnt = " + cnt);
}

function test_customtag() {
    document.body.innerHTML = 'test<unk><br>';

    var children = document.body.childNodes;

    ok(children.length === 3, "children.length = " + children.length);
    ok(children[0].data === "test", "children[0].data = " + children[0].data);
    ok(children[1].tagName === "UNK", "children[1].tagName = " + children[1].tagName);
    ok(children[2].tagName === "BR", "children[2].tagName = " + children[2].tagName);
}

function test_whitespace_nodes() {
    document.body.innerHTML = '<table id="tid"> <tr> \t<td>\n \t<div></div> </td>\n </tr> </table>';

    var t = document.getElementById("tid");
    ok(t.childNodes.length === 1, "t.childNodes.length = " + t.childNodes.length);
    ok(t.childNodes[0].tagName === "TBODY", "t.childNodes[0].tagName = " + t.childNodes[0].tagName);

    var row = t.rows[0];
    ok(row.childNodes.length === 1, "row.childNodes.length = " + row.childNodes.length);
    ok(row.childNodes[0].tagName === "TD", "row.childNodes[0].tagName = " + row.childNodes[0].tagName);

    var cell = row.cells[0];
    ok(cell.childNodes.length === 1, "cell.childNodes.length = " + cell.childNodes.length);


    document.body.innerHTML = '<table id="tid"> x<tr> \tx<td>\n \tx<div></div> </td>\n </tr> </table>';

    t = document.getElementById("tid");
    ok(t.rows[0].cells[0].childNodes.length === 2,
        "t.rows[0].cells[0].childNodes.length = " + t.rows[0].cells[0].childNodes.length);
}

function test_language_attribute() {
    document.body.innerHTML = '<div id="did" language="test"></div>';
    var elem = document.getElementById("did");
    ok(elem.language === "test", "elem.language = " + elem.language);
    elem.language = 1;
    ok(elem.language === "1", "elem.language = " + elem.language);
}

function test_text_node() {
    document.body.innerHTML = 'testing text';
    var text = document.body.childNodes[0], text2;
    ok(text.data == "testing text", "text.data = " + text.data);

    text2 = text.splitText(7);
    ok(text.data == "testing", "text.data = " + text.data);
    ok(text2.data == " text", "text2.data = " + text2.data);
    ok(text.nextSibling === text2, "text.nextSibling !== text2");

    text2 = text.splitText(0);
    ok(text.data == "", "text.data = " + text.data);
    ok(text2.data == "testing", "text2.data = " + text2.data);
}

function test_xhr() {
    ok("XMLHttpRequest" in window, "XMLHttpRequest not found in window object\n");
    ok(typeof(XMLHttpRequest) === "object", "typeof(XMLHttpRequest) = " + typeof(XMLHttpRequest));

    var xhr = new XMLHttpRequest();
    ok(typeof(xhr) === "object", "typeof(xhr) = " + typeof(xhr));
}

function test_sendMessage() {
    var onmessage_called = false;
    window.onmessage = function() {
        onmessage_called = true;
    }
    window.postMessage("test", "*");
    ok(onmessage_called, "onmessage not called");
}

var globalVar = false;

function runTests() {
    obj = new Object();
    ok(obj === window.obj, "obj !== window.obj");

    ok(typeof(divid) === "object", "typeof(divid) = " + typeof(divid));

    test_removeAttribute(document.getElementById("divid"));
    test_removeAttribute(document.body);
    test_select_index();
    test_clone_node();
    test_createDocumentFragment();
    test_document_name_as_index();
    test_remove_style_attribute();
    test_getter_call();
    test_attrs();
    test_attribute_collection();
    test_arg_conv();
    test_override_functions();
    test_forin();
    test_customtag();
    test_whitespace_nodes();
    test_language_attribute();
    test_text_node();
    test_xhr();
    test_sendMessage();

    var r = window.execScript("globalVar = true;");
    ok(r === undefined, "execScript returned " + r);
    ok(globalVar === true, "globalVar = " + globalVar);

    /* Call setTimeout without specified time. */
    window.setTimeout(function() { external.reportSuccess(); });
}

function runTest() {
    try {
        runTests();
    }catch(e) {
        ok(false, "got exception " + e.message);
    }
}
</script>
<body onload="runTest();">
<div id="divid"></div>
<select id="sel">
<option>opt1</option>
<option>opt2</option>
</select>
</body>
</html>
