﻿/*
 * jQuery Fincha Slider v0.1
 * http://www.fincha.com
 *
 * Copyright 2011, Dmitrij Matveev
 * Free to use and abuse under the MIT license.
 * http://www.opensource.org/licenses/mit-license.php
 * 
 * May 2011
 */

(function($) {
	var finchaSlider = function(element, options){
		//Defaults are below
		var settings = $.extend({}, $.fn.finchaSlider.defaults, options);

        //Useful variables. Play carefully.
        var vars = {
            currentSlide: 0,
            currentImage: '',
            totalSlides: 0,
            randAnim: '',
            running: false,
            paused: false,
            stop: false
        };
    
        //Get this slider
        var slider = $(element);
        slider.data('fincha:vars', vars);
        slider.css('position','relative');
        slider.addClass('finchaSlider');
        
        //Find our slider children
        var kids = slider.children();
        kids.each(function() {
            var child = $(this);
            var link = '';
            if(!child.is('img')){
                if(child.is('a')){
                    child.addClass('fincha-imageLink');
                    link = child;
                }
                child = child.find('img:first');
            }
            //Get img width & height
            var childWidth = child.width();
            if(childWidth == 0) childWidth = child.attr('width');
            var childHeight = child.height();
            if(childHeight == 0) childHeight = child.attr('height');
            //Resize the slider
            if(childWidth > slider.width()){
                slider.width(childWidth);
            }
            if(childHeight > slider.height()){
                slider.height(childHeight);
            }
            if(link != ''){
                link.css('display','none');
            }
            child.css('display','none');
            vars.totalSlides++;
        });
        
        //Set startSlide
        if(settings.startSlide > 0){
            if(settings.startSlide >= vars.totalSlides) settings.startSlide = vars.totalSlides - 1;
            vars.currentSlide = settings.startSlide;
        }
        
        //Get initial image
        if($(kids[vars.currentSlide]).is('img')){
            vars.currentImage = $(kids[vars.currentSlide]);
        } else {
            vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
        }
        
        //Show initial link
        if($(kids[vars.currentSlide]).is('a')){
            $(kids[vars.currentSlide]).css('display','block');
        }
        
        //Set first background
        slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');

        //Create caption
        slider.append(
            $('<div class="fincha-caption"><p></p></div>').css({ display:'none', opacity:settings.captionOpacity })
        );			
		
		// Process caption function
		var processCaption = function(settings){
			var finchaCaption = $('.fincha-caption', slider);
			if(vars.currentImage.attr('title') != ''){
				var title = vars.currentImage.attr('title');
				if(title.substr(0,1) == '#') title = $(title).html();	

				if(finchaCaption.css('display') == 'block'){
					finchaCaption.find('p').fadeOut(settings.animSpeed, function(){
						$(this).html(title);
						$(this).fadeIn(settings.animSpeed);
					});
				} else {
					finchaCaption.find('p').html(title);
				}					
				finchaCaption.fadeIn(settings.animSpeed);
			} else {
				finchaCaption.fadeOut(settings.animSpeed);
			}
		}
		
        //Process initial  caption
        processCaption(settings);
        
        //In the words of Super Mario "let's a go!"
        var timer = 0;
        if(!settings.manualAdvance && kids.length > 1){            
			timer = setInterval(function(){ finchaRun(slider, kids, settings, false); }, settings.pauseTime);
        }

        //Add Direction nav
		if(settings.directionNav){
			slider.append('<div class="fincha-directionNav"><div class="prev_back"><a class="fincha-prevNav">'+settings.prevText+'</a></div><div class="next_back"><a class="fincha-nextNav">'+settings.nextText+'</a></div></div>');
			if(settings.directionNavHide){
				$('.fincha-directionNav',slider).hide();
				slider.hover(function(){
					$('.fincha-directionNav',slider).show();
				},
				function(){
					$('.fincha-directionNav',slider).hide();
				});
			}
			$('a.fincha-prevNav',slider).live('click',function(){
				if(vars.running)return false;
				if(vars.currentSlide == 0)return false;
				clearInterval(timer);
				timer='';
				vars.currentSlide-=2;
				finchaRun(slider,kids,settings,'prev');
			});
			$('a.fincha-nextNav',slider).live('click',function(){
				if(vars.running)return false;
				clearInterval(timer);
				timer='';
				finchaRun(slider,kids,settings,'next');
			});
		}        
        //Add Control nav
        if(settings.controlNav) {
            var finchaControl = $('<div class="fincha-controlNav"></div>');
            slider.append(finchaControl);
            for(var i = 0; i < kids.length; i++){
                if(settings.controlNavThumbs){
                    var child = kids.eq(i);
                    if(!child.is('img')){
                        child = child.find('img:first');
                    }
                    if (settings.controlNavThumbsFromRel) {
                        finchaControl.append('<a class="fincha-control" rel="'+ i +'"><img src="'+ child.attr('rel') + '" alt="" /></a>');
                        /*
                        var partsOfurl = child.attr('src').split("/");
                        var lastPart = partsOfurl.length;
                        var newURL = "";
                        
                        for(var i =0; i < lastPart; i++)
                        {
                            if(i == (lastPart-1))
                            {
                                partsOfurl[i] = "thumbs/thumbs_"+partsOfurl[i]
                            }
                            
                            if(i != 0 && i != 1 && i != 2)
                            {
                                newURL += "/"+partsOfurl[i];
                            }
                        }
                        //console.log(newURL);
                        
						finchaControl.append('<a class="fincha-control" rel="'+i+'"><img src="'+newURL+'" alt="" /></a>');
						*/
                   } else {
                        //alert(child.attr('src'));
                        var partsOfurl = child.attr('src').split("/");
                        var lastPart = partsOfurl.length;
                        var newURL = "";
                        
                        for(var z =0; z < lastPart; z++)
                        {
                            if(z == (lastPart-1))
                            {
                                partsOfurl[z] = "thumbs/thumbs_"+partsOfurl[z]
                            }
                            
                            if(z != 0 && z != 1 && z != 2)
                            {
                                newURL += "/"+partsOfurl[z];
                            }
                        }
                        //console.log(newURL);
                        
						finchaControl.append('<a class="fincha-control" rel="'+ i +'"><img src="'+newURL+'" alt="" /></a>');
                    }
                    
                    //alert(child.attr('rel'));
                } else {
                    finchaControl.append('<a class="fincha-control" rel="'+ i +'">'+ (i + 1) +'</a>');
                }
                
            }
            //Set initial active link
            $('.fincha-controlNav a:eq('+ vars.currentSlide +')', slider).addClass('active');
			
            $('.fincha-controlNav a', slider).live("click", function(){
                if(vars.running)return false;
                if($(this).hasClass('active'))return false;
                clearInterval(timer);
                timer = '';
                slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');

                vars.currentSlide = $(this).attr('rel') - 1;
                finchaRun(slider, kids, settings, 'control');
                
                //alert("test");
            },
			function(){
				if(timer == '' && !settings.manualAdvance){
                    timer = setInterval(function(){ finchaRun(slider, kids, settings, false); }, settings.pauseTime);
                }
			});
        }
		
        //For pauseOnHover setting
        if(settings.pauseOnHover){
            slider.hover(function(){
                vars.paused = true;
                clearInterval(timer);
                timer = '';
            }, function(){
                vars.paused = false;
                //Restart the timer
                if(timer == '' && !settings.manualAdvance){
                    timer = setInterval(function(){ finchaRun(slider, kids, settings, false); }, settings.pauseTime);
                }
            });
        }
        
        //Event when Animation finishes
        slider.bind('fincha:animFinished', function(){ 
            vars.running = false; 
            //Hide child links
            $(kids).each(function(){
                if($(this).is('a')){
                    $(this).css('display','none');
                }
            });
            //Show current link
            if($(kids[vars.currentSlide]).is('a')){
                $(kids[vars.currentSlide]).css('display','block');
            }
            //Restart the timer
            if(timer == '' && !vars.paused && !settings.manualAdvance){
                timer = setInterval(function(){ finchaRun(slider, kids, settings, false); }, settings.pauseTime);
            }
            //Trigger the afterChange callback
            settings.afterChange.call(this);
        });
        
        // Add slices for slice animations
        var createSlices = function(slider, settings, vars){
            for(var i = 0; i < settings.slices; i++){
				var sliceWidth = Math.round(slider.width()/settings.slices);
				if(i == settings.slices-1){
					slider.append(
						$('<div class="fincha-slice"></div>').css({ 
							left:(sliceWidth*i)+'px', width:(slider.width()-(sliceWidth*i))+'px',
							height:'0px', 
							opacity:'0', 
							background: 'url("'+ vars.currentImage.attr('src') +'") no-repeat -'+ ((sliceWidth + (i * sliceWidth)) - sliceWidth) +'px 0%'
						})
					);
				} else {
					slider.append(
						$('<div class="fincha-slice"></div>').css({ 
							left:(sliceWidth*i)+'px', width:sliceWidth+'px',
							height:'0px', 
							opacity:'0', 
							background: 'url("'+ vars.currentImage.attr('src') +'") no-repeat -'+ ((sliceWidth + (i * sliceWidth)) - sliceWidth) +'px 0%'
						})
					);
				}
			}
        }		
		
        // Private run method
		var finchaRun = function(slider, kids, settings, nudge){
			//Get our vars
			var vars = slider.data('fincha:vars');
			
            //Trigger the lastSlide callback
            if(vars && (vars.currentSlide == vars.totalSlides - 1)){
				settings.lastSlide.call(this);
			}
            
            // Stop
			if((!vars || vars.stop) && !nudge) return false;
			
			//Trigger the beforeChange callback
			settings.beforeChange.call(this);
					
			//Set current background before change
			if(!nudge){
				slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
			} else {
				if(nudge == 'prev'){
					slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
				}
				if(nudge == 'next'){
					slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
				}
			}
			vars.currentSlide++;
			
			if(vars.currentSlide >= 2) {
				$('#head_slideInner').animate({ 'marginLeft' : 157*(2-vars.currentSlide) });
			}
			if(vars.currentSlide >= (vars.totalSlides-3)) {
				$('#head_slideInner').stop();
			}
            //Trigger the slideshowEnd callback
			if(vars.currentSlide == vars.totalSlides){
				vars.currentSlide = 0;
				settings.slideshowEnd.call(this);
				$('#head_slideInner').animate({ 'marginLeft' : 0 });
			}
			if(vars.currentSlide < 0) vars.currentSlide = (vars.totalSlides - 1);
			//Set vars.currentImage
			if($(kids[vars.currentSlide]).is('img')){
				vars.currentImage = $(kids[vars.currentSlide]);
			} else {
				vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
			}
			
			//Set active links
			if(settings.controlNav){
				$('.fincha-controlNav a', slider).removeClass('active');
				$('.fincha-controlNav a:eq('+ vars.currentSlide +')', slider).addClass('active');
			}
			
			//Process caption
			processCaption(settings);
			
			// Remove any slices from last transition
			$('.fincha-slice', slider).remove();
			
			// Remove any boxes from last transition
			//$('.fincha-box', slider).remove();
			
			//Run effects
			vars.running = true;
			
			if(settings.effect == 'fade' || vars.randAnim == 'fade'){
				createSlices(slider, settings, vars);
				
				var firstSlice = $('.fincha-slice:first', slider);
                firstSlice.css({
                    'height': '100%',
                    'width': slider.width() + 'px'
                });
    
				firstSlice.animate({ opacity:'1.0' }, (settings.animSpeed*2), '', function(){ slider.trigger('fincha:animFinished'); });
			}
		}
		
		// Shuffle an array
		var shuffle = function(arr){
			for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);
			return arr;
		}
        
        // For debugging
        var trace = function(msg){
            if (this.console && typeof console.log != "undefined")
                console.log(msg);
        }
        
        // Start / Stop
        this.stop = function(){
            if(!$(element).data('fincha:vars').stop){
                $(element).data('fincha:vars').stop = true;
                trace('Stop Slider');
            }
        }
        
        this.start = function(){
            if($(element).data('fincha:vars').stop){
                $(element).data('fincha:vars').stop = false;
                trace('Start Slider');
            }
        }
        
        //Trigger the afterLoad callback
        settings.afterLoad.call(this);
		
		return this;
    };
        
    $.fn.finchaSlider = function(options) {
    
        return this.each(function(key, value){
            var element = $(this);
            // Return early if this element already has a plugin instance
            if (element.data('finchaslider')) return element.data('finchaslider');
            // Pass options to plugin constructor
            var finchaslider = new finchaSlider(this, options);
            // Store plugin object in this element's data
            element.data('finchaslider', finchaslider);
        });

	};
	
	//Default settings
	$.fn.finchaSlider.defaults = {
		effect: 'fade',
		slices: 15,
		boxCols: 8,
		boxRows: 4,
		animSpeed: 500,
		pauseTime: 3000,
		startSlide: 0,
		directionNav: true,
		directionNavHide: true,
		controlNav: true,
		controlNavThumbs: false,
        controlNavThumbsFromRel: false,
		controlNavThumbsSearch: '.jpg',
		controlNavThumbsReplace: '_thumb.jpg',
		keyboardNav: false,
		pauseOnHover: true,
		manualAdvance: false,
		captionOpacity: 0.8,
		prevText: 'Prev',
		nextText: 'Next',
		beforeChange: function(){},
		afterChange: function(){},
		slideshowEnd: function(){},
        lastSlide: function(){},
        afterLoad: function(){}
	};
	
	$.fn._reverse = [].reverse;
	
})(jQuery);
