/*
 * Slickslide 1.0
 *
 * Author: Ryan Seddon
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 */

(function($){
	$.fn.slickslide = function(options) {

		var defaults = {  
			speed: 1000,
			easing: false,
			baseWidth: 986,
			slideThis: ".slick-slide-inner",
			itemName: ".item",
			showThisManyItems: 1,
			showThisFirst: 0,
			nextButton: ".next",
			prevButton: ".prev",
			useIndicator: false,
			indicatorContainer: ".indicator01",
			indicatorType: "img",
			indicatorInActiveSrc: "assets/ico_dot01.gif",
			indicatorActiveSrc: "assets/ico_dot02.gif",
			autoSlide: false,
			autoSlideEvery: 3000,
			_global: {}
		};
		var options = $.extend(defaults, options);
		
		// Adds easing functionality, checks if easing plugin exists and easing option isn't false
		// http://gsgd.co.uk/sandbox/jquery/easing/
		if($.easing.def && options.easing) { $.easing.def = options.easing; }
		
		options._global.itemCount = $(options.slideThis).children(options.itemName).length;
		// Works out how many sets of items are there and rounds value off
		options._global.itemSets = Math.ceil(options._global.itemCount/options.showThisManyItems);
		// Works out width based on itemCount
		options._global.containerWidth = Math.round(options.baseWidth * (options._global.itemCount/options.showThisManyItems));
		// Works out max position scroller can move based on itemCount
		options._global.maxOffset = (-options._global.containerWidth / (options._global.itemCount/options.showThisManyItems))*(options._global.itemCount-1);
		options._global.currentPosition  = 0;
		
		options._global.isAnimating = false;
		options._global.isHover = false;
		options._global.itemNumber = 1;
		
		// Grabs query string and removes ? symbol
		options._global.queryString = location.search.substring(1,location.search.length);
		
		(options._global.itemCount > 1) ? $(options.nextButton + "," + options.prevButton).css({ visibility: "visible" }) : "";
		
		(options.useIndicator) 
			? 
				$(options.indicatorContainer).show()
				.find(options.indicatorType + ":eq(" + (options._global.itemNumber-1) + ")")
				.addClass("active")
			: 
				"";
		
		$(options.slideThis).css({width: options._global.containerWidth});
		
		if(options._global.itemCount > options.showThisManyItems) {
			// Allows you to select which item to show onload, and or control which item shows from a query string
			if(options._global.queryString.indexOf("showThisItem") !== -1) {
				$(options.slideThis).css({
					marginLeft: -(options.baseWidth * options._global.queryString.split("=")[1])
				});
				options._global.currentPosition = parseInt($(options.slideThis).css("margin-left"));
			} 
			else if(options.showThisFirst > 0 && options.showThisFirst !== options._global.itemCount) {
				$(options.slideThis).css({
					marginLeft: -(options.baseWidth * options.showThisFirst)
				});
				options._global.currentPosition = parseInt($(options.slideThis).css("margin-left"));
			}
			
			$(options.prevButton).click(function(event) {

				(options.autoSlide) ? window.clearInterval(autoScrollObject) : "";
				
				continuousScroll("previous");
				
				ffMacOverflowFix();
				
				if(!options._global.isAnimating) {
					options._global.isAnimating = true;
					(options._global.itemNumber === 1) ? options._global.itemNumber = options._global.itemCount : options._global.itemNumber--;
					
					checkSetIndicatorStatus();
					
					$(options.slideThis).animate({
						marginLeft: (options._global.currentPosition+options.baseWidth)
					}, options.speed, "swing",
						function () {
							if(options.autoSlide && !options._global.isHover) {
								autoScrollObject = window.setInterval(
									autoScroll
									,options.autoSlideEvery
								);
							}
							options._global.currentPosition = parseInt($(options.slideThis).css("margin-left"));
							options._global.isAnimating = false;
							ffMacOverflowFix();
						}
					);
				}
				event.preventDefault();
			});
			
			$(options.nextButton).click(function(event) {
				
				(options.autoSlide) ? window.clearInterval(autoScrollObject) : "";
				
				continuousScroll("next");
				ffMacOverflowFix();
				
				if(!options._global.isAnimating) {
					options._global.isAnimating = true;
					(options._global.itemNumber > options._global.itemCount-1) ? options._global.itemNumber = 1 : options._global.itemNumber++;
					
					checkSetIndicatorStatus();
					
					$(options.slideThis).animate({
						marginLeft: (options._global.currentPosition+(-options.baseWidth))
					}, options.speed, "swing",
						function () {
							if(options.autoSlide && !options._global.isHover) {
								autoScrollObject = window.setInterval(
									autoScroll
									,options.autoSlideEvery
								);
							}
							options._global.currentPosition = parseInt($(options.slideThis).css("margin-left"));
							options._global.isAnimating = false;
							ffMacOverflowFix();
						}
					);
				}
				
				event.preventDefault();
			});
		}
		if(options.autoSlide && options._global.itemCount > 1) {
			autoScrollObject = window.setInterval(
				autoScroll
				,options.autoSlideEvery
			);
			
			// Clears auto scroll object on hover and re-instates object on mouse out.
			$(this).hover( function () {
				window.clearInterval(autoScrollObject);
				options._global.isHover = true;
			}, function () {
				autoScrollObject = window.setInterval(autoScroll,options.autoSlideEvery);
				options._global.isHover = false;
			});
		}
		
		// Auto scroll functionality attached to a setInterval
		function autoScroll() {
			continuousScroll("next");
									
			if(!options._global.isAnimating && !options._global.isHover) {
				options._global.isAnimating = true;
				(options._global.itemNumber > options._global.itemCount-1) ? options._global.itemNumber = 1 : options._global.itemNumber++;
				
				checkSetIndicatorStatus();
				
				ffMacOverflowFix();
				
				$(options.slideThis).animate({
					marginLeft: (options._global.currentPosition-options.baseWidth)
				}, options.speed, "swing",
					function() {
						options._global.currentPosition = parseInt($(options.slideThis).css("margin-left"));
						options._global.isAnimating = false;
						ffMacOverflowFix();
					}
				);
			}
		}
		
		// Keeps items continuously scrolling, checks
		// which direction they are moving and sets margin 
		// left position.
		// Resets global variables to make sure animation
		// executes correctly.
		function continuousScroll(whichDirection) {
			var moveItemPosition;
			
			if(whichDirection === "previous" && options._global.currentPosition === 0) {
				moveItemPosition = options._global.maxOffset-options.baseWidth;
				$(options.slideThis).css({ marginLeft: moveItemPosition });
				options._global.currentPosition = moveItemPosition;
			}
			if(whichDirection === "next" && options._global.currentPosition === options._global.maxOffset) {
				moveItemPosition = options.baseWidth;
				$(options.slideThis).css({ marginLeft: moveItemPosition });
				options._global.currentPosition = moveItemPosition;
			}
		}
		
		// Checks indicator status and highlights which image is active.
		function checkSetIndicatorStatus(direction) {
			if(options.useIndicator) { 
				$(options.indicatorContainer).find(options.indicatorType).removeClass("active");
				$(options.indicatorContainer).find(options.indicatorType + ":eq(" + (options._global.itemNumber-1) + ")").addClass("active");
			}
		}
		
		// Hides sifr text on animate and re shows on animate callback 
		// to stop weird bug in ff2 on mac.
		function ffMacOverflowFix() {
			(navigator.platform.indexOf("Mac") !== -1 && $.browser.mozilla) ? $(options.slideThis).find("object").toggle() : "";
		}
	};
})(jQuery);