setup({explicit_done: true});

var debug = document.getElementById("debug");

function debug_print (x) {
/* uncomment below statement to show debug messages */
//	document.getElementById("debug").innerHTML += x;
}

var starting_elements = {};

function check_list_subset_of_targetlist(list, list_name, targetlist, targetlist_name) {
	var exist_in_targetlist;
	for(i=0; i<list.length; i++) {
		exist_in_targetlist=false;
		for(j=0; j<targetlist.length; j++)
			if(list.item(i).identifier==targetlist.item(j).identifier)
				exist_in_targetlist=true;

		assert_true(exist_in_targetlist, list_name + ".item("+i+") exists in " + targetlist_name);
	}
}

function check_list_subset_of_two_targetlists(list, list_name, targetlist1, targetlist1_name, targetlist2, targetlist2_name) {
	var exist_in_targetlists;
	for(i=0; i<list.length; i++) {
		exist_in_targetlists=false;
		for(j=0; j<targetlist1.length; j++)
			if(list.item(i).identifier==targetlist1.item(j).identifier)
				exist_in_targetlists=true;

		if(!exist_in_targetlists)
			for(j=0; j<targetlist2.length; j++)
				if(list.item(i).identifier==targetlist2.item(j).identifier)
					exist_in_targetlists=true;

		assert_true(exist_in_targetlists, list_name + ".item("+i+") exists in " + targetlist1_name + " or " + targetlist2_name);
	}

}

function is_at_least_one_item_in_targetlist(list, targetlist) {
	for(i=0; i<list.length; i++)
		for(j=0; j<targetlist.length; j++)
			if(list.item(i).identifier==targetlist.item(j).identifier)
				return true;

	return false;
}

function check_no_item_in_targetlist(list, list_name, targetlist, targetlist_name) {
	for(i=0; i<list.length; i++)
		for(j=0; j<targetlist.length; j++) {
			assert_false(list.item(i).identifier==targetlist.item(j).identifier, list_name + ".item("+i+") exists in " + targetlist_name);
			return;
		}
}

function check_targets(list, target) {
	for(i=0; i<list.length; i++)
		assert_true(list.item(i).target==target, "item(" + i + ").target is element receiving event");
}

function check_starting_elements(list) {
	for (i=0; i<list.length; i++) {
		assert_equals(list.item(i).target, starting_elements[list.item(i).identifier], "item(" + i + ").target matches starting element");
	}
}

