/*
 * jSwipe - jQuery Plugin
 * http://plugins.jquery.com/project/swipe
 * http://www.ryanscherf.com/demos/swipe/
 *
 * Copyright (c) 2009 Ryan Scherf (www.ryanscherf.com)
 * Licensed under the MIT license
 *
 * $Date: 2009-07-14 (Tue, 14 Jul 2009) $
 * $version: 0.1
 * 
 * This jQuery plugin will only run on devices running Mobile Safari
 * on iPhone or iPod Touch devices running iPhone OS 2.0 or later. 
 * http://developer.apple.com/iphone/library/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511-SW5
 *
 * 2010-04-19 Francesc Galbany simple addition-> speed and swipe up/down
 */
(function($) {
	$.fn.swipe = function(options) {
		
		// Default thresholds & swipe functions
		var defaults = {
			threshold: {
				x: 30,
				y: 10
			},
			swipeLeft: function() {},
			swipeRight: function() {},
			swipeUp: function() {},
			swipeDown: function() {}
		};
		
		var options = $.extend(defaults, options);
		
		if (!this) return false;
		
		return this.each(function() {
			
			var me = $(this)
			
			// Private variables for each element
			var originalCoord = { x: 0, y: 0, t:0 }
			var finalCoord = { x: 0, y: 0, t:0 }
			
			// Screen touched, store the original coordinate
			function touchStart(event) {
				console.log('Starting swipe gesture...')
				originalCoord.x = event.targetTouches[0].pageX
				originalCoord.y = event.targetTouches[0].pageY
				originalCoord.t = new Date().getTime()
			}
			
			// Store coordinates as finger is swiping
			function touchMove(event) {
			    event.preventDefault();
				finalCoord.x = event.targetTouches[0].pageX // Updated X,Y coordinates
				finalCoord.y = event.targetTouches[0].pageY
				finalCoord.t = new Date().getTime()
			}
			
			// Done Swiping
			// Swipe should only be on X axis, ignore if swipe on Y axis
			// Calculate if the swipe was left or right
			function touchEnd(event) {
				console.log('Ending swipe gesture...')
				var changeY = originalCoord.y - finalCoord.y
				var changeX = originalCoord.x - finalCoord.x
				if(Math.abs(changeX) > Math.abs(changeY)){
					if(changeY < defaults.threshold.y && changeY > (defaults.threshold.y*-1)) {
						s = Math.abs(changeX/(finalCoord.t - originalCoord.t)); //Y coord speed despreciated
						if(changeX > defaults.threshold.x) {
							defaults.swipeLeft(s)
						}
						if(changeX < (defaults.threshold.x*-1)) {
							defaults.swipeRight(s)
						}
					}
				}else{
					if(changeX < defaults.threshold.x && changeX > (defaults.threshold.x*-1)) {
						s = Math.abs(changeY/(finalCoord.t - originalCoord.t)); //X coord speed despreciated
						if(changeY > defaults.threshold.y) {
							defaults.swipeUp(s)
						}
						if(changeY < (defaults.threshold.y*-1)) {
							defaults.swipeDown(s)
						}
					}
				}
			}
			
			// Swipe was canceled
			function touchCancel(event) { 
				console.log('Canceling swipe gesture...')
			}
			
			// Add gestures to all swipable areas
			this.addEventListener("touchstart", touchStart, false);
			this.addEventListener("touchmove", touchMove, false);
			this.addEventListener("touchend", touchEnd, false);
			this.addEventListener("touchcancel", touchCancel, false);
				
		});
	};
})(jQuery);
