jQuery(function($) {
	var EXP1_1 = Math.exp(1) - 1 // calculate only once
	var MAX_SPEED = 20; // set max speed in px
	var NO_SLDING_PADDING = 200; // area added right and left to view port center where no sliding is triggered (in px)
	
	$.fn.slide = function(options) {
	
		this.each(function() {
			var $stageOuter = $(this); // create stageOuter jQuery element with this
			var $stage = $stageOuter.children(); // create stage jQuery element

			var stageOuterOffset = $stageOuter.offset(); // read stageOuter offset (relative to document)

			var $lastPane = $stage.children(':last'); // get the last pane within stage 
			var lastPaneOffset = $lastPane.offset(); // read lastPane offset (relative to document)
		 	
			var speedX = 0; // init speed
			
			
			var interval; // interval object
			
			// start interval on mouse enter (event handler applied to stage)
			$stage.bind('mouseenter', function(event)
			{
			    if(interval)
			    {
			        window.clearInterval(interval);
			    }
				interval = window.setInterval(animate, 5); // =~ 66fps
			});
			
			// stop interval on mouse leave (event handler applied to stage)
			$stage.bind('mouseleave', function(event)
			{
				window.clearInterval(interval);
			});

			// calculate mouse speed during mouse movement (event handler applied to outer stage)
			$stageOuter.bind('mousemove', function(event)
			{
				var centerX = $stageOuter.width() / 2; // calculate center point on x-axis for outer stage
				var mouseX = event.clientX; // get current mouse position
				var ratioX = (mouseX - stageOuterOffset.left - centerX) / centerX; // calculate ratio			
				
				// add a black area where the mouse does not trigger any sliding
				if(mouseX - centerX >= NO_SLDING_PADDING || centerX - mouseX >= NO_SLDING_PADDING)
				{
    				if(ratioX >= 0)
    				{
    					// positive speed (move to right)
    					speedX = (Math.exp(ratioX) - 1) * (MAX_SPEED / EXP1_1);
    				}
    				else
    				{
    					// negative speed (move to left)
    					speedX = -(Math.exp(-ratioX) - 1) * (MAX_SPEED / EXP1_1);
    				}				    
				}
				else
				{
				    speedX = 0;
				}
				
			
			});
			
			// animation method
			function animate()
			{
				// slide if speed != 0 only!
				if(speedX != 0)
				{
					var marginLeftOld = $stage.css('marginLeft').replace(/px/,'') * 1; // read current marginLeft and strip "px"
					var marginLeftNew = Math.round(marginLeftOld - speedX);	// calculate new marginLeft by adding/ subtracting speed				
					
					// dont slide, if stage reached the start or end ...
					if(marginLeftNew > lastPaneOffset.left*-1 && marginLeftNew < 200) 
					{
						// update marginLeft with new marginLeft value
						$stage.css("marginLeft",  marginLeftNew + 'px');
					}										
				}
			}
		});
	};
});
