/*
 * Class: magislider
 * Use: Element slider
 *
 * Copyright (c) 2010 Magico Software
 * Author: Martin Poucher
 * Company: Magico Software
 *
 * Version: 1.0
 * Created: 16th November 2010
 */

(function($){
    $.fn.magislider = function(options) {
	    var settings = $.extend({
	            navigationSelector: "ul#m_galleryNav",
	            navigationLinkSelector: "ul#m_galleryNav li a",
	            timeBetweenTransitions: 4000,
	            slideTime: 1000,
	            prevButtonClass: "prev",
	            nextButtonClass: "next",
	            activeLinkClass: "active",
	            isFade: false
	        },options),
	        baseSelector,
	        activeClass = "active",
	        sliderInterval,
	        totalWidth = 0;

        function startSlider(n) {
			$(n).children().children().each(function(indx, el) { totalWidth += $(el).width(); });	
			$(n).css({"overflow":"hidden"}).children().css({"width": totalWidth + "px"});
			$(n).children().children(":first").addClass(activeClass);
			setActiveLink(0);

			baseSelector = $(n);
			sliderInterval = setInterval(function() { showNextImage(); }, settings.timeBetweenTransitions);
        }
        
        function navigationLinkClicked() {
			var thisHref = $(this).attr("href").replace("#", ""),
			    prevImgIndex,
			    nextImgIndex;

			if (thisHref !== "") { 
			    setSpecificImage(parseInt(thisHref, 10)); 
			} else if ($(this).attr("class") === settings.prevButtonClass) {
				prevImgIndex = getActiveIndex();
				if (prevImgIndex < 0) {
				    prevImgIndex = 0;
				}
				setSpecificImage(prevImgIndex);
			} else if ($(this).attr("class") === settings.nextButtonClass) {
				nextImgIndex = getActiveIndex() + 2;
				if (nextImgIndex >= $(baseSelector).children().children().length) {
					nextImgIndex = $(baseSelector).children().children().length;
				}	
				setSpecificImage(nextImgIndex);
			}

			return false;
        }
        
        function startFader(n) {
			$(n).css({
			    overflow: "hidden", 
			    position: "relative"
			});
			
			$(n).children().children().each(function(i, img) {
			    $(img).css({
			        position: "absolute",
			        "z-index": 1000 - (i * 100)
			    });
			}).filter(":first").addClass(activeClass);
			
			setActiveLink(0);
			baseSelector = $(n);
			sliderInterval = setInterval(function() { showNextFadeImage(); }, settings.timeBetweenTransitions);
        }
        
	    function setSpecificImage(imgToDisplayIndex) {
		    clearInterval(sliderInterval);
            var currentActiveIndex = getActiveIndex();
            imgToDisplayIndex = imgToDisplayIndex - 1;

            if (currentActiveIndex !== imgToDisplayIndex) {
                if (settings.isFade) {
                    
                    var imgToDisplay = $(baseSelector).children().children(":eq(" + imgToDisplayIndex + ")"),
                        currentImg = $(baseSelector).children().children(":eq(" + currentActiveIndex + ")"),
                        startPos = (currentActiveIndex < imgToDisplayIndex ? currentActiveIndex : imgToDisplayIndex),
                        endPos = (currentActiveIndex < imgToDisplayIndex ? imgToDisplayIndex : currentActiveIndex),
                        i = 0;
                    
                    for (i = startPos + 1; i<endPos; i++) {
                        $(baseSelector).children().children(":eq(" + i + ")").hide();
                    }
                    
	                if (imgToDisplayIndex >= currentActiveIndex) {
	                    $(baseSelector).children().children(":eq(" + imgToDisplayIndex + ")").show();
	                    $(baseSelector).children().children(":eq(" + currentActiveIndex + ")").fadeOut(settings.slideTime, function() {
	                        setActiveImage(imgToDisplayIndex);
	                    });
	                } else {
	                    $(baseSelector).children().children(":eq(" + imgToDisplayIndex + ")").fadeIn(settings.slideTime, function() {
	                        $(this).next().show();
	                        setActiveImage(imgToDisplayIndex);
	                    });
		            }
		            
		            sliderInterval = setInterval(function() { showNextFadeImage(); }, settings.timeBetweenTransitions);
                } else {
		            var newLeftPos = 0,
		                j;
		                
		            for (j = 0; j<imgToDisplayIndex; j++) {
			            newLeftPos += $(baseSelector).children().children(":eq(" + j + ")").width();
		            }	

		            $(baseSelector).children(":first").animate({
			            "left": (newLeftPos * -1)
		            }, settings.slideTime, function() {
	                    setActiveImage(imgToDisplayIndex);
		            });
		            
		            sliderInterval = setInterval(function() { showNextImage(); }, settings.timeBetweenTransitions);
		        }
		    }
	    }
	    
	    function setActiveImage(imgToDisplayIndex) {
            $(baseSelector).children().children().removeClass(activeClass);
            $(baseSelector).children().children(":eq(" + imgToDisplayIndex + ")").addClass(activeClass);
            setActiveLink(imgToDisplayIndex);
        }

	    function showNextImage() {
		    var widthToInc = $(baseSelector).children().children("." + activeClass + ":first").width();
		    var currentLeftPos = parseFloat($(baseSelector).children(":first").css("left").replace("px", ""));
		    var newLeftPos = currentLeftPos - widthToInc;

		    if (newLeftPos <= (totalWidth * -1)) { newLeftPos = 0; }	

		    $(baseSelector).children(":first").animate({
			    "left": newLeftPos
		    }, settings.slideTime, setNextImage);
	    }
	    
	    function showNextFadeImage() {
	        var activeIndex = getActiveIndex();
	        
	        if (activeIndex >= $(baseSelector).children().children().length - 1) {
	            $(baseSelector).children().children(":first").fadeIn(settings.slideTime, function() {
	                $(baseSelector).children().children().show();
	                setNextImage();
	            });
	        } else {
	            $(baseSelector).children().children(":eq(" + activeIndex + ")").fadeOut(settings.slideTime, setNextImage);
		    }
	    }
	    
	    function setNextImage() {
	        var indexOfActive = $(baseSelector).children().children().index($(baseSelector).children().children("." + activeClass).removeClass(activeClass));
	        $(baseSelector).children().children(":eq(" + indexOfActive + ")").removeClass(activeClass);
	        indexOfActive++;

	        if (indexOfActive >= $(baseSelector).children().children().length) { indexOfActive = 0; }
	        $(baseSelector).children().children(":eq(" + indexOfActive + ")").addClass(activeClass);
	        setActiveLink(indexOfActive);
	    }
	    
	    function setActiveLink(indexActive) {
		    $(settings.navigationLinkSelector).removeClass(settings.activeLinkClass);
		    $(settings.navigationLinkSelector).filter(":not('.prev')").filter(":not('.next')").filter(":eq(" + indexActive + ")").addClass(settings.activeLinkClass);
	    }
	    
	    function getActiveIndex() {
		    return $(baseSelector).children().children().index($(baseSelector).children().children("." + activeClass));
	    }
	    
		return this.each(function(i,n) {
		    if (settings.isFade) {
		        startFader(n);
		    } else {
		        startSlider(n);
		    }
		    
			$(settings.navigationLinkSelector).click(navigationLinkClicked);        
		});
    };
}(jQuery));
