<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../../resources/js-test-pre.js"></script>
<!--
  Touch tests that involve the ontouchstart, ontouchmove, ontouchend or ontouchcancel callbacks
  should be written in an asynchronous fashion so they can be run on mobile platforms like Android.
  You will need to invoke isSuccessfullyParsed() in your test script when the test completes.
-->
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
var targetsDiv = document.createElement("div");
targetsDiv.id = "targetsDiv";

var div1 = document.createElement("div");
div1.id = "targetA";
div1.style.width = "100px";
div1.style.height = "100px";
div1.style.backgroundColor = "blue";

var div2 = document.createElement("div");
div2.id = "targetB";
div2.style.width = "100px";
div2.style.height = "100px";
div2.style.backgroundColor = "green";

document.body.insertBefore(targetsDiv, document.getElementById('console'));
targetsDiv.appendChild(div1);
targetsDiv.appendChild(document.createElement('br'));
targetsDiv.appendChild(div2);

function declareTouchStart()
{
    var touchStartCount = 0;
    return function touchStartHandler()
    {
        shouldBeEqualToString('event.type', 'touchstart');
        switch (touchStartCount) {
            case 0:
                shouldBeEqualToString('event.touches[0].target.id', div1.id);
                shouldBeEqualToString('event.touches[1].target.id', div2.id);
                break;
            case 1:
                shouldBeEqualToString('event.touches[0].target.id', div2.id);
                shouldBeEqualToString('event.touches[1].target.id', div1.id);
                break;
        }
        shouldBe('event.targetTouches.length', '1');

        touchStartCount++;
    }
}

var totalTouchMoveCount = 0;

function declareTouchMove(div_id)
{
    var touchMoveCount = 0;
    return function touchMoveHandler()
    {
        shouldBeEqualToString('event.type', 'touchmove');
        switch (touchMoveCount) {
            case 0:
            case 1:
                shouldBeEqualToString('event.touches[0].target.id', div1.id);
                shouldBeEqualToString('event.touches[1].target.id', div2.id);
                break;
            case 2:
                shouldBeEqualToString('event.touches[0].target.id', div2.id);
                shouldBeEqualToString('event.touches[1].target.id', div1.id);
                break;
        }
        shouldBe('event.targetTouches.length', '1');
        ++touchMoveCount;

        if (++totalTouchMoveCount == 6)
        {
            testRunner.notifyDone();
            isSuccessfullyParsed();
        }
    }
}

div1.addEventListener("touchstart", declareTouchStart(), false);
div1.addEventListener("touchmove", declareTouchMove(), false);

div2.addEventListener("touchstart", declareTouchStart(), false);
div2.addEventListener("touchmove", declareTouchMove(), false);

description("Tests that the target of touches match the element where the event originated, not where the touch is currently occurring. This is a limited version of test touch-target.html that avoids the situation where one touch point is released while another is maintained.");

if (window.testRunner) {
    testRunner.waitUntilDone();
}

if (window.eventSender) {
    eventSender.clearTouchPoints();
    eventSender.addTouchPoint(50, 150);
    eventSender.addTouchPoint(50, 250);
    eventSender.touchStart();

    eventSender.updateTouchPoint(0, 50, 250);
    eventSender.updateTouchPoint(1, 50, 150);
    eventSender.touchMove();

    eventSender.updateTouchPoint(0, 1000, 1000);
    eventSender.updateTouchPoint(1, 1000, 1000);
    eventSender.touchMove();

    eventSender.releaseTouchPoint(0);
    eventSender.releaseTouchPoint(1);
    eventSender.touchEnd();

    eventSender.addTouchPoint(50, 250);
    eventSender.addTouchPoint(50, 150);
    eventSender.touchStart();

    eventSender.updateTouchPoint(0, 500, 500);
    eventSender.updateTouchPoint(1, 500, 500);
    eventSender.touchMove();
} else
    debug('This test requires DRT.');

</script>
</body>
</html>
