jQuery.fn.jlsProductScroller = function(options) {
		
		var $j = jQuery;
		var defaults = {
		  'delay': 2000,
		  'duration': 1000,
		  'mouseOverStop': true,
		  'showControls': true,
		  'scrollItems': 1,
		  'autoScroll': true
		};
		
		if ( options ) { $j.extend( defaults, options ); }
		
		var interval;
		
		/* JS PRODUCT SCROLLER */
		
		/*########################
			Get Item Offsets
		########################## */
		function getOffsets(s){
			var borderL = s.find('div').css('borderLeftWidth');	borderL = Math.floor(borderL.substring(0, borderL.length-2));
			if (isNaN(borderL)) borderL = 0;
			var borderR = s.find('div').css('borderRightWidth'); borderR = Math.floor(borderR.substring(0, borderR.length-2));
			if (isNaN(borderR)) borderR = 0;
			var paddingL = s.find('div').css('paddingLeft'); paddingL = Math.floor(paddingL.substring(0, paddingL.length-2));
			var paddingR = s.find('div').css('paddingRight'); paddingR = Math.floor(paddingR.substring(0, paddingR.length-2));
			var marginL = s.find('div').css('marginLeft'); marginL = Math.floor(marginL.substring(0, marginL.length-2));
			var marginR = s.find('div').css('marginRight'); marginR = Math.floor(marginR.substring(0, marginR.length-2));
			//console.log('ggggg: ' +[borderL, borderR, paddingL, paddingR, marginL, marginR].join());
			var offset = parseFloat(Math.floor(borderL + borderR + paddingL + paddingR + marginL + marginR), 10);
			//console.log(offset);
			return offset;
		}
		
		
		// DO SCROLL
		function scrollFunc(s, fw, si, siw, delay, duration, direction) {
			/*
				s				// the selector for items
				fw 	// Width of the first item, all should be same width.
				si 	// The number of scrolling items
				siw // THe width of all items together
				delay // the delay between each scroll
				duration // the duration of animation
				
			*/
			
			var scrollamount = Math.floor(fw * si); // How much it should scroll at a time.
			var leftPos = parseInt(s.css("left").substring(0, s.css("left").indexOf("px"))); // STRIP PX FROM END
			var slideritemsWidthMin = '-' + siw; // Now - position left the items.
			
			if(leftPos <= slideritemsWidthMin) {s.css("left", "0");}
			
			// IF LEFT
			if(direction == 'left' && leftPos < 0 && leftPos != '-' + siw) {
				clearInterval(interval);
				s.animate({left: '+=' + scrollamount}, duration, function(){ showHideControls() });
				if( autoScroll == true ) interval = setInterval(function() {scrollFunc(s, fw, si, siw, delay, duration, 'default')}, delay);
			}
			
			// IF RIGHT
			if(direction == 'right' && leftPos <= siw && leftPos != siw) {
				clearInterval(interval);
				s.animate({left: '-=' + scrollamount}, duration, function(){ showHideControls() });
				if( autoScroll == true ) interval = setInterval(function() {scrollFunc(s, fw, si, siw, delay, duration, 'default')}, delay);
			}
			
			// IF ITS DEFAULT SETTING (NOT LEFT OR RIGHT)
			if (direction == 'default') {
				s.animate({left: '-=' + scrollamount}, duration, function(){ showHideControls() });
			}
		}
		
		
		function initSizes(s, fw){
			var ni = s.children('div').size(); // Number of items
			var slideritemsWidth = Math.floor(fw * ni); // fw = first item width, ni = number of items
			var slideritemsWidthTimes = Math.floor(fw * ni * 2); // Width it should be. By 2
			var sliderItems = s.html();
			
			s.width(slideritemsWidthTimes); // set the width of the row to 2x what it should be
			s.html(sliderItems + sliderItems); // repeat the row so make a seamless loop
			//console.log(slideritemsWidth);
			return slideritemsWidth;
		}
		
		function showHideControls(){
			if(defaults.showControls == true){
				
				var leftPos = parseInt(s.css("left").substring(0, s.css("left").indexOf("px")));
				
				if( leftPos >=  0) { cs.find('.controlLeft').fadeOut(); } else { cs.find('.controlLeft').fadeIn(); }
				if( leftPos >=  siw) { cs.find('.controlRight').fadeOut(); } else { cs.find('.controlRight').fadeIn(); }
			
			}
			
		}
		
		
			var cs = $j(this);
			var s = $j(this).find('.row'); // should be when live $j(this).find('.row');
			var itemOffset = getOffsets(s);
			var fw = s.find('div').width() + itemOffset; // Item Width
			var siw = initSizes(s, fw);
			var si = defaults.scrollItems;
			var delay = defaults.delay;
			var duration = defaults.duration;
			var autoScroll = defaults.autoScroll;
	
	
			if( autoScroll == true ) interval = setInterval(function() {scrollFunc(s, fw, si, siw, delay, duration, 'default', interval)}, delay);
			
			
			/* MOUSE OVER STOP */
			if(defaults.mouseOverStop == true && autoScroll == true){
				s.bind({
					'mouseenter': function(){ clearInterval(interval); },
					'mouseleave': function(){interval = setInterval(function() {scrollFunc(s, fw, si, siw, delay, duration, 'default')}, delay);}
				});
			}
			
			/* SHOW CONTROLS */
			if(defaults.showControls == true){
				cs.find('.controlLeft').show().click(function() {	scrollFunc(s, fw, si, siw, delay, duration, 'left') });
				cs.find('.controlRight').show().click(function() {	scrollFunc(s, fw, si, siw, delay, duration, 'right') });	
			}
			else {
				cs.find('.controlLeft').hide();
				cs.find('.controlRight').hide();
			}
			
	
			$j(function(){ showHideControls() });
			
	
};

