(function( $ ){

	var $LNserialScroll = $.LNserialScroll = function( settings ){
		$.scrollTo.window().LNserialScroll( settings );
	};

	$LNserialScroll.defaults = {//the defaults are public and can be overriden.
		stopOnOver:true,
		start:0
	};


	$.fn.LNserialScroll = function( settings ){
		settings = $.extend( {}, $LNserialScroll.defaults, settings );

		return this.each(function(){
			var context = settings.target ? this : document,
				$pane = $(settings.target || this, context),
				pane = $pane[0],
				items = settings.items,
				moveTo = -1,
				itemWidth = 0;

			// Se obtiene los items que se "scrolearan"
			$items = settings.exclude ? LNgetItems().slice(0, -settings.exclude) : LNgetItems();
			itemWidth = $($items[0]).width();

			// Se ocultan los botones de Anterior/Siguiente si solo se tiene 1 item
			if ($items.length == 1) {
				if (settings.prev){ $(settings.prev).hide(); }
				if (settings.next){ $(settings.next).hide(); }
			// Se clonan el primero y ultimo elemento para simular el scroll infinito :D
			} else if ($items.length > 1) {
				// Se busca el padre del primer item
				$ItemParent = $($items[0]).parent();
				// Se le dice al padre que clone su ultimo hijo y lo pegue al inicio
				$ItemParent.prepend($($items[$items.length - 1]).clone());
				// Se le dice al padre que clone su primer hijo
				$ItemParent.append($($items[0]).clone());
				// Movemos el scroll hasta el elemento indicado como inicio
				settings.start = settings.start + 1;
				$pane.scrollLeft(( settings.start) * itemWidth);
				// Se recarga la lista de items 	
				//$items = settings.exclude ? LNgetItems().slice(0, -settings.exclude) : LNgetItems();
			}

			// Si esta en modo automativo y se indico que se pausara con 'Mouse Over'
			// entonces se asigna la funcion que hace eso
			//if( settings.stopOnOver && settings.interval ) {
			//	$pane.hover(function(){
			//		$(this).trigger('stop');
			//	},function(){
			//		$(this).trigger('start');
			//	});
			//}

			// Sobre escribe los eventos que este objeto requiere
			// para hacer el scroll infinito
			settings.cycle = false;
			settings.step = 1;
			settings.onBefore = function(e, elem, $pane, $items, pos ){
				if (moveTo == -1){
					if (pos == 0) {
						moveTo = $items.length - 2;
					} else if(pos == $items.length - 1) {
						moveTo = 1;
					}
				}
			};
			settings.onAfter = function(elem) {
				if (moveTo != -1) {
					var newScrollLeft = moveTo * itemWidth;
					$pane.scrollLeft(newScrollLeft);
					$pane.trigger('notify', [ moveTo ]);
					moveTo = -1;
				}
			};

			// Se crea el objeto serialScroll
			$pane.serialScroll( settings );

			function LNgetItems(){
				return $( items, pane );
			};
		});
	};
}) ( jQuery );
// ----------------------------------------------------------------