function run() {
	var target0 = document.getElementById("target0");
	var target1 = document.getElementById("target1");

	var test_touchstart = async_test("touchstart event received");
	var test_touchmove = async_test("touchmove event received");
	var test_touchend = async_test("touchend event received");
	var test_mousedown = async_test("Interaction with mouse events");

	var touchstart_received = 0;
	var touchmove_received = 0;
	var touchend_received = 0;
	var touchstart_identifier;

	// last received touch lists for comparison
	var last_touches;
	var last_targetTouches={};
	var last_changedTouches={};

	on_event(window, "touchstart", function onTouchStart(ev) {
		// process event only if it's targeted at target0 or target1
		if(ev.target != target0 && ev.target != target1 )
			return;

		ev.preventDefault();

		if(!touchstart_received) {
			// Check event ordering TA: 1.6.1
			test_touchstart.step(function() {
				assert_true(touchmove_received==0, "touchstart precedes touchmove");
				assert_true(touchend_received==0, "touchstart precedes touchend");
			});
			test_touchstart.done();
			test_mousedown.done(); // If we got here, then the mouse event test is not needed.
		}
		touchstart_received++;

		// TA: 1.3.2.2, 1.3.2.4
		test(function() {
			assert_true(ev.changedTouches.length >= 1, "changedTouches.length is at least 1");
			assert_true(ev.changedTouches.length <= ev.touches.length, "changedTouches.length is smaller than touches.length");
			check_list_subset_of_targetlist(ev.changedTouches, "changedTouches", ev.touches, "touches");
		}, "touchstart #" + touchstart_received + ": changedTouches is a subset of touches");

		// TA: 1.3.3.2, 1.3.3.3
		test(function() {
			assert_true(ev.targetTouches.length >= 1, "targetTouches.length is at least 1");
			assert_true(ev.targetTouches.length <= ev.touches.length, "targetTouches.length is smaller than touches.length");
			check_list_subset_of_targetlist(ev.targetTouches, "targetTouches", ev.touches, "touches");
		}, "touchstart #" + touchstart_received + ": targetTouches is a subset of touches");

		// TA: 1.3.3.9
		test(function() {
			check_targets(ev.targetTouches, ev.target);
		}, "touchstart #" + touchstart_received + ": targets of targetTouches are correct");

		// TA: 1.3.4.2
		test(function() {
			assert_true(ev.touches.length >= 1, "touches.length is at least 1");
		}, "touchstart #" + touchstart_received + ": touches.length is valid");

		if(touchstart_received == 1) {
			// TA: 1.3.3.5, 1.3.3.7
			test(function() {
				assert_true(ev.targetTouches.length <= ev.changedTouches.length, "targetTouches.length is smaller than changedTouches.length");
				check_list_subset_of_targetlist(ev.targetTouches, "targetTouches", ev.changedTouches, "changedTouches");
			}, "touchstart #" + touchstart_received + ": targetTouches is a subset of changedTouches");

			// TA: 1.3.4.3
			test(function() {
				assert_true(ev.touches.length==ev.changedTouches.length, "touches and changedTouches have the same length");
			}, "touchstart #" + touchstart_received + ": touches and changedTouches have the same length");
		} else {
			// TA: 1.3.3.6
			test(function() {
				var diff_in_targetTouches = ev.targetTouches.length - (last_targetTouches[ev.target.id] ? last_targetTouches[ev.target.id].length : 0);
				assert_true(diff_in_targetTouches > 0, "targetTouches.length is larger than last received targetTouches.length");
				assert_true(diff_in_targetTouches <= ev.changedTouches.length, "change in targetTouches.length is smaller than changedTouches.length");
			}, "touchstart #" + touchstart_received + ": change in targetTouches.length is valid");

			// TA: 1.3.3.8
			test(function() {
				assert_true(is_at_least_one_item_in_targetlist(ev.targetTouches, ev.changedTouches), "at least one item of targetTouches is in changedTouches");
			}, "touchstart #" + touchstart_received + ": at least one targetTouches item in changedTouches");

			// TA: 1.3.4.4
			test(function() {
				var diff_in_touches = ev.touches.length - last_touches.length;
				assert_true(diff_in_touches > 0, "touches.length is larger than last received touches.length");
				assert_true(diff_in_touches == ev.changedTouches.length, "change in touches.length equals changedTouches.length");
			}, "touchstart #" + touchstart_received + ": change in touches.length is valid");

			// TA: 1.3.4.5
			test(function() {
				check_list_subset_of_two_targetlists(ev.touches, "touches", ev.changedTouches, "changedTouches", last_touches, "last touches");
			}, "touchstart #" + touchstart_received + ": touches is subset of {changedTouches, last received touches}");
		}

		// save starting element of each new touch point
		for (i=0; i<ev.changedTouches.length; i++) {
			starting_elements[ev.changedTouches.item(i).identifier] = ev.changedTouches.item(i).target;
		}

		last_touches = ev.touches;
		last_targetTouches[ev.target.id] = ev.targetTouches;
		last_changedTouches = {};	// changedTouches are only saved for touchend events
	});

	on_event(window, "touchmove", function onTouchMove(ev) {
		// process event only if it's targeted at target0 or target1
		if(ev.target != target0 && ev.target != target1 )
			return;

		ev.preventDefault();

		// TA: 1.6.1
		test_touchmove.step(function() {
			assert_true(touchstart_received>0, "touchmove follows touchstart");
			// assert_false(touchend_received, "touchmove precedes touchend"); // this applies to scenario tests
		});
		test_touchmove.done();

		touchmove_received++;

		// do the detailed checking only for a few times
		if(touchmove_received<6) {
			// TA: 1.4.2.2, 1.4.2.4
			test(function() {
				assert_true(ev.changedTouches.length >= 1, "changedTouches.length is at least 1");
				assert_true(ev.changedTouches.length <= ev.touches.length, "changedTouches.length is smaller than touches.length");
				check_list_subset_of_targetlist(ev.changedTouches, "changedTouches", ev.touches, "touches");
			}, "touchmove #" + touchmove_received + ": changedTouches is a subset of touches");

			// TA: 1.4.3.2, 1.4.3.4
			test(function() {
				assert_true(ev.targetTouches.length >= 1, "targetTouches.length is at least 1");
				assert_true(ev.targetTouches.length <= ev.touches.length, "targetTouches.length is smaller than touches.length");
				check_list_subset_of_targetlist(ev.targetTouches, "targetTouches", ev.touches, "touches");
			}, "touchmove #" + touchmove_received + ": targetTouches is a subset of touches");

			// TA: 1.4.3.6
			test(function() {
				assert_true(is_at_least_one_item_in_targetlist(ev.targetTouches, ev.changedTouches), "at least one item of targetTouches is in changedTouches");
			}, "touchmove #" + touchmove_received + ": at least one targetTouches item in changedTouches");

			// TA: 1.4.3.8
			test(function() {
				check_targets(ev.targetTouches, ev.target);
			}, "touchmove #" + touchmove_received + ": targets of targetTouches are correct");

			// TA: 1.4.4.2
			test(function() {
				assert_true(ev.touches.length==last_touches.length, "length of touches is same as length of last received touches");
				check_list_subset_of_targetlist(ev.touches, "touches", last_touches, "last received touches");
			}, "touchmove #" + touchmove_received + ": touches must be same as last received touches");

			// TA: 1.6.3
			check_starting_elements(ev.changedTouches);
		}

		last_touches = ev.touches;
		last_targetTouches[ev.target.id] = ev.targetTouches;
		last_changedTouches = {};	// changedTouches are only saved for touchend events
	});

	on_event(window, "touchend", function onTouchEnd(ev) {
		// process event only if it's targeted at target0 or target1
		if(ev.target != target0 && ev.target != target1 )
			return;

		test_touchend.step(function() {
			assert_true(touchstart_received>0, "touchend follows touchstart");
		});
		test_touchend.done();

		touchend_received++;

		debug_print("touchend #" + touchend_received + ":<br>");
		debug_print("changedTouches.length=" + ev.changedTouches.length + "<br>");
		debug_print("targetTouches.length=" + ev.targetTouches.length + "<br>");
		debug_print("touches.length=" + ev.touches.length + "<br>");
		for(i=0; i<ev.changedTouches.length; i++)
			debug_print("changedTouches.item(" + i + ").target=" + ev.changedTouches.item(i).target.id + "<br>");

		// TA: 1.5.2.2
		test(function() {
			assert_true(ev.changedTouches.length >= 1, "changedTouches.length is at least 1");
		}, "touchend #" + touchend_received + ": length of changedTouches is valid");

		// TA: 1.5.2.3
		test(function() {
			check_list_subset_of_targetlist(ev.changedTouches, "changedTouches", last_touches, "last received touches");
		}, "touchend #" + touchend_received + ": changedTouches is a subset of last received touches");

		// TA: 1.5.2.4, 1.5.2.5
		test(function() {
			check_no_item_in_targetlist(ev.changedTouches, "changedTouches", ev.touches, "touches");
			check_no_item_in_targetlist(ev.changedTouches, "changedTouches", ev.targetTouches, "targetTouches");
		}, "touchend #" + touchend_received + ": no item in changedTouches are in touches or targetTouches");

		// TA: 1.5.2.6
		test(function() {
			var found=false;
			for (i=0; i<ev.changedTouches.length; i++)
				if (ev.changedTouches.item(i).target == ev.target)
					found=true;
			assert_true(found, "at least one item in changedTouches has matching target");
		}, "touchend #" + touchend_received + ": at least one item in changedTouches targeted at this element");

		// TA: 1.5.3.2, 1.5.3.3
		test(function() {
			assert_true(ev.targetTouches.length >= 0, "targetTouches.length is non-negative");
			assert_true(ev.targetTouches.length <= ev.touches.length, "targetTouches.length is smaller than touches.length");
			check_list_subset_of_targetlist(ev.targetTouches, "targetTouches", ev.touches, "touches");
		}, "touchend #" + touchend_received + ": targetTouches is a subset of touches");

		// TA: 1.5.3.5 (new)
		test(function() {
			check_targets(ev.targetTouches, ev.target);
		}, "touchend #" + touchend_received + ": targets of targetTouches are correct");

		// In some cases, when multiple touch points are released simultaneously
		// the UA would dispatch the "same" touchend event (same changedTouches, same touches, but possibly different targetTouches)
		// to each of the elements that are starting elements of the released touch points.
		// in these situations, the subsequent events are exempt from TA 1.5.3.4 and 1.5.4.2
		var same_event_as_last = false;
		if (last_changedTouches && last_changedTouches.length==ev.changedTouches.length) {
			same_event_as_last = true; // assume true until proven otherwise
			for (i=0; i<last_changedTouches.length; i++) {
				var match = false;
				for (j=0; j<ev.changedTouches.length; j++)
					if (last_changedTouches.item(i) == ev.changedTouches.item(j)) {
						match = true;
						break;
					}
				if (!match)
					same_event_as_last = false;
			}
		}

		if (!same_event_as_last) {
			// TA: 1.5.3.4
			// Getting semi-random failures on this and 1.5.4.2.
			// See 1.5.4.2. Not sure if it's the same issue...
			test(function() {
				assert_true(last_targetTouches[ev.target.id].length > 0, "last received targetTouches.length is not zero");
				var diff_in_targetTouches = last_targetTouches[ev.target.id].length - ev.targetTouches.length;
				debug_print("diff_in_targetTouches=" + diff_in_targetTouches + "<br>");
				assert_true(diff_in_targetTouches > 0, "targetTouches.length is smaller than last received targetTouches.length");
				assert_true(diff_in_targetTouches <= ev.changedTouches.length, "change in targetTouches.length is smaller than changedTouches.length");
			}, "touchend #" + touchend_received + ": change in targetTouches.length is valid");

			// TA: 1.5.4.2
			// Getting semi-random failures on this and 1.5.3.4.
			// It looks like if fingers are lifted simultaneously, the "same" touchend event can be dispatched to two target elements
			// but adapted to the element (same touches, changedTouches but different targetTouches).
			// When one event is processed after another, ev.touches would end up being identical to last_touches, leading  to failure.
			// Question is why done() does not stop the processing of the latter event.
			test(function() {
				assert_true(last_touches.length > 0, "last received touches.length is not zero");
				var diff_in_touches = last_touches.length - ev.touches.length;
				debug_print("diff_in_touches=" + diff_in_touches + "<br>");
				assert_true(diff_in_touches > 0, "touches.length is smaller than last received touches.length");
				assert_equals(diff_in_touches, ev.changedTouches.length, "change in touches.length equals changedTouches.length");
			}, "touchend #" + touchend_received + ": change in touches.length is valid");
		}

		// TA: 1.6.4
		debug_print("touchend #" + touchend_received + ": TA 1.6.4<br>");
		test(function() {
			check_starting_elements(ev.changedTouches);
		}, "touchend #" + touchend_received + ": event dispatched to correct element<br>");

		debug_print("touchend #" + touchend_received + ": saving touch lists<br>");

		last_touches = ev.touches;
		last_targetTouches[ev.target.id] = ev.targetTouches;
		last_changedTouches = ev.changedTouches;

		debug_print("touchend #" + touchend_received + ": done<br>");
		if(ev.touches.length==0)
			done();
	});

	on_event(target0, "mousedown", function onMouseDown(ev) {
		test_mousedown.step(function() {
			assert_true(touchstart_received,
				"The touchstart event must be dispatched before any mouse " +
				"events. (If this fails, it might mean that the user agent does " +
				"not implement W3C touch events at all.)"
			);
		});
		test_mousedown.done();

		if (!touchstart_received) {
			// Abort the tests.  If touch events are not supported, then most of
			// the other event handlers will never be called, and the test will
			// time out with misleading results.
			done();
		}
	});
}
