<html>
<head>
<script>
var testevent_divid2_called = false, testevent_document_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);
    ok(typeof(document.onclick) === "function", "typeof(document.onclick) = " + typeof(document.onclick));
    ok(testevent_document_called === false, "testevent_document_called = " + testevent_document_called);
    div.click();
    ok(testevent_divid2_called === true, "testevent_divid2_called = " + testevent_divid2_called);
    ok(testevent_document_called === true, "testevent_document_called = " + testevent_document_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="onclick" for="document">
    testevent_document_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>
