/**
 * JQuery Plugin to ....
 */
(function($) {
	
	var sliderRootClass = 'sliderRoot';
	var sliderConfigKey = 'sliderConfig';
	var isAnimationRunning = false;
	
	var getSlider = function(element) {
		return $(element).closest('.'+sliderRootClass);
	};
	
	var getStepSize = function(slider) {
		var config = $(slider).data(sliderConfigKey);
		return $('.'+config.sliderElementClass,slider).first().outerWidth(true);
	}
	
	var getContentWidth = function(slider) {
		var config = $(slider).data(sliderConfigKey);
		var contentElement = $('.'+config.sliderContentClass,slider);
		return contentElement.width();
	};
	
	var getViewportWidth = function(slider) {
		var config = $(slider).data(sliderConfigKey);
		var viewportElement = $('.'+config.sliderViewportClass,slider);
		return viewportElement.width();		
	};
	
	var isLeft = function(slider) {
		var config = $(slider).data(sliderConfigKey);
		var contentElement = $('.'+config.sliderContentClass,slider);
		var maxLeft = (getContentWidth(slider)-getViewportWidth(slider))*-1;
		if (contentElement.position().left > maxLeft) {
			return false;
		}
		return true;
	};
	
	var isRight = function(slider) {
		var config = $(slider).data(sliderConfigKey);
		var contentElement = $('.'+config.sliderContentClass,slider);
		if (contentElement.position().left >= 0) {
			return true;
		}
		return false;
	};	
		
	var slideLeft = function(elementInSlider) {
		if (isAnimationRunning) {
			return false;
		}
		var slider = getSlider(elementInSlider);
		var config = $(slider).data(sliderConfigKey);
		if (isLeft(slider)) {
			return false;
		}
		isAnimationRunning = true;
		var contentElement = $('.'+config.sliderContentClass,slider);
		var currentLeft = contentElement.position().left;
		contentElement.animate({
			'left': currentLeft-getStepSize(slider)
		},config.stepTime,'linear',function() {
			isAnimationRunning = false;
		});
	};	
	
	var slideRight = function(elementInSlider) {
		if (isAnimationRunning) {
			return false;
		}		
		var slider = getSlider(elementInSlider);
		var config = $(slider).data(sliderConfigKey);
		if (isRight(slider)) {
			return false;
		}
		isAnimationRunning = true;
		var contentElement = $('.'+config.sliderContentClass,slider);
		var currentLeft = contentElement.position().left;
		contentElement.animate({
			'left': currentLeft+getStepSize(slider)
		},config.stepTime,'linear',function() {
			isAnimationRunning = false;
		});		
	};
	
	$.fn.slider = function(options) {
	       var config = jQuery.extend({
	            // Default options:
	            'sliderLeftClass': 'sliderLeft',
	            'sliderRightClass': 'sliderRight',
	            'sliderContentClass': 'sliderContent',
	            'sliderViewportClass': 'sliderViewport',
	            'sliderElementClass': 'sliderElement',
	            'stepTime': 1000
	        }).extend(options);

	       	$(this).addClass(sliderRootClass);
	       	$(this).data(sliderConfigKey,config);
	       	$('.'+config.sliderContentClass,this).css('left','0px');
	       	
	       	// Slide left button
	       	$('.'+config.sliderRightClass,this).click(function(e){
	       		if(e.pageX >= 950) {
	       			slideLeft($(this));
	       		}
	       	});
	       	// Slide right button
	       	$('.'+config.sliderLeftClass,this).click(function(e) {
	       		if(e.pageX <= 285) {
	       			slideRight($(this));
	       		}
	       	});
	       	
			var elements = $('.'+config.sliderElementClass,this); 
			var width = elements.size() * elements.first().outerWidth(true);
			$('.'+config.sliderContentClass,this).css('width',width+'px');
	};      
	
})(jQuery);
