(function($) {
  $.fn.extend({
    contentScroller: function(settings) {
      var defaults = {
        offscreenClass 			: 'offscreen',
        prevLinkId     			: 'prev',
        nextLinkId     			: 'next',
        itemClass      			: 'item',
        titleTag       			: 'h3',
        contentTag     			: 'p',
        animClass      			: 'animating',
        clickClass     			: 'clicked',
        itemWidth      			: 940,
        animTime	   			: 1000,
        clickAnimTime  			: 100,
        pause         			: 5000,
        inludeLinks    			: true,
        leftLinkHtml   			: '<p><a href="#" id="prev">Previous</a></p>',
        rightLinkHtml  			: '<p><a href="#" id="next">Next</a></p>',
        includeSlideIndicator	: true,
        slideIndicatorId        : 'indicator',
        slideHighlightClass     : 'current',
        enableAutoScroll        : true
          };
      var settings = $.extend(defaults, settings);
      var container = this;
      var sliderPos = container.position();
      var leftEdge = sliderPos.left - settings.itemWidth;
      var rightEdge = Math.round((sliderPos.left + container.width()+ (settings.itemWidth/2)) / settings.itemWidth) * settings.itemWidth;
      var scrolling = true;
      var clickCount = 0;
      var dir = 'right';
      var handle;
      var items = container.children().length;
      container.children().each( function(x) {
        $(this).css({left: x * settings.itemWidth, position: 'absolute'});
      });
	  if(items > container.width()/settings.itemWidth) {
	      container.after(settings.leftLinkHtml);
	      container.after(settings.rightLinkHtml);
	  }
      if(settings.includeSlideIndicator) {
        var indicatorHtml = '<ul id="'+settings.slideIndicatorId+'">'
        var curr = ' ' + settings.slideHighlightClass;
        container.children().each( function(x) {
          indicatorHtml += '<li id="'+ settings.slideIndicatorId+(x)+'" class="'+curr+'"><span class="'+settings.offscreenClass+'">' + $(this).find(settings.titleTag).text() + '</span></li>';
          curr = '';
        });
        indicatorHtml += '</ul>';
        container.after(indicatorHtml);
      }

      var scroll = function(amount, roll, time, dir, rollCond, onComplete) {
        if(  container.hasClass(settings.animClass) == false) {
          container.addClass(settings.animClass);
          container.children("div."+ settings.itemClass).each( function(i) {
            var pos = $(this).position();
            var rollThis = false;
            if((dir === 'right' && pos.left <= rollCond +settings.itemWidth +1 ) || (dir ==='left' && pos.left >= rollCond - settings.itemWidth -1 ) ) {
                rollThis = true;
            }
            pos = $(this).position();
            if(rollThis) {
              var lPos = pos.left;
              lPos =  Math.round(lPos / settings.itemWidth) * settings.itemWidth;
              $(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(settings.includeSlideIndicator) {
					pos = $(this).position()
					var pleft = Math.round(pos.left);
					$("#debug").val($("#debug").val() + "   " +pleft);
					if((dir == 'left' && pleft == 0))  {
						$("#debug").val($("#debug").val() + "   <- left" );
						$('.' + settings.slideHighlightClass).removeClass(settings.slideHighlightClass);
						$('#' + settings.slideIndicatorId + i ).addClass(settings.slideHighlightClass);
					}else if((dir == 'right' && pleft == 0)) {
						$("#debug").val($("#debug").val() + "   <- right" );
						$('.' + settings.slideHighlightClass).removeClass(settings.slideHighlightClass);
						$('#' + settings.slideIndicatorId + i ).addClass(settings.slideHighlightClass);
					}
				}
                  if(i+1 == items) {
                    onComplete();
                  }
                } );
              });
            }
            else {
              var lPos = pos.left;
              lPos =  Math.round(lPos / settings.itemWidth) * settings.itemWidth;
              $(this).animate( { 'left' : lPos  + amount }, time, "linear", function() {
				if(settings.includeSlideIndicator) {
					pos = $(this).position()
					var pleft = Math.round(pos.left);
					$("#debug").val($("#debug").val() + "   " +pleft);
					if((dir == 'left' && pleft == 0))  {
						$("#debug").val($("#debug").val() + "   <- left" );
						$('.' + settings.slideHighlightClass).removeClass(settings.slideHighlightClass);
						$('#' + settings.slideIndicatorId + i ).addClass(settings.slideHighlightClass);
					}else if((dir == 'right' && pleft == 0)) {
						$("#debug").val($("#debug").val() + "   <- right" );
						$('.' + settings.slideHighlightClass).removeClass(settings.slideHighlightClass);
						$('#' + settings.slideIndicatorId + i ).addClass(settings.slideHighlightClass);
					}
				}
				if(i+1 == items) {
                  onComplete();
                  container.removeClass(settings.animClass);
                }
              });
            }
          });
        }
        return scroll;
      };
      $("#" + settings.nextLinkId ).bind('click', function (e) {
        e.preventDefault();
        dir = 'right';
        scrolling = false;
        clickCount++;
        if(  container.hasClass(settings.animClass) == false ) {
          clearTimeout(handle);
          scroll(-settings.itemWidth, settings.itemWidth*(items), settings.clickAnimTime, 'right', leftEdge - settings.itemWidth, function() {
            container.removeClass(settings.animClass);
            if(clickCount == 0) {
              clearTimeout(handle);
              if( settings.enableAutoScroll ) {
                handle = setTimeout( function() {
                  dir = 'right';
                  scrolling = true;
                  clearTimeout(handle);
                  looper();
                }, settings.pause );
              }
            }
          });
        }
        clickCount--;
      });
      $("#" + settings.prevLinkId).bind('click', function (e) {
        e.preventDefault();
        dir = 'left';
        scrolling = false;
        clickCount++;
        if(  container.hasClass(settings.animClass) == false) {
          clearTimeout(handle);
          scroll(settings.itemWidth, (-settings.itemWidth*(items)  ), settings.clickAnimTime, 'left', rightEdge, function() {
            container.removeClass(settings.animClass);
            if(clickCount == 0) {
              clearTimeout(handle);
              if( settings.enableAutoScroll ) {
                handle = setTimeout( function() {
                  dir = 'left';
                  scrolling = true;
                  clearTimeout(handle);
                  looper();
                }, settings.pause );
              }
            }
          });
        }
        clickCount--;
      });
      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 && clickCount == 0) {
          scroll(amount, rollAmount,  settings.animTime, dir, rollCond, function() {
            container.removeClass(settings.animClass);
          } );
        }
        clearTimeout(handle);
        handle = setTimeout( looper, settings.pause);
        return looper;
      };
      $(this).children(settings.titleTag).addClass(settings.offscreenClass);
      $(this).children(settings.contentTag).addClass(settings.offscreenClass);
      if( settings.enableAutoScroll && (items > container.width()/settings.itemWidth)  ) {
        handle = setTimeout( looper,  settings.pause);
      }
    }
  });
})(jQuery);
