<html>
<head>
<script>
var testevent_divid2_called = false, cnt=0;

function ok(b,m) {
    return external.ok(b, m);
}

function ondataavailable_test() {
    var evobj, div, b = false;

    div = document.getElementById("divid");

    function ondataavailableHandler() {
        b = true;
        ok(window.event === evobj, "window.event != evobj");

        ok(evobj.srcElement === div, "evobj.srcElement = " + evobj.srcElement);
        ok(evobj.fromElement === null, "evobj.srcElement = " + evobj.fromElement);
        ok(evobj.toElement === null, "evobj.srcElement = " + evobj.toElement);
        ok(evobj.type === "dataavailable", "evobj.type = " + evobj.type);
    }

    function ondataavailableDocHandler() {
        b = true;
        ok(window.event === evobj, "window.event != evobj");

        ok(evobj.srcElement === null, "evobj.srcElement = " + evobj.srcElement);
        ok(evobj.fromElement === null, "evobj.srcElement = " + evobj.fromElement);
        ok(evobj.toElement === null, "evobj.srcElement = " + evobj.toElement);
        ok(evobj.type === "dataavailable", "evobj.type = " + evobj.type);
    }

    div.attachEvent("ondataavailable", ondataavailableHandler);

    evobj = document.createEventObject();
    ok(evobj.srcElement === null, "evobj.srcElement = " + evobj.srcElement);
    ok(evobj.fromElement === null, "evobj.srcElement = " + evobj.fromElement);
    ok(evobj.toElement === null, "evobj.srcElement = " + evobj.toElement);
    ok(evobj.type === "", "evobj.type = " + evobj.type);

    div.fireEvent("ondataavailable", evobj);
    ok(b, "ondataavailable handler not called?");

    ok(evobj.srcElement === div, "evobj.srcElement = " + evobj.srcElement);
    ok(evobj.type === "dataavailable", "evobj.type = " + evobj.type);

    div.detachEvent("ondataavailable", ondataavailableHandler);

    b = false;
    div.fireEvent("ondataavailable", evobj);
    ok(!b, "ondataavailable handler called?");

    ok(evobj.srcElement === div, "evobj.srcElement = " + evobj.srcElement);
    ok(evobj.type === "dataavailable", "evobj.type = " + evobj.type);

    document.attachEvent("ondataavailable", ondataavailableDocHandler);

    evobj = document.createEventObject();

    document.fireEvent("ondataavailable", evobj);
    ok(b, "ondataavailable handler not called?");

    ok(evobj.srcElement === null, "evobj.srcElement = " + evobj.srcElement);
    ok(evobj.type === "dataavailable", "evobj.type = " + evobj.type);
}

function test_scriptfor() {
    var div = document.getElementById("divid2");
    ok("onclick" in div, "testevent not in div");
    ok(typeof(div.onclick) === "function", "typeof(div.onclick) = " + typeof(div.onclick));
    ok(testevent_divid2_called === false, "testevent_divid2_called = " + testevent_divid2_called);
    div.click();
    ok(testevent_divid2_called === true, "testevent_divid2_called = " + testevent_divid2_called);

    ok(!("ontest" in div), "testevent in div");
    ok(typeof(div.ontest) === "undefined", "typeof(div.ontest) = " + typeof(div.ontest));
}

function test_handler_this() {
    document.body.innerHTML = '<div id="d1"><div id="d2"></div></div>';

    var div1 = document.getElementById("d1");
    var div2 = document.getElementById("d2");
    var calls = new Array();

    function createHandler(name, node) {
        return function() {
            ok(this === node, "this !== node");
            calls.push(name);
        }
    }

    function registerHandler(name, target) {
        var b = target.attachEvent("onclick", function() {
            ok(this === window, "this !== window");
            calls.push(name+"*");
        });
        ok(b, "attachEvent failed");
    }

    registerHandler("div1", div1);
    registerHandler("div2", div2);
    registerHandler("body", document.body);
    div1.onclick = createHandler("div1", div1);
    div2.onclick = createHandler("div2", div2);
    document.body.onclick = createHandler("body", document.body);

    div2.click();
    ok(calls == "div2,div2*,div1,div1*,body,body*", "calls = " + calls);
}

function runTests(t) {
    try {
        ok(cnt == 1, "cnt=" + cnt + " exception during loading?");
        ok(t === window, "t !== window");

        ok(typeof(window.onload) === "function", "typeof(window.onload) = " + typeof(window.onload));
        ok(document.body.onload === window.onload, "document.body.onload !== window.onload");

        test_scriptfor();
        ondataavailable_test();
        test_handler_this();
    }catch(e) {
        ok(false, "Got an exception: " + e.message);
    }

    external.reportSuccess();
}
</script>
</head>
<body onload="runTests(this)">
<div id="divid"></div>
<div id="divid2"></div>
<script event="onclick" for="divid2">
    testevent_divid2_called = true;
</script>
<script event="ontest" for="divid2">
    ok(false, "unexpected ontest");
</script>
<script>
(function() {
    var div = document.getElementById("divid2");
    ok(div.onclick === null, "div.onclick = null");
    cnt++;
})();
</script>
</body>
</html>
