"use strict";
(function ($) {
	
	$.fn.productSlider = function (options) {
		
		return this.each(function() {
			
			$ = jQuery;
			
			if ($(this).hasClass('slider-ready')) { return true; } // if already initialised, skip to next instance
			
			var settings = {},
			$opts = $.extend({}, $.fn.productSlider.defaults, options);
			
			settings.$container = $(this);
			settings.$outerContainer = settings.$container.find($opts.outerContainerClass).first();
			settings.$innerContainer = settings.$container.find($opts.innerContainerClass).first();
			
			settings.$products = settings.$container.find($opts.productClass);
			settings.$numProducts = settings.$products.length;
			
			settings.slideAmount = 0;
			settings.slideTimeout = null;
			settings.isSliding = false;
			settings.enableSlide = false;
			settings.maxSlideOffset = 0;
			settings.currentOffset = 0;
			settings.target = "";
			settings.$maxSlides = 0;
			settings.slideIndex = 0;
			settings.$isIE6 = $.browser.msie && !$.support.opacity;
			
			if (settings.$isIE6) { settings.$container.addClass('isIE6'); }
			if (!settings.$container.hasClass('product-slider')) {settings.$container.addClass('product-slider');}
	
			if (settings.$numProducts > $opts.visible){ 
				settings.enableSlide = true;
				settings.$products.each(function(i){
					var x = (i / $opts.visible);
					if(parseInt(x) == x) {
						settings.$products.slice(i, (i+$opts.visible) ).wrapAll('<div class="' + $opts.slideClass.replace('.','') + ' slide_' + settings.$maxSlides + '"></div>');
						settings.$maxSlides++;
					}
				});
			}
			settings.$slides = settings.$container.find($opts.slideClass);
			settings.$container.addClass('slider-ready');
			
			// initialise once all settings and variables are set up
			$.fn.productSlider.init(settings, $opts);
		});
	}
	
	$.fn.productSlider.init = function(settings, $opts) {
		if (settings.enableSlide) {
			
			if (settings.$innerContainer.length == 0) { 
				settings.$innerContainer = $('<div class="product-slider-innercontainer" />');
				settings.$container.wrapInner(settings.$innerContainer); 
			} else {
				settings.$innerContainer.addClass('product-slider-innercontainer');
			}
			
			if (settings.$outerContainer.length == 0) { 
				settings.$outerContainer = $('<div class="product-slider-outercontainer" />');
				settings.$container.wrapInner(settings.$outerContainer); 
			} else {
				settings.$innerContainer.addClass('product-slider-innercontainer');
			}
			
			$("<div></div>").addClass('slide_button slide-previous').appendTo(settings.$container).click(function() {
				$.fn.productSlider.slide(settings, $opts, 'previous');
			});
			
			$("<div></div>").addClass('slide_button slide-next').appendTo(settings.$container).click(function() {
				$.fn.productSlider.slide(settings, $opts, 'next');
			});
			
			settings.$container.find(".slide_button").hover(function() {
				$(this).addClass('hover');
			}, function() {
				$(this).removeClass('hover');
			});
			
			settings.$innerContainer.css('margin-left', -settings.$slides.last().outerWidth(true));
			settings.$slides.last().prependTo(settings.$innerContainer);
			
			settings.$container.hover(function() {
				$.fn.productSlider.pause(settings, $opts);
			}, function() {
				$.fn.productSlider.start(settings, $opts);
			});
				
			$.fn.productSlider.start(settings, $opts);
			
		}
	}
	
	
	
	$.fn.productSlider.start = function(settings, $opts) {
		settings.$container.removeClass('slider-stop').addClass('slider-start');
		if ($opts.autoPlay) {
			settings.slideTimeout = setTimeout(function() {
				$.fn.productSlider.slide(settings, $opts)
			}, $opts.displayTime);
		}
	}
	

	$.fn.productSlider.pause = function(settings, $opts) {
		settings.$container.removeClass('slider-start').addClass('slider-stop');
		clearTimeout(settings.slideTimeout);
	};

	
	
	$.fn.productSlider.slide = function(settings, $opts, direction) {
		clearTimeout(settings.slideTimeout);
		
		if (settings.isSliding) { return } else { settings.isSliding = true; }
		
		settings.$slides = settings.$container.find($opts.slideClass);
		
		if (direction === "previous") {
			settings.slideIndex--;
			settings.slideAmount = settings.$slides.last().outerWidth(true);
			settings.$slides.last().css('margin-left', -settings.slideAmount).prependTo(settings.$innerContainer);
			settings.target = 0 + "px";	
		} else { // assume that if its not previous then has to be next
			settings.slideIndex++;
			settings.slideAmount = settings.$slides.first().outerWidth(true);
			settings.target = "-=" + settings.slideAmount + "px";
		}
		
		settings.$slides = settings.$container.find($opts.slideClass);
		
		settings.$slides.first().animate({
			'margin-left' : settings.target	
		}, $opts.transitionTime, function() {
			settings.isSliding = false;
			if (direction !== "previous") {
				$(this).appendTo(settings.$innerContainer).css('margin-left', 0);
			}
			if (!$(settings._this).hasClass('slider-stop')){
				$.fn.productSlider.start(settings, $opts);
			} else {clearTimeout(settings.slideTimeout);}
		});	
		
	}
	
	// Default settings. These can be overwritten by adding option array when calling plugin.
	$.fn.productSlider.defaults = {
		outerContainerClass: '',
		innerContainerClass: 'ul',
		productClass: 'li.prod',
		slideClass : '.slide-wrap',
		visible : 5,
		transitionTime : 1000,
		displayTime : 6000,
		autoPlay : false
	}
	

	
	$.fn.productSlider.plugin = {
		name : 'jQuery ProductSlider',
		version : 5,
		author: 'Daniel Moore / Paraspar Ltd'
	};
	
}(jQuery));
