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

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);
}

var globalVar = false;

function runTest() {
    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_createDocumentFragment();

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

    external.reportSuccess();
}
</script>
<body onload="runTest();">
<div id="divid"></div>
<select id="sel">
<option>opt1</option>
<option>opt2</option>
</select>
</body>
</html>
