(function($) {
		$.fn.extend({
			chemScroller: function(settings) {
			var defaults = {
					selectorContainerClass: 'themeSelector',
					selectorThemesClass: 'siteThemes',
					selectorSlideShowClass: 'themeSlideShow',
					selectorTitle: '<h2>View all Chemistry Views content in a theme...</h2>',
					leftScrollId: 'leftscroll',
					leftSelectorClass: 'leftSelector',
					leftSelectorText: 'Click to scroll left and see more Chemistry Themes',
					rightScrollId: 'rightscroll',
					rightSelectorClass: 'rightSelector',
					rightSelectorText: 'Click to scroll right and see more Chemistry Themes',
					itemThemeClass: 'theme',
					offScreenClass: 'offscreen',
					itemWidth: 100
	      	};
			var settings = $.extend(defaults, settings);
			var container = this;
			$('<div class="'+settings.selectorContainerClass+'">'+settings.selectorTitle+'<div class="'+settings.selectorThemesClass+'"><div class="'+settings.selectorSlideShowClass+'"></div></div></div>').insertAfter(this);
			var title = $(container).children('h3');
			var image = $(container).children('img');
			var paras = $(container).children('p');	
			var items = title.length;
			var scrolling = true;
			var dir = 'right';
			var handle;
			
			
			for(i=0; i < title.length; i++) {
				var theme = $('<div class="'+settings.itemThemeClass+'" id="scroller'+i+'"/>');
				$(title[i]).attr('class', settings.itemThemeClass+i);
				$(paras[i]).attr('class', settings.itemThemeClass+i);
				$('<h3>'+$(title[i]).html()+'</h3>').appendTo(theme);
				$(theme).css({'background' : 'url('+ $(image[i] ).attr("src") +') top left no-repeat', 'left' : settings.itemWidth*i}).appendTo('.'+settings.selectorSlideShowClass);
				var bindover = function(a) {
					$("#scroller"+a).bind('mouseover', function(e) {
						$("."+settings.itemThemeClass ).stop();
						$("."+ settings.selectorSlideShowClass).removeClass("animating");
						scrolling = false;
						$(container).children('h3').addClass(settings.offScreenClass);
						$(container).children('p').addClass(settings.offScreenClass);
						$("."+settings.itemThemeClass+a).removeClass(settings.offScreenClass);
					});
					$("#scroller"+a).bind('mouseout', function(e) {
						scrolling = true;
					});
				}(i);
			}
			$(this).children('h3').addClass(settings.offScreenClass);
			$(this).children('p').addClass(settings.offScreenClass);
			
			if((items * settings.itemWidth) > $(container).width()  ) {
				$('<p class="'+settings.leftSelectorClass+'"><a href="" id="'+settings.leftScrollId+'"><em>'+settings.leftSelectorText+'</em></a></p>').appendTo("."+settings.selectorThemesClass);
				$('<p class="'+settings.rightSelectorClass+'"><a href="" id="'+settings.rightScrollId+'"><em>'+settings.rightSelectorText+'</em></a></p>').appendTo("."+settings.selectorThemesClass);
				var sliderPos = $('.'+settings.selectorSlideShowClass).position();
				var leftEdge = sliderPos.left
				var rightEdge = Math.round((sliderPos.left + $('.'+settings.selectorSlideShowClass).width()+ (settings.itemWidth/2)) / settings.itemWidth) * settings.itemWidth;
				var scroll = function(amount, roll, time, dir, rollCond) {
					if(  $("."+ settings.selectorSlideShowClass).hasClass("animating") == false) {
						$("."+ settings.selectorSlideShowClass).addClass("animating");
						$('.'+settings.selectorSlideShowClass).children("div."+ settings.itemThemeClass).each( function(i) {
							var pos = $(this).position();
							var lPos = pos.left;
							var rollThis = false;
							if((dir === 'right' && pos.left    <= rollCond ) || (dir ==='left' && pos.left   >= rollCond ) ) {
									rollThis = true;
							}
							lPos = Math.round(   ((lPos / settings.itemWidth)  * settings.itemWidth) /100) *100;
							if(rollThis) {
								$(this).animate({'left': lPos + roll}, 0, "linear", function() { 
									pos = $(this).position();
									lPos = pos.left;
									lPos =  Math.round(lPos / settings.itemWidth) * settings.itemWidth;
									$(this).animate({ 'left' : lPos + amount }, time, "linear", function() {
										if(i+1 == items) {
											$("."+ settings.selectorSlideShowClass).removeClass("animating");
										}
									} ); 
								});
							}
							else {
								$(this).animate( { 'left' : lPos  + amount }, time, "linear", function() {
									if(i+1 == items) {
										$("."+ settings.selectorSlideShowClass).removeClass("animating");
									}
								});		
							}
						});
					}
					return scroll;
				};
				$("#" + settings.rightScrollId ).bind('click', function (e) {
					e.preventDefault();
					dir = 'right';
					$("."+settings.itemThemeClass ).stop();
					scrolling = false;
					if(  $("."+ settings.selectorSlideShowClass).hasClass("animating") == false) {				
						scroll(-settings.itemWidth, settings.itemWidth*items, 100, 'right', leftEdge  );
						clearTimeout(handle);
						handle = setTimeout( function() {
							dir = 'right';
							scrolling = true;
							if(  $("."+ settings.selectorSlideShowClass).hasClass("animating") == false) {
								looper();
							}
						}, 2000);
					}
					$("."+ settings.selectorSlideShowClass).removeClass("animating");	
				});
				$("#" + settings.leftScrollId).bind('click', function (e) {
					e.preventDefault();
					dir = 'left';
					$("."+settings.itemThemeClass ).stop();
					scrolling = false;
					if(  $("."+ settings.selectorSlideShowClass).hasClass("animating") == false) {				
						scroll(settings.itemWidth, (-settings.itemWidth*items), 100, 'left', rightEdge  );
						clearTimeout(handle);
	
						handle = setTimeout( function() {
							dir = 'left';
							scrolling = true;	
							if(  $("."+ settings.selectorSlideShowClass).hasClass("animating") == false) {
								looper();
							}
						}, 3500);
					}
					$("."+ settings.selectorSlideShowClass).removeClass("animating");				
				});
				var looper = function() {
					var amount = (dir === 'left') ? settings.itemWidth : -settings.itemWidth;
					var rollAmount = (dir === 'left') ? (-settings.itemWidth*items) : (settings.itemWidth*items);
					var rollCond = 	(dir === 'left') ? rightEdge : leftEdge - settings.itemWidth;		
					if(scrolling) {
						scroll(amount, rollAmount, 3500, dir, rollCond );
					}
					else {
						
						clearTimeout(handle);
					}
					handle = setTimeout( looper, 10);			
					return looper;
				};
				
				handle = setTimeout( looper, 10);
			}
	    }
	});
})(jQuery);
