var BD = BD || {};

BD.TouchController = function(element, handlers)
{
	element = $(element);
	var dom_element = element[0];
	
	var startX = null;
	var startY = null;
	
	var pageX = null;
	var pageY = null;
	
	var swipe_x_threshold = 100;
	var swipe_y_tolerance = 50;
	
	function cancel_touch()
	{
		dom_element.removeEventListener('touchmove', on_touch_move, false);
		dom_element.removeEventListener('touchend', on_touch_end, false);
		pageX = null;
		pageY = null;
		startX = null;
		startY = null;
	}

	function on_touch_start(event)
	{
		// Only handle one-point touches
		if (event.touches.length > 1)
		{
			cancel_touch();
		}
		else
		{
			dom_element.addEventListener('touchmove', on_touch_move, false);
			dom_element.addEventListener('touchend', on_touch_end, false);
			
			var touch = event.touches[0];
			startX = pageX = touch.pageX;
			startY = pageY = touch.pageY;
			
			try { handlers.start(event); } catch(e) {}
		}
	}
	
	function on_touch_move(event)
	{
		var touch = event.touches[0];
		var newX = touch.pageX;
		var newY = touch.pageY;
		var dx = newX - pageX;
		var dy = newY - pageY;
		
		pageX = newX;
		pageY = newY;
		 
		try { handlers.move(event, dx, dy); } catch(e) {}
	}
	
	function on_touch_end(event)
	{
		var dx = pageX - startX;
		var dy = pageY - startY;
		
		if (Math.abs(dx) >= swipe_x_threshold && Math.abs(dy) < swipe_y_tolerance)
		{
			var callback_name = dx < 0 ? 'swipeLeft' : 'swipeRight';
			try { handlers[callback_name]() } catch(e) {}
		}
	
		cancel_touch();
		try { handlers.end(event); } catch(e) {}
	}
	
	try { dom_element.addEventListener('touchstart', on_touch_start, false); } catch(e) {}
	
}
