// JavaScript Document
$.extend($.support, {
    touch: typeof Touch == "object"
});




jQuery.Gestures = {
	
	trackingX: [],
	trackingY: [],
	currentlyTracking: [],
	gestureEvents:[],
	distance: 100,
	
	getMax: function(arr){
		var max= 0;
		for( var i=0; i< arr.length; i++){
			if(arr[i] > max) max = arr[i];	
		}
		return max;
	},
	
	getMin: function(arr){
		var min = 100000;
		for(var i=0; i< arr.length; i++){
			if(arr[i] < min) min = arr[i];	
		}
		return min;
	},
	
	beginGesture: function(e){
		e.preventDefault();
		$(this).mousemove(jQuery.Gestures.trackGesture);
		jQuery.Gestures.currentlyTracking.push(this);
		jQuery.Gestures.trackGesture.call(this, e);
	},
	
	endGesture: function(e){
		var id;
		$.each( jQuery.Gestures.currentlyTracking, function(i, el){
			id = $(el).attr('gesture:id');
			jQuery.Gestures.testGesture(el, jQuery.Gestures.trackingX[id], jQuery.Gestures.trackingY[id]);
			$(el).unbind('mousemove', jQuery.Gestures.trackGesture);
			jQuery.Gestures.trackingX[id] = [];
			jQuery.Gestures.trackingY[id] = [];
		});
		jQuery.Gestures.currentlyTracking = [];
	},
	
	testGesture: function(el, x, y){
		var startX = x[0];
		var endX = x[x.length-1];
		var startY = y[0];
		var endY = y[y.length-1];
		var maxY = jQuery.Gestures.getMax(y);
		var minY = jQuery.Gestures.getMin(y);
		var maxX = jQuery.Gestures.getMax(x);
		var minX = jQuery.Gestures.getMin(x);
		if( Math.abs(maxY - minY) < 51 && (startX - endX) > jQuery.Gestures.distance ){
			jQuery.Gestures.fireGesture(el, 'Left');
		}else if( Math.abs(maxY - minY) < 51 && (endX - startX) > jQuery.Gestures.distance){
			jQuery.Gestures.fireGesture(el, 'Right');
		}else if( Math.abs(maxX - minX) < 51 && (startY - endY) > jQuery.Gestures.distance){
			jQuery.Gestures.fireGesture(el, 'Up');
		}else if( Math.abs(maxX - minX) < 51 && (endY - startY) > jQuery.Gestures.distance){
			jQuery.Gestures.fireGesture(el, 'Down');
		}
	},
	
	trackGesture: function(e){
		var id = parseInt($(this).attr('gesture:id'));
		jQuery.Gestures.trackingX[id].push(e.clientX);
		jQuery.Gestures.trackingY[id].push(e.clientY);
		
	},
	
	fireGesture: function(el, gesture){
		$(el).trigger('mouseGesture'+gesture);
	},
	
	init: function(){
		jQuery.Gestures.trackingX.push( new Array() );
		jQuery.Gestures.trackingY.push( new Array() );
		var id = jQuery.Gestures.trackingX.length - 1;
		$(this).attr('gesture:id', id);
		$(this).mousedown( jQuery.Gestures.beginGesture );
		$(this).mouseup( jQuery.Gestures.endGesture );
		$(this).mouseleave( jQuery.Gestures.endGesture );
	}
	
}




jQuery.fn.gestures = function(){
	$(this).each( function(){
		jQuery.Gestures.init.call(this);				   
	});	
		
}



