/**
 * =========================================================
 * jquery.fnmfade.js
 * =========================================================
 *
 * Date: 2011-09-22
 * Author: Christian Stöhr
 * Web: http://www.cms-develop.de/
 * Web: http://www.fnm.de/
 *
 *
 *  effects crossfade | fade  | slide
 *
 *
 *
 *
 **/
(function($) {

    $.fn.fnmfade = function(options) {
        return this.each(function() {
            $.fnmfade(this, options);
        });
    };
    
    $.fnmfade = function(container, options) {
        var settings = {
            'container': container, // container's data is used as state memory
            'speed': 'slow',
            'timeout': 2000,
            'containerheight': 'auto',
            'effect': 'crossfade',
            'runningclass': 'innerfade',
            'children': null,
            'next_selector': '.next',
            'prev_selector': '#if-prev',
            'slideToElements':'.slideto a.slidetoElem',
            'callback': null
        };
        
        $.data(settings.container, 'paused', false);
        if (options)
            $.extend(settings, options);
        
        if (settings.children === null)
            var elements = $(container).children();
        else
            var elements = $(container).children(settings.children);
        if (elements.length < 1) return;
        
        $.data(settings.container, 'current', 1);
        $.data(settings.container, 'last', 0);
        
        if (settings.pause_selector !== null) {
            $(settings.pause_selector).hover(function () {
                $.data(settings.container, 'paused', true);
            }, function () {
                $.data(settings.container, 'paused', false);
            });
        }
        /*
	$(settings.prev_selector).click(function(e) {
            e.preventDefault();
            current = $.data(settings.container, 'current') - 2;
            if (current < 0) current = elements.length + current; // js modulo for negative numbers is strange (in IE)
            $.data(settings.container, 'current', current);
            $.fnmfade.animate(elements, settings);
        });
        */
        $(settings.next_selector).click(function(e) {
            e.preventDefault();
            var current = $.data(settings.container, 'current');
            $.data(settings.container, 'last', current);
            $.data(settings.container, 'current', (current + 1) % elements.length);
            var interval = $.data(settings.container, 'interval');
            window.clearInterval(interval);
            $.fnmfade.Animate(elements, settings);
            $.fnmfade.startFade(elements, settings);
            
        });
        
        $(settings.slideToElements).click(function(e) {
            e.preventDefault();
            $.fnmfade.slideToElement( this ,elements, settings);
        });        
        $(container).css('position', 'relative').css('height', settings.containerheight).addClass(settings.runningclass);
        $(elements).each(
            function(key, value){ 
                $(value).css('z-index', String(elements.length)).css('position', 'absolute').hide();               
            }
        );
        $(elements[0]).show();
       
        $.fnmfade.startFade(elements, settings);
		
        if (typeof(settings.callback) == "function") {
            settings.callback(current, elements[current]);
        }        
    };
    $.fnmfade.startFade = function(elements, settings) {        
		var interval = window.setInterval(
            function(){
                $.fnmfade.next(elements, settings);
            }
        , settings.timeout );
        $.data(settings.container, 'interval', interval );
    }


    $.fnmfade.next = function(elements, settings) {       
        var current = $.data(settings.container, 'current');
        $.data(settings.container, 'last', current);
        $.data(settings.container, 'current', (current + 1) % elements.length);
        $.fnmfade.Animate(elements, settings);        
    }    
    $.fnmfade.getInternIdOfElement = function(elements, searchId ) {
        var ret = 0;
        $(elements).each(
            function( key, value ){                                
               if( $(value).attr('id') ==  searchId ){                                        
                    ret =  key;
               }
            }
        );          
        return ret;
    }    
    $.fnmfade.slideToElement = function(clickedElement , elements, settings) {
        current = $.data(settings.container, 'current');
        var interval = $.data(settings.container, 'interval');
        window.clearInterval(interval);
        var SlideTo = $(clickedElement).attr('changeto');
        var InternNew = $.fnmfade.getInternIdOfElement(elements, SlideTo );
        var last = $.data(settings.container, 'last'); 
	$.data(settings.container, 'last', current);
        $.data(settings.container, 'current', InternNew);
        $.fnmfade.Animate(elements, settings);
        $.fnmfade.startFade(elements, settings);
    }    
    $.fnmfade.Animate = function(elements, settings) {
        current = $.data(settings.container, 'current');
        last = $.data(settings.container, 'last');       
		if( $.data(settings.container, 'paused') == false ){
            switch(settings.effect){
                case "fade":
                    $(elements[last]).fadeOut(settings.speed,function(){
                        $(elements[current]).fadeIn(settings.speed);
                    });
                break;
                case "slide":
                    $(elements[last]).hide("slide", { direction: "left" },settings.speed);
                    $(elements[current]).show("slide", { direction: "right" }, settings.speed);                    
                break;
                default: // crossfade
                    $(elements[last]).fadeOut(settings.speed);
                    $(elements[current]).fadeIn(settings.speed);                    
                break;
            }
        }
    }   
})(jQuery);
