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

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

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

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 test_insert_script() {
    var e = document.createElement("script");

    extern_cnt = 0;
    e.src = "externscr.js";

    var readystatechange_log = "";
    e.onreadystatechange = function() {
        readystatechange_log += "," + e.readyState;
        ok(extern_cnt === 1, "extern_cnt = " + extern_cnt);
        if(e.readyState === "complete") {
            ok(readystatechange_log === "append,complete", "readystatechange_log = " + readystatechange_log);
            external.reportSuccess();
        }
    }

    document.body.appendChild(e);
    ok(extern_cnt === 1, "extern_cnt = " + extern_cnt);
    readystatechange_log = "append";
}

var string_handler_called = false;

function test_string_event_handler() {
    var e = document.createElement("div");
    var event_str = "string_handler_called = true;";

    document.body.appendChild(e);
    e.onclick = event_str;
    ok(e.onclick === event_str, "e.onclick = " + e.onclick);
    e.click();
    ok(string_handler_called === false, "string handler called");

    e.setAttribute("onclick", event_str);
    ok(e.onclick === event_str, "e.onclick = " + e.onclick);
    e.click();
    ok(string_handler_called === false, "string handler called");
}

window.onload = function() {
    try {
        ok(inlscr_complete_called, "onreadystatechange not fired");
        ok(extern_res_script_rs === "eval,complete1," || extern_res_script_rs == "loaded0,eval,complete1,",
            "extern_res_script_rs = " + extern_res_script_rs + " expected (loaded0)?,eval,complete1,");
        ok(extern_http_script_rs === "loading,loaded,complete,",
            "extern_http_script_rs = " + extern_http_script_rs + " expected loading,loaded,complete,");

        ok(cnt == 1, "cnt=" + cnt + " exception during loading?");
        ok(this === window, "this !== window");

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

        ok(img_onload_called, "img.onload not called before window.onload");

        test_scriptfor();
        ondataavailable_test();
        test_handler_this();
        test_insert_script();
        test_string_event_handler();
    }catch(e) {
        ok(false, "Got an exception: " + e.message);
    }
}
</script>
<script>
var img = document.createElement("img");
img.src = "http://test.winehq.org/tests/winehq_snapshot/index_files/winehq_logo_glass.png";

var img_onload_called = false;
img.onload = function() {
    external.trace("img.onload");
    img_onload_called = true;
}
</script>
</head>
<body>
<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>
<script>
var inlscr_complete_called = false, extern_res_script_rs = "", extern_http_script_rs = "";
var extern_cnt = 0;

function expect_inlscr_complete() {
    var elem = document.getElementById("inlscr");
    ok(elem.readyState === "complete" || broken(elem.readyState === "loading"), "expect_inlscr_complete: elem.readyState = " + elem.readyState);
    if(elem.readyState === "complete")
        inlscr_complete_called = true;
}

function extern_res_script_readystatechange() {
    var elem = document.getElementById("extscr");
    if(elem.readyState != "loading")
        extern_res_script_rs += elem.readyState + extern_cnt + ",";
    else
        external.trace("Got loading readyState from external res script.");
}

function http_script_readystatechange() {
    var elem = document.getElementById("httpscr");
    extern_http_script_rs += elem.readyState + ",";
}

function on_externscr() {
    var elem = document.getElementById("extscr");
    ok(elem.readyState === "interactive" || broken(elem.readyState === "loading"),
        "on_externscr: elem.readyState = " + elem.readyState);
    extern_res_script_rs += "eval,";
}

</script>
<script id="inlscr" onreadystatechange="expect_inlscr_complete();">
(function() {
    ok(inlscr_complete_called === false || broken(inlscr_complete_called), "onreadystatechange fired too early");

    var elem = document.getElementById("inlscr");
    ok(elem.readyState === "interactive", "inlscr: elem.readyState = " + elem.readyState);
})();
</script>
<script id="extscr" onreadystatechange="extern_res_script_readystatechange()" src="externscr.js"></script>
<script id="httpscr" onreadystatechange="http_script_readystatechange()" src="https://test.winehq.org/tests/empty.js?123456"></script>
<script>
document.body.appendChild(img);
</script>
</body>
</html>
