<!DOCTYPE HTML>
<html>
    <head>
        <title> W3C DOM Level 2 Event Object Property: eventPhase </title>
        <script type="text/javascript">
            var PassTest = function()
            {
                document.getElementById("testresult").firstChild.data = "PASS";
            }

            var FailTest = function()
            {
                document.getElementById("testresult").firstChild.data = "FAIL";
            }

            var EVENT = "dblclick";
            var TARGET, PARENT;
            var ActualResult = [];
            var ExpectResult = [];

            window.onload = function()
            {
                try
                {
                    TARGET = document.getElementById("target");
                    PARENT = document.getElementById("parent");

                    ExpectResult = ["[1]" + PARENT, "[2]" + TARGET, "[3]" + document.body];

                    PARENT.addEventListener(EVENT, TestEvent, true);
                    PARENT.addEventListener(EVENT, TestEvent, false);
                    TARGET.addEventListener(EVENT, TestEvent, true);
                    TARGET.addEventListener(EVENT, TestEvent, false);
                    document.body.addEventListener(EVENT, TestEvent, false);

                    PARENT.removeEventListener(EVENT, TestEvent, false);
                    TARGET.removeEventListener(EVENT, TestEvent, true);
                }
                catch(ex)
                {
                    FailTest();
                }
            }

            function TestEvent(evt)
            {
                ActualResult.push("[" + evt.eventPhase + "]" + evt.currentTarget);

                if ((evt.eventPhase == 3) && (evt.currentTarget == document.body))
                {
                    if (ExpectResult.toString() == ActualResult.toString())
                    {
                        PassTest();
                    }
                    else
                    {
                        FailTest();
                    }
                }
            }
        </script>
    </head>
    <body>
        <h4>
            Test Description:
            eventPhase is used to indicate which phase of event flow is currently being accomplished.
        </h4>

        <div id="parent">
            Double click here: <input id="target" />
        </div>

        <p>Test passes if the word "PASS" appears below after double clicking the above textbox.</p>
       	<div>Test result: </div>
        <div id='testresult'>FAIL</div>
    </body>
</html>