/* rvnav.js */

;(function($) {

	$.fn.rvnav = function(options) {
		
		// private variables
		var defaults = {
			panLength: 500,
			panDelay: 500,
			springLength: 0, // Number of pixels to spring after navigating
			springDelay: 200,
			navLeftSelector: '.nav-left',
			navRightSelector: '.nav-right',
			navContainerSelector: '.nav-container',
			navCallBackFunct: null
		};  
		var options = $.extend(defaults, options);
		
		this.each(function() { // start constructor

			var obj = $(this);
			var inNav = false;
			
			var navLeft = function() {
				
				if( inNav ) {	return; }
				inNav = true;
				if( typeof options.navCallBackFunct == 'function'){
					var data = { id: obj.attr('id'), direction: 'left', offset: (Math.round( Math.abs($(options.navContainerSelector,obj).position().left) / options.panLength) * options.panLength) };
					var retuirned = options.navCallBackFunct.call(this, data);
					if( typeof returned == 'boolean' && returned == false ) {
						inNav = false;
						return;
					}
				}
				
				if( ($(options.navContainerSelector,obj).position().left + options.panLength ) > 0 ) {
					inNav = false;
					return;
				}
				
				$( options.navContainerSelector, obj ).animate({ left: '+='+options.panLength }, 
					options.panDelay, function() {
						if( options.springLength > 0 ) {
							$(options.navContainerSelector, obj).animate({
									left: '-='+ options.springLength
								}, options.springDelay, function() {
										$(options.navContainerSelector, obj).animate({
												left: '+='+options.springLength
											}, options.springDelay );
										inNav = false;
							});
						} // end if spring
						else { inNav = false; }
					} // End animatoin function
				); // end animation
			}
			
			var navRight = function() {
				
				if( inNav ) { return; }
				inNav = true;
				if( typeof options.navCallBackFunct == 'function'){
					var data = { id: obj.attr('id'), direction: 'right', offset: (Math.round( Math.abs($(options.navContainerSelector,obj).position().left) / options.panLength) * options.panLength) };
					var retuirned = options.navCallBackFunct.call(this, data);
					if( typeof returned == 'boolean' && returned == false ) {
						inNav = false;
						return;
					}
				}
				
				if( ($(options.navContainerSelector,obj).position().left - options.panLength ) <= ( $(options.navContainerSelector,obj).width() * -1) + options.panLength ) {
					inNav = false;
					return;
				}
				
				$( options.navContainerSelector, obj ).animate({ left: '-='+options.panLength }, 
					options.panDelay, function() {
						if( options.springLength > 0 ) {
							$(options.navContainerSelector, obj).animate({
									left: '+='+ options.springLength
								}, options.springDelay, function() {
										$(options.navContainerSelector, obj).animate({
												left: '-='+options.springLength
											}, options.springDelay );
										inNav = false;
							});
						} // end if spring
						else { inNav = false; }
					} // End animatoin function
				); // end animation
			}
			
			$( options.navLeftSelector, obj).click(function(e) {
				e.preventDefault();
				navLeft();
			});
			$( options.navRightSelector, obj).click(function(e) {
				e.preventDefault();
				navRight();
			}); // end right navigation
			
			/* START IP$d SUPPORT  */
			if( RegExp(" AppleWebKit/").test(navigator.userAgent) && RegExp(" Mobile/").test(navigator.userAgent) ) {
			
				$( options.navContainerSelector, obj ).bind('touchstart', function(e) {
					var startX = e.originalEvent.touches[0].pageX;
					var curX = startX;
						
					$( options.navContainerSelector, obj).bind('touchmove', function(e) {
						curX = e.originalEvent.touches[0].pageX;
						var distX = startX - curX;
						if( distX > 80 ) {
							startX = curX;
							navRight();
						} else if( distX < -80 ) {
							startX = curX;
							navLeft();
						}
					});
					
					$( options.navContainerSelector, obj).bind('touchend', function(e) {
						$( options.navContainerSelector, obj).unbind('touchend');
						$( options.navContainerSelector, obj).unbind('touchmove');
					});
				});
			} // End IP$d SUPPORT
		}); // End constructor
		
		// Private instance functions:
		
		return this;
	}; // End rvnav object
	
	// Private global functions:
	
})(jQuery);

