/**
 * @fileoverview frozCarousel plugin
 * @author Lawrence Natividad
 * @copyright Copyright ( c ) 2010 Frozynart Designs
 * @license Licensed under MIT ( http://www.frozynart.com/license/mit )
 * @version: 1.0 2010-09-27
 */
 
( function( $ ) {
    /**
     * <ul> passes must have ID
     * @namespace frozCarousel Plugin Namespace
     * @requires jQuery 1.2.6 and above / jQuery Easing / jquery Timer
     * @example jQuery( "#id-of-DIV-that-contains-UL-that-contains-LIs" ).frozCarousel();
     * @return {jQuery Object}
     */
    jQuery.fn.frozCarousel = function( options ) {
        var opts                            = jQuery.extend( {}, jQuery.fn.frozCarousel.defaults, options );
        jQuery.fn.frozCarousel.opts      = opts;
        var $this                           = jQuery( this );
        
        var mainDiv = null;
        var wrapper = null;
        var controlDiv = null
        var listCount = null;
        var mainTimer = null;
        
        if (parseInt(opts.autoSlide) > 0){
            opts.loop = true;
        }
        var mainWidth = jQuery('ul:first > li:first', $this).outerWidth() + opts.widthAdjust;
        var mainHeight = jQuery('ul:first > li:first', $this).outerHeight() + opts.heightAdjust;
        var sliderSetup = function(){
            $this.wrap('<div id="' + opts.identifier + '-wrapper"></div>');
            jQuery('#' + opts.identifier + '-wrapper').wrap('<div id="' + opts.identifier + '-main"></div>');
            mainDiv = jQuery('#' + opts.identifier + '-main');
            mainDiv.css({ position: 'relative'});
            jQuery('#' + $this.attr('id') + ' > ul').addClass(opts.identifier + '-main-link')
                                                    .css({ listStyleType: 'none', position: 'relative' });
            
            listCount = jQuery('.' + opts.identifier + '-main-link > li', $this).length;
            
            jQuery('#' + opts.identifier + '-wrapper').css({ height:   mainHeight,
                                                          width:    mainWidth,
                                                          overflow: 'hidden',
                                                          position: 'relative'
                                                       });
            if ( opts.controls === true){
                mainDiv.prepend('<div id="' + opts.identifier + '-controls"></div>');
                controlDiv = jQuery('div#' + opts.identifier + '-controls');
                
                if (opts.counter !== null){
                    controlDiv.prepend('<span class="' + opts.identifier + '-counter"></span>' );
                }
                
                if (opts.next !== 'Next'){        
                    controlDiv.append(opts.next);
                } else {
                    controlDiv.prepend('<a href="#" class="' + opts.identifier + '-next-btn">' + opts.next + ' </a>');
                }
                
                if (opts.prev !== 'Previous'){ 
                    controlDiv.prepend(opts.prev);
                } else {
                    controlDiv.prepend('<a href="#" class="' + opts.identifier + '-prev-btn">' + opts.prev + ' </a>');
                }
            }
            
        }
        
        var activate = function(count){
            if (count !== false){
                jQuery('.' + opts.identifier + '-main-link > li', $this).each( function(){
                    jQuery(this).removeClass(opts.activeClass);
                });
                jQuery('.' + opts.identifier + '-main-link > li:eq(' + count + ')', $this).addClass(opts.activeClass);
                jQuery('span.' + opts.identifier + '-counter')
                    .text((count + 1) + 
                          opts.counter + 
                          listCount );
            }
        }
        
        var setStarter = function(){
            teleportContent(opts.start);
            activate(opts.start);
            startAutoSlide();
        }
        
        var slideToContent = function(diff){
            stopAutoSlide();
            $this.stop(false, true);
            if( opts.vertical === false){
                 $this.animate({ left: '-=' + (diff * mainWidth) + 'px'});
            } else {
                 $this.animate({ top: '-=' + (diff * mainHeight) + 'px'});
            }
        }
        
        var slidePrev = function(){
            var count = findActive();
            if(count > 0){
                slideToContent(-1);
                activate(count - 1);
            } else {
                if ( (count === 0) && (opts.loop === true) ){
                    slideToContent(listCount - 1);
                    activate(listCount - 1);
                }
            }
        }
        
        var slideNext = function(){
            var count = findActive();
            if(count < (listCount - 1)){
                slideToContent(1);
                activate(count + 1);
            } else {
                if ( (count === (listCount - 1)) && (opts.loop === true) ){
                    slideToContent(-(listCount - 1));
                    activate(0);
                }
            }
        }
        
        var teleportContent = function(count){
            stopAutoSlide();
            $this.stop(false, true);
            if( opts.vertical === false){
                 $this.css({ position: 'relative', left: -(count * mainWidth) + 'px'});
            } else {
                 $this.css({ position: 'relative', top: -(count * mainHeight) + 'px'});
            }
        }
        
        var startAutoSlide = function(){
            if (parseInt(opts.autoSlide) > 0){  
                mainTimer = jQuery.timer( opts.autoSlide, function( timer ) { 
                    slideNext();
                    startAutoSlide();
                    timer.stop();
                });
            }
        }
        
        var stopAutoSlide = function(){
            if (parseInt(opts.autoSlide) > 0){
                if (mainTimer !== null){
                    mainTimer.stop();
                }
            }
        }
        
        var findActive = function(){
            var number = false
            jQuery('.' + opts.identifier + '-main-link > li', $this).each( function(){
                if (jQuery(this).hasClass(opts.activeClass)){
                    number =  jQuery(this).prevAll().length;
                }
            })
            return number;
        }
        
        var controlShowHide = function(duration){
            controlDiv.css({opacity: opts.hideOpacity});
            controlDiv.mouseenter( function(){
                jQuery(this).animate({opacity: opts.showOpacity}, duration)
            })
            controlDiv.mouseleave( function(){
                jQuery(this).animate({opacity: opts.hideOpacity}, duration)
            })
        }
        
        var indivShowHide = function(duration){
            jQuery('a', controlDiv).each( function(){
                jQuery(this).css({opacity: opts.hideOpacity});
                jQuery(this).mouseenter( function(){
                    jQuery(this).animate({opacity: opts.showOpacity}, duration)
                })
                jQuery(this).mouseleave( function(){
                    jQuery(this).animate({opacity: opts.hideOpacity}, duration)
                })
            })
        }
        
        /**
         * MAIN
         * 
         * 
         */
        sliderSetup();
        setStarter();
        
        if (opts.controlHide > 0){
            controlShowHide(opts.controlHide);
        } else if (opts.indivHide > 0){
            indivShowHide(opts.indivHide)
        }
        
        if ((opts.hoverHold === true) && (parseInt(opts.autoSlide) > 0)){
            $this.mouseover( function(){
                stopAutoSlide();
            }).mouseleave( function(){
                startAutoSlide();
            })
            
            controlDiv.mouseover( function(){
                stopAutoSlide();
            }).mouseleave( function(){
                startAutoSlide();
            })
        }
        
        jQuery('a.' + opts.identifier + '-prev-btn').click( function(){ 
            slidePrev();
            return false;
        });
        
        jQuery('a.' + opts.identifier + '-next-btn').click( function(){
            slideNext();
            return false;
        });
        
        return $this;
    };

    /** 
     * Sends a message to the console
     * @private
     */
    var _debug = function( message ) {
        if ( true === jQuery.fn.frozCarousel.opts.debug ) {
            console.log( message );
        }
    };
    
    jQuery.fn.frozCarousel.defaults =   {
        identifier: 'froz-carousel',
        activeClass: 'froz-carousel-active',
        btnActiveClass: 'froz-carousel-active-button',
        widthAdjust: 0,
        heightAdjust: 0,
        start: 0,
        loop: true,
        autoSlide: 0,
        hoverHold: true,
        vertical: false,
        controls: true,
        next: 'Next',
        prev: 'Previous',
        counter: '/',
        controlHide: 0,
        indivHide: 0,
        hideOpacity: 0.01,
        showOpacity: 1
    };
} )(jQuery);

