/**
 *  slideRotator
 *  v2.7
 *  @author Davide Redaelli
 */
(function($) {
    $.fn.slideRotator = function(options) {
        var defaults = {
            content: '.content',
            caption: '.caption',
            link: '.link',
            hideLink: 'hide',
            width: 648,
            height: 200,
            time: 7000,
            timeAnimate:500,
            timeSlideCaption: 200,
            showControl: true,
            showArrow: false,
            continuos: false,
            effect: 'slide',
            sideCaption: false,
            sideCaptionWidth: false,
            stopOnBlur: true,
            stopOnSlideHover: true
        };
        var opts = $.extend(defaults, options);
        var slides = [];
        $(this).each(function() {
            var slide = new SlideRotator(this, opts);
            slides[slides.length] = slide;
        });
    };

    function SlideRotator(divSlide, opts) {
        this.init(divSlide, opts);
    }

    SlideRotator.prototype = {
        divSlide: false,
        ulSlide: false,
        ulSlidePaging: false,
        sideCaption:false,
        arrowLeft:false,
        arrowRight:false,
        pos:0,
        opts: false,
        act: 0,
        prev_act:0,
        numSlide: 0,
        play: false,
        init: function (divSlide, opts) {
            var obj=this;
            this.divSlide = $(divSlide);
            this.opts = opts;
            this.divSlide.addClass("j-sr_divSlide");
            this.divSlide.css({
                'width' : this.opts.width,
                'height' : this.opts.height
            });

            this.ulSlide=this.divSlide.children("ul:first");
            this.ulSlide.addClass("j-sr_ulSlide");
            this.ulSlide.children('li').addClass("j-sr_single");
            this.ulSlide.children('li').children(this.opts.content).addClass('j-sr_content');
            this.ulSlide.children('li').children(this.opts.caption).addClass('j-sr_caption');
            this.ulSlide.children('li').children(this.opts.link).addClass('j-sr_link');

            this.hideLinkOnStart(obj);

            this.numSlide = this.ulSlide.children("li.j-sr_single").size();
            totalWidth = this.opts.width * this.numSlide;
            pw_content=parseInt(this.ulSlide.children('li').children(this.opts.content).css('padding-left')) + parseInt(this.ulSlide.children('li').children(this.opts.content).css('padding-right'));
            ph_content=parseInt(this.ulSlide.children('li').children(this.opts.content).css('padding-top')) + parseInt(this.ulSlide.children('li').children(this.opts.content).css('padding-bottom'));
            pw_caption=parseInt(this.ulSlide.children('li').children(this.opts.caption).css('padding-left')) + parseInt(this.ulSlide.children('li').children(this.opts.caption).css('padding-right'));
            ph_caption=parseInt(this.ulSlide.children('li').children(this.opts.caption).css('padding-top')) + parseInt(this.ulSlide.children('li').children(this.opts.caption).css('padding-bottom'));

            //Adjust size
            this.ulSlide.css({
                'width' : totalWidth
            });
            this.ulSlide.children('li').css({
                'width' : this.opts.width-pw_content,
                'height' : this.opts.height-ph_content
            });
            this.ulSlide.children('li').children(this.opts.content).css({
                'width' : this.opts.width-pw_content,
                'height' : this.opts.height-ph_content
            });
            this.ulSlide.children('li').children(this.opts.caption).css({
                'width' : this.opts.width-pw_caption
            });

            //Side Caption
            if(this.opts.sideCaption && this.opts.sideCaptionWidth){
                this.divSlide.css({
                    'width' : this.opts.width+this.opts.sideCaptionWidth
                });
                this.sideCaption=$('<div class="j-sr_side_caption"/>');
                this.divSlide.append(this.sideCaption);
                this.sideCaption.css({
                    'width' : this.opts.sideCaptionWidth,
                    'height': this.opts.height,
                    'right':0
                });
                this.ulSlide.children('li').children(this.opts.caption).css({
                    'filter': 'alpha(opacity=100)',
                    '-moz-opacity': 1,
                    'opacity': 1,
                    //'background':'none', //commentato xke aggiunto fix ie7
                    'bottom':'auto',
                    'top':0,
                    'left' : this.opts.width,
                    'width' : this.opts.sideCaptionWidth-pw_caption
                });

                //fix z-index IE7
                if ($.browser.msie && $.browser.version.substr(0,1)<=7) {
                    this.sideCaption.remove();
                    this.ulSlide.children('li').children(this.opts.caption).css({
                        'height': this.opts.height
                    });
                    var zIndexNumber = this.ulSlide.children('li').css('z-index');
                    this.ulSlide.children('li').each(function() {
                        $(this).css('z-index', zIndexNumber);
                        zIndexNumber -= 1;
                    });
                }else{
                    this.ulSlide.children('li').children(this.opts.caption).css({
                        'background':'none'
                    });
                }
                //--
                this.ulSlide.children('li').children(this.opts.link).find('a').css({
                    'right' : -this.opts.sideCaptionWidth+'px'
                });
            }

            if(this.numSlide>1){
                //Adds paging
                this.ulSlidePaging=jQuery('<ul class="j-sr_paging"></ul>');
                for(ns=0;ns<this.numSlide;ns++){
                    this.ulSlidePaging.append('<li><a href="#" rel="'+ns+'">'+(ns+1)+'</a></li>');
                }
                this.divSlide.append(this.ulSlidePaging);
                this.ulSlidePaging.children('li').children("a").eq(0).addClass('active');
                if(!this.opts.showControl){
                    this.ulSlidePaging.hide();
                }
                for(ns=1;ns<this.numSlide;ns++){
                    if(this.opts.effect=='slide'){
                        this.ulSlide.children('li').eq(ns).children(this.opts.caption).slideUp(this.opts.timeSlideCaption);
                        this.ulSlide.children('li').eq(ns).children(this.opts.link).find('a').slideUp(this.opts.timeSlideCaption);
                    }
                    if(this.opts.effect=='fade'){
                        this.ulSlide.children('li').eq(ns).children(this.opts.caption).fadeOut(this.opts.timeSlideCaption);
                        this.ulSlide.children('li').eq(ns).children(this.opts.link).find('a').fadeOut(this.opts.timeSlideCaption);
                    }
                }
                if(this.opts.sideCaption){
                    this.ulSlidePaging.css({
                        'right':'auto',
                        'top':0,
                        'left' : 0
                    });
                }

                //Adds Arrow
                if(this.opts.showArrow){
                    this.arrowLeft=jQuery('<button class="j-sr_arrow aLeft">Prev</button>');
                    this.arrowRight=jQuery('<button class="j-sr_arrow aRight">Next</button>');
                    this.divSlide.append(this.arrowLeft);
                    this.divSlide.append(this.arrowRight);
                    this.pos=(this.opts.height/2)-parseInt(this.arrowLeft.height()/2);
                    this.arrowRight.css('top',this.pos);
                    this.arrowLeft.css('top',this.pos);
                    if(!this.opts.continuos && this.act==0){
                        this.arrowLeft.addClass("aDisabled");
                    }
                    this.onArrowHover(obj);
                    this.onArrowClick(obj);
                }
                //Set timer - this will repeat itself every opts.time
                if(this.opts.time){
                    obj.play = setInterval(function(){
                            obj.rotateSwitch(obj)
                        }, obj.opts.time);
                    $(window).focus(function() {
                        if(obj.play==false){
                            obj.play = setInterval(function(){
                                obj.rotateSwitch(obj)
                            }, obj.opts.time);
                        }   
                    });                                        
                    if(this.opts.stopOnBlur){
                        $(window).blur(function() {
                            clearInterval(obj.play);  //Stop the rotation
                            obj.play=false
                        });
                    }
                    if(this.opts.stopOnSlideHover){
                        this.stopOnHover(obj);
                    }
                }
                //Adds onPagingClick event
                this.onPagingClick(obj);
            }
            //Adds onLiSlideClick event
            this.onLiSlideClick(obj);
        },        
        //Hide Link
        hideLinkOnStart:function(obj){
            obj.ulSlide.children('li').each(function(){
                if($(this).children(obj.opts.link).hasClass(obj.opts.hideLink)){
                    $(this).children(obj.opts.link).hide();
                }
            });
        },
        //Rotation + Timing Event
        rotateSwitch: function (obj){
            obj.act++;
            if(obj.act>=obj.numSlide){
                obj.act=0;
            }
            obj.rotate(obj);
        },
        //Rotation
        rotate: function (obj){

            obj.prev_act = obj.ulSlidePaging.find('a.active').attr('rel');

            obj.ulSlidePaging.children('li').children('a').removeClass('active');
            obj.ulSlidePaging.children('li').children("a").eq(obj.act).addClass('active');
            reelPosition = obj.act * obj.opts.width;

            if(obj.opts.effect=='slide'){
                obj.ulSlide.children('li:eq('+obj.prev_act+')').children(obj.opts.caption).slideUp(obj.opts.timeSlideCaption);
                if(!obj.ulSlide.children('li').children(obj.opts.link).hasClass(obj.opts.hideLink)){
                    obj.ulSlide.children('li:eq('+obj.prev_act+')').children(obj.opts.link).find('a').slideUp(obj.opts.timeSlideCaption);
                }
            }
            if(obj.opts.effect=='fade'){
                obj.ulSlide.children('li:eq('+obj.prev_act+')').children(obj.opts.caption).fadeOut(obj.opts.timeSlideCaption);
                if(!obj.ulSlide.children('li').children(obj.opts.link).hasClass(obj.opts.hideLink)){
                    obj.ulSlide.children('li:eq('+obj.prev_act+')').children(obj.opts.link).find('a').fadeOut(obj.opts.timeSlideCaption);
                }
            }

            obj.ulSlide.animate(
            {
                left: -reelPosition
            },
            obj.opts.timeAnimate,
            function() {
                if(obj.opts.effect=='slide'){
                    obj.ulSlide.children('li:eq('+obj.act+')').children(obj.opts.caption).slideDown(obj.opts.timeSlideCaption);
                    if(!obj.ulSlide.children('li').children(obj.opts.link).hasClass(obj.opts.hideLink)){
                        obj.ulSlide.children('li:eq('+obj.act+')').children(obj.opts.link).find('a').slideDown(obj.opts.timeSlideCaption);
                    }
                }
                if(obj.opts.effect=='fade'){
                    obj.ulSlide.children('li:eq('+obj.act+')').children(obj.opts.caption).fadeIn(obj.opts.timeSlideCaption);
                    if(!obj.ulSlide.children('li').children(obj.opts.link).hasClass(obj.opts.hideLink)){
                        obj.ulSlide.children('li:eq('+obj.act+')').children(obj.opts.link).find('a').fadeIn(obj.opts.timeSlideCaption);
                    }
                }
            }
            );
            if(obj.opts.showArrow && !obj.opts.continuos){
                if(obj.act==0){
                    obj.arrowLeft.addClass("aDisabled");
                }else{
                    obj.arrowLeft.removeClass("aDisabled");
                }
                if(obj.act+1==obj.numSlide){
                    obj.arrowRight.addClass("aDisabled");
                }else{
                    obj.arrowRight.removeClass("aDisabled");
                }
            }
        },
        onPagingClick:function (obj){
            obj.ulSlidePaging.children('li').children('a').click(function() {
                obj.act=parseInt($(this).attr('rel'));
                obj.rotate(obj); // rotation immediately
                return false;
            });
        },
        onLiSlideClick: function (obj){
            obj.ulSlide.children('li').each(function(){
                if($(this).children(obj.opts.link).size()>0){
                    $(this).css("cursor","pointer");
                    $(this).hover(function() {
                        $(this).children(obj.opts.link).addClass("hover")
                    },function() {
                        $(this).children(obj.opts.link).removeClass("hover")
                    });
                    $(this).click(function() {
                        href=$(this).children(obj.opts.link).children("a:first").attr('href');
                        window.location=href;
                        return false;
                    });
                }
            });
        },
        stopOnHover:function(obj){
            obj.divSlide.hover(function() {
                clearInterval(obj.play);  //Stop the rotation
                obj.play=false
            }, function() {
                if(obj.play==false){
                obj.play = setInterval(function(){
                    obj.rotateSwitch(obj)
                }, obj.opts.time); //Set timer - this will repeat itself every opts.time
                }
            });
        },       
        onArrowClick:function (obj){
            obj.arrowRight.click(function() {
                if((obj.act+2)==obj.numSlide && !obj.opts.continuos){
                    $(this).addClass("aDisabled");
                }
                if((obj.act+1)==obj.numSlide){
                    if(obj.opts.continuos){
                        obj.act=0;
                    }else{
                        return false;
                    }
                }else{
                    obj.act=obj.act+1;
                    $(this).removeClass("aDisabled");
                }
                obj.rotate(obj); // rotation immediately
                return false;
            });
            obj.arrowLeft.click(function() {
                if((obj.act-1)==0 && !obj.opts.continuos){
                    $(this).addClass("aDisabled");
                }
                if((obj.act)==0){
                    if(obj.opts.continuos){
                        obj.act=obj.numSlide-1;
                    }else{
                        return false;
                    }
                }else{
                    obj.act=obj.act-1;
                    $(this).removeClass("aDisabled");
                }
                obj.rotate(obj); // rotation immediately
                return false;
            });
        },
        onArrowHover:function (obj){
            obj.arrowLeft.hover(function() {
                $(this).addClass("aHover");
            }, function() {
                $(this).removeClass("aHover");
            });
            obj.arrowRight.hover(function() {
                $(this).addClass("aHover");
            }, function() {
                $(this).removeClass("aHover");
            });
        }

    };
})(jQuery);
