(function ($) {
	
	$.fn.lScroll = function () {
		if (this.length == 0 ) return this;
		var obj = $.data(this[0],'instace');
		if (typeof (obj) == "object"){
			obj.refrech();
			return obj;
		}else{
			this.each(function (i, elem) {
				var instance = new lScroll(elem);
				$.data(elem,'instace',instance);
			}); 						
		}
		return this;
	}
	

	/** constuct **/
	var lScroll = function (elem) {
			
		//ref this object
		var _this = this;
		
		//hold the jquery elemt
		var $elem = $(elem);
		
		var maxScrollWidht = $elem[0].scrollWidth;
		
		var bounce 		= 200;
		
		var startX 		= 0;
		var distX 		= 0;		
		var absDistX 	= 0;
		
		
		var currentX 	= 0;
		
		var deltaX		= 0;
		
		var haseForce	= false;
		
		$elem.on('mousedown', _start)
		$elem.on('mouseleave', _end)
		$elem.on('mousewheel', _wheel);
		
		$elem.scrollLeft(bounce);
		
		$elem.parent().find('.bn-left, .bn-right').remove();
		
		var leftBn = $('<a>')
						.addClass('bn-left')
						.css({'opacity':0.7})
						.click(function () {
							var offset = $elem.scrollLeft();
							$elem
								.stop()
								.animate({scrollLeft:offset-300},300);	
						})
						.appendTo($elem.parent());
		
		var rightBn = $('<a>')
						.addClass('bn-right')
						.css({'opacity':0.7})
						.click(function () {
							var offset = $elem.scrollLeft();
							$elem
								.stop()
								.animate({scrollLeft:offset+300},300);	
						})
						.appendTo($elem.parent());
						
		
		$(window).resize(_resize);
		_resize();
		
		
		function _start (e) {
			
			e.preventDefault();
			
			$elem.stop();
			
			startX = e.pageX;
			
			
			$elem.on('mousemove', _move);
			$elem.on('mouseup', _end);
		}
		
		
		
		
		function _move (e) {
			e.preventDefault();
			deltaX = e.pageX - startX;	
			_pos();
			startX = e.pageX;
		}
		
		
		function _wheel (e, wdelta) {
			deltaX = wdelta*80;
			_pos();
			_end(e);
		}
		
		
		function _pos () {

			var left = $elem.scrollLeft();
			
			if (left < bounce){
				var bDistX = bounce - left;
				var pDistX = 100 - ((bDistX * 100) / bounce);
				deltaX = (deltaX * pDistX)/100;
			}			
			
			
			if (left > maxScrollWidht - bounce){
				var bDistX =  left - (maxScrollWidht - bounce);
				var pDistX = 100 - ((bDistX * 100) / bounce);
				deltaX = (deltaX * pDistX)/100;		
			}
			
			
			$elem.scrollLeft(left += (deltaX*-1));
		}
		
		
		
		function _end (e) {
			e.preventDefault();
			
			var left = $elem.scrollLeft();
			
			if (left < bounce){
				$elem
					.stop()
					.animate({scrollLeft:bounce},300);
				haseForce = false;
			}
			

			if (left > maxScrollWidht - bounce){
				$elem
					.stop()
					.animate({scrollLeft:maxScrollWidht - bounce},300);
				haseForce = false;
			}



			$elem.off('mousemove', _move);
			$elem.off('mouseup', _end);
		}
		
		
		
		
		
		
		function _resize () {
			maxScrollWidht = $elem[0].scrollWidth - $elem.width();
		}
		
		
		this.refrech = function () {
			_resize();
			$elem.scrollLeft(bounce)
		}
		
	}

	
	
})(jQuery);


