<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../resources/js-test-pre.js"></script>
</head>
<body id="body">

<div role="group" id="group" tabindex="0">group</div>
<div role="button" id="button" tabindex="0">button</div>
<div role="tab" id="tab" tabindex="0">tab button</div>
<div role="radio" id="radio" tabindex="0">radio</div>
<div role="checkbox" id="checkbox" tabindex="0">checkbox</div>
<div role="menuitem" id="menuitem" tabindex="0">menu item</div>
<div role="menuitemcheckbox" id="menuitemcheckbox" tabindex="0">menu item checkbox</div>
<div role="menuitemradio" id="menuitemradio" tabindex="0">menu item radio</div>
<div role="listitem" id="listitem" tabindex="0">list item</div>
<div role="button" id="button2" tabindex="0"><div><button id="subbutton"></div></div>

<p id="description"></p>
<div id="console"></div>

<script>

    document.getElementById("body").onmousedown = handlePress;

    var pressCount = 0;
    var eventSrcElement;
    function handlePress(e) {
       eventSrcElement = e.srcElement;

       if (pressCount == 0)
          shouldBeTrue("eventSrcElement == document.getElementById('group')");
       else if (pressCount == 1)
          shouldBeTrue("eventSrcElement == document.getElementById('button')");
       else if (pressCount == 2)
          shouldBeTrue("eventSrcElement == document.getElementById('tab')");
       else if (pressCount == 3)
          shouldBeTrue("eventSrcElement == document.getElementById('radio')");
       else if (pressCount == 4)
          shouldBeTrue("eventSrcElement == document.getElementById('checkbox')");
       else if (pressCount == 5)
          shouldBeTrue("eventSrcElement == document.getElementById('menuitem')");
       else if (pressCount == 6)
          shouldBeTrue("eventSrcElement == document.getElementById('menuitemcheckbox')");
       else if (pressCount == 7)
          shouldBeTrue("eventSrcElement == document.getElementById('menuitemradio')");
       else if (pressCount == 8)
          shouldBeTrue("eventSrcElement == document.getElementById('listitem')");
       else if (pressCount == 9)
          shouldBeTrue("eventSrcElement == document.getElementById('subbutton')");

       pressCount++;
    }

    description("This tests that when certain control type elements are pressed, a valid event is sent that references the right element.");

    var items = new Array("group", "button", "tab", "radio", "checkbox", "menuitem", "menuitemcheckbox", "menuitemradio", "listitem", "button2");
    var length = items.length;
    
    if (window.accessibilityController) {
        jsTestIsAsync = true;
        // AXPress on Mac is async, let's give it some delay and do it recursively.
        accessibilityPress(0);
    }
    
    function accessibilityPress(k) {
        if (k == length)
            finishJSTest();
        
        accessibilityController.accessibleElementById(items[k]).press();
        setTimeout(function() {
            accessibilityPress(k+1);
        }, 10);
    }

</script>

<script src="../resources/js-test-post.js"></script>
</body>
</html>
