/*

Title:		jShowOff: a jQuery Content Rotator Plugin
Author:		Erik Kallevig
Version:	0.1.2
Website:	http://ekallevig.com/jshowoff
License: 	Dual licensed under the MIT and GPL licenses.

 */

(function(jQuery){
    jQuery.fn.jshowoff=function(settings){
        var config={
            animatePause:true,
            autoPlay:true,
            changeSpeed:600,
            controls:true,
            controlText:{
                play:'Play',
                pause:'Pause',
                next:'Next',
                previous:'Previous'
            },
            effect:'fade',
            hoverPause:true,
            links:true,
            speed:3000
        };

        if(settings)jQuery.extend(true,config,settings);
        if(config.speed<(config.changeSpeed+20)){
            alert('jShowOff: Make speed at least 20ms longer than changeSpeed; the fades aren\'t always right on time.');
            return this;
        };

        this.each(function(i){
            var $cont=jQuery(this);
            var gallery=jQuery(this).children().remove();
            var timer='';
            var counter=0;
            var preloadedImg=[];
            var howManyInstances=jQuery('.jshowoff').length+1;
            var uniqueClass='jshowoff-'+howManyInstances;
            var cssClass=config.cssClass!=undefined?config.cssClass:'';
            $cont.css('position','relative').wrap('<div class="jshowoff '+uniqueClass+'" />');
            var $wrap=jQuery('.'+uniqueClass);
            $wrap.css('position','relative').addClass(cssClass);
            jQuery(gallery[0]).clone().appendTo($cont);
            preloadImg();
            if(config.controls){
                addControls();
                if(config.autoPlay==false){
                    jQuery('.'+uniqueClass+'-play').addClass(uniqueClass+'-paused jshowoff-paused').text(config.controlText.play);
                };

        };

        if(config.links){
            addSlideLinks();
            jQuery('.'+uniqueClass+'-slidelinks a').eq(0).addClass(uniqueClass+'-active jshowoff-active');
        };

        if(config.hoverPause){
            $cont.hover(function(){
                if(isPlaying())pause('hover');
            },function(){
                if(isPlaying())play('hover');
            });
        };

        if(config.autoPlay&&gallery.length>1){
            timer=setInterval(function(){
                play();
            },config.speed);
        };

        if(gallery.length<1){
            jQuery('.'+uniqueClass).append('<p>For jShowOff to work, the container element must have child elements.</p>');
        };

        function transitionTo(gallery,index){
            var oldCounter=counter;
            if((counter>=gallery.length)||(index>=gallery.length)){
                counter=0;
                var e2b=true;
            }
            else if((counter<0)||(index<0)){
                counter=gallery.length-1;
                var b2e=true;
            }
            else{
                counter=index;
            }
            if(config.effect=='slideLeft'){
                var newSlideDir,oldSlideDir;
                function slideDir(dir){
                    newSlideDir=dir=='right'?'left':'right';
                    oldSlideDir=dir=='left'?'left':'right';
                };

                counter>=oldCounter?slideDir('left'):slideDir('right');
                jQuery(gallery[counter]).clone().appendTo($cont).slideIt({
                    direction:newSlideDir,
                    changeSpeed:config.changeSpeed
                    });
                if($cont.children().length>1){
                    $cont.children().eq(0).css('position','absolute').slideIt({
                        direction:oldSlideDir,
                        showHide:'hide',
                        changeSpeed:config.changeSpeed
                        },function(){
                        jQuery(this).remove();
                    });
                };

        }else if(config.effect=='fade'){
            jQuery(gallery[counter]).clone().appendTo($cont).hide().fadeIn(config.changeSpeed,function(){
                if(jQuery.browser.msie)this.style.removeAttribute('filter');
            });
            if($cont.children().length>1){
                $cont.children().eq(0).css('position','absolute').fadeOut(config.changeSpeed,function(){
                    jQuery(this).remove();
                });
            };

        }else if(config.effect=='none'){
            jQuery(gallery[counter]).clone().appendTo($cont);
            if($cont.children().length>1){
                $cont.children().eq(0).css('position','absolute').remove();
            };

    };

    if(config.links){
        jQuery('.'+uniqueClass+'-active').removeClass(uniqueClass+'-active jshowoff-active');
        jQuery('.'+uniqueClass+'-slidelinks a').eq(counter).addClass(uniqueClass+'-active jshowoff-active');
    };

};

function isPlaying(){
    return jQuery('.'+uniqueClass+'-play').hasClass('jshowoff-paused')?false:true;
};

function play(src){
    if(!isBusy()){
        counter++;
        transitionTo(gallery,counter);
        if(src=='hover'||!isPlaying()){
            timer=setInterval(function(){
                play();
            },config.speed);
        }
        if(!isPlaying()){
            jQuery('.'+uniqueClass+'-play').text(config.controlText.pause).removeClass('jshowoff-paused '+uniqueClass+'-paused');
        }
    };

};

function pause(src){
    clearInterval(timer);
    if(!src||src=='playBtn')jQuery('.'+uniqueClass+'-play').text(config.controlText.play).addClass('jshowoff-paused '+uniqueClass+'-paused');
    if(config.animatePause&&src=='playBtn'){
        jQuery('<p class="'+uniqueClass+'-pausetext jshowoff-pausetext">'+config.controlText.pause+'</p>').css({
            fontSize:'62%',
            textAlign:'center',
            position:'absolute',
            top:'40%',
            lineHeight:'100%',
            width:'100%'
        }).appendTo($wrap).addClass(uniqueClass+'pauseText').animate({
            fontSize:'600%',
            top:'30%',
            opacity:0
        },{
            duration:500,
            complete:function(){
                jQuery(this).remove();
            }
        });
}
};

function next(){
    goToAndPause(counter+1);
};

function previous(){
    goToAndPause(counter-1);
};

function isBusy(){
    return $cont.children().length>1?true:false;
};

function goToAndPause(index){
    $cont.children().stop(true,true);
    if((counter!=index)||((counter==index)&&isBusy())){
        if(isBusy())$cont.children().eq(0).remove();
        transitionTo(gallery,index);
        pause();
    };

};

function preloadImg(){
    jQuery(gallery).each(function(i){
        jQuery(this).find('img').each(function(i){
            preloadedImg[i]=jQuery('<img>').attr('src',jQuery(this).attr('src'));
        });
    });
};

function addControls(){
    $wrap.append('<p class="jshowoff-controls '+uniqueClass+'-controls"><a class="jshowoff-play '+uniqueClass+'-play" href="#null">'+config.controlText.pause+'</a> <a class="jshowoff-prev '+uniqueClass+'-prev" href="#null">'+config.controlText.previous+'</a> <a class="jshowoff-next '+uniqueClass+'-next" href="#null">'+config.controlText.next+'</a></p>');
    jQuery('.'+uniqueClass+'-controls a').each(function(){
        if(jQuery(this).hasClass('jshowoff-play'))jQuery(this).click(function(){
            isPlaying()?pause('playBtn'):play();
            return false;
        });
        if(jQuery(this).hasClass('jshowoff-prev'))jQuery(this).click(function(){
            previous();
            return false;
        });
        if(jQuery(this).hasClass('jshowoff-next'))jQuery(this).click(function(){
            next();
            return false;
        });
    });
};

function addSlideLinks(){
    $wrap.append('<p class="jshowoff-slidelinks '+uniqueClass+'-slidelinks"></p>');
    jQuery.each(gallery,function(i,val){
        var linktext=jQuery(this).attr('title')!=''?jQuery(this).attr('title'):i+1;
        jQuery('<a class="jshowoff-slidelink-'+i+' '+uniqueClass+'-slidelink-'+i+'" href="#null">'+linktext+'</a>').bind('click',{
            index:i
        },function(e){
            goToAndPause(e.data.index);
            return false;
        }).appendTo('.'+uniqueClass+'-slidelinks');
    });
};

});
return this;
};

})(jQuery);
(function(jQuery){
    jQuery.fn.slideIt=function(settings,callback){
        var config={
            direction:'left',
            showHide:'show',
            changeSpeed:600
        };

        if(settings)jQuery.extend(config,settings);
        this.each(function(i){
            jQuery(this).css({
                left:'auto',
                right:'auto',
                top:'auto',
                bottom:'auto'
            });
            var measurement=(config.direction=='left')||(config.direction=='right')?jQuery(this).outerWidth():jQuery(this).outerHeight();
            var startStyle={};

            startStyle['position']=jQuery(this).css('position')=='static'?'relative':jQuery(this).css('position');
            startStyle[config.direction]=(config.showHide=='show')?'-'+measurement+'px':0;
            var endStyle={};

            endStyle[config.direction]=config.showHide=='show'?0:'-'+measurement+'px';
            jQuery(this).css(startStyle).animate(endStyle,config.changeSpeed,callback);
        });
        return this;
    };

})(jQuery);

