/*
 *         loopedSlider 0.5.6 - jQuery plugin
 *        written by Nathan Searles
 *        http://nathansearles.com/loopedslider/
 *
 *        Copyright (c) 2009 Nathan Searles (http://nathansearles.com/)
 *        Dual licensed under the MIT (MIT-LICENSE.txt)
 *        and GPL (GPL-LICENSE.txt) licenses.
 *
 *        Built for jQuery library
 *        http://jquery.com
 *        Compatible with jQuery 1.3.2+
 *
 */

/*
 *        markup example for $("#loopedSlider").loopedSlider();
 *
 *        <div id="loopedSlider">
 *                <div class="container">
 *                        <div class="slides">
 *                                <div><img src="01.jpg" alt="" /></div>
 *                                <div><img src="02.jpg" alt="" /></div>
 *                                <div><img src="03.jpg" alt="" /></div>
 *                                <div><img src="04.jpg" alt="" /></div>
 *                        </div>
 *                </div>
 *                <a href="#" class="previous">previous</a>
 *                <a href="#" class="next">next</a>
 *        </div>
 *
*/

if(typeof jQuery != 'undefined') {
        jQuery(function($) {
                $.fn.extend({
                        loopedSlider: function(options) {
                                var settings = $.extend({}, $.fn.loopedSlider.defaults, options);

                                return this.each(
                                        function() {
                                        if($.fn.jquery < '1.3.2') {return;}
                                        var $t = $(this);
                                        var o = $.metadata ? $.extend({}, settings, $t.metadata()) : settings;

                                        var distance = 0;
                                        var times = 1;
                                        var slides = $(o.slides,$t).children().size();
                                        var width = $(o.slides,$t).children().outerWidth();
                                        var position = 0;
                                        var active = false;
                                        var number = 0;
                                        var interval = 0;
                                        var restart = 0;
                                        var pagination = $("."+o.pagination+" li a",$t);

                                        if(o.addPagination && !$(pagination).length){
                                                var buttons = slides;
                                                $($t).append("<ul class="+o.pagination+">");
                                                $(o.slides,$t).children().each(function(){
                                                        if (number<buttons) {
                                                                $("."+o.pagination,$t).append("<li><a rel="+(number+1)+" href=\"#\" >"+(number+1)+"</a></li>");
                                                                number = number+1;
                                                        } else {
                                                                number = 0;
                                                                return false;
                                                        }
                                                        $("."+o.pagination+" li a:eq(0)",$t).parent().addClass("active");
                                                });
                                                pagination = $("."+o.pagination+" li a",$t);
                                        } else {
                                                $(pagination,$t).each(function(){
                                                        number=number+1;
                                                        $(this).attr("rel",number);
                                                        $(pagination.eq(0),$t).parent().addClass("active");
                                                });
                                        }

                                        if (slides===1) {
                                                $(o.slides,$t).children().css({position:"absolute",left:position,display:"block"});
                                                return;
                                        }

                                        $(o.slides,$t).css({width:(slides*width)});

                                        $(o.slides,$t).children().each(function(){
                                                $(this).css({position:"absolute",left:position,display:"block"});
                                                position=position+width;
                                        });

                                        $(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:-width});

                                        if (slides>3) {
                                                $(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:-width});
                                        }

                                        if(o.autoHeight){autoHeight(times);}

                                        $(".next",$t).click(function(){
                                                if(active===false) {
                                                        animate("next",true);
                                                        if(o.autoStart){
                                                                if (o.restart) {autoStart();}
                                                                else {clearInterval(sliderIntervalID);}
                                                        }
                                                } return false;
                                        });

                                        $(".previous",$t).click(function(){
                                                if(active===false) {
                                                        animate("prev",true);
                                                        if(o.autoStart){
                                                                if (o.restart) {autoStart();}
                                                                else {clearInterval(sliderIntervalID);}
                                                        }
                                                } return false;
                                        });

                                        if (o.containerClick) {
                                                $(o.container,$t).click(function(){
                                                        if(active===false) {
                                                                animate("next",true);
                                                                if(o.autoStart){
                                                                        if (o.restart) {autoStart();}
                                                                        else {clearInterval(sliderIntervalID);}
                                                                }
                                                        } return false;
                                                });
                                        }

                                        $(pagination,$t).click(function(){
                                                if ($(this).parent().hasClass("active")) {return false;}
                                                else {
                                                        times = $(this).attr("rel");
                                                        $(pagination,$t).parent().siblings().removeClass("active");
                                                        $(this).parent().addClass("active");
                                                        animate("fade",times);
                                                        if(o.autoStart){
                                                                if (o.restart) {autoStart();}
                                                                else {clearInterval(sliderIntervalID);}
                                                        }
                                                } return false;
                                        });

                                        if (o.autoStart) {
                                                sliderIntervalID = setInterval(function(){
                                                        if(active===false) {animate("next",true);}
                                                },o.autoStart);
                                                function autoStart() {
                                                        if (o.restart) {
                                                        clearInterval(sliderIntervalID);
                                                        clearInterval(interval);
                                                        clearTimeout(restart);
                                                                restart = setTimeout(function() {
                                                                        interval = setInterval(        function(){
                                                                                animate("next",true);
                                                                        },o.autoStart);
                                                                },o.restart);
                                                        } else {
                                                                sliderIntervalID = setInterval(function(){
                                                                        if(active===false) {animate("next",true);}
                                                                },o.autoStart);
                                                        }
                                                };
                                        }

                                        function current(times) {
                                                if(times===slides+1){times = 1;}
                                                if(times===0){times = slides;}
                                                $(pagination,$t).parent().siblings().removeClass("active");
                                                $(pagination+"[rel='" + (times) + "']",$t).parent().addClass("active");
                                        };

                                        function autoHeight(times) {
                                                if(times===slides+1){times=1;}
                                                if(times===0){times=slides;}
                                                var getHeight = $(o.slides,$t).children(":eq("+(times-1)+")",$t).outerHeight();
                                                $(o.container,$t).animate({height: getHeight},o.autoHeight);
                                        };

                                        function animate(dir,clicked){
                                                active = true;
                                                switch(dir){
                                                        case "next":
                                                                times = times+1;
                                                                distance = (-(times*width-width));
                                                                current(times);
                                                                if(o.autoHeight){autoHeight(times);}
                                                                if(slides<3){
                                                                        if (times===3){$(o.slides,$t).children(":eq(0)").css({left:(slides*width)});}
                                                                        if (times===2){$(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:width});}
                                                                }
                                                                $(o.slides,$t).animate({left: distance}, o.slidespeed,function(){
                                                                        if (times===slides+1) {
                                                                                times = 1;
                                                                                $(o.slides,$t).css({left:0},function(){$(o.slides,$t).animate({left:distance})});
                                                                                $(o.slides,$t).children(":eq(0)").css({left:0});
                                                                                $(o.slides,$t).children(":eq("+(slides-1)+")").css({ position:"absolute",left:-width});
                                                                        }
                                                                        if (times===slides) $(o.slides,$t).children(":eq(0)").css({left:(slides*width)});
                                                                        if (times===slides-1) $(o.slides,$t).children(":eq("+(slides-1)+")").css({left:(slides*width-width)});
                                                                        active = false;
                                                                });
                                                                break;
                                                        case "prev":
                                                                times = times-1;
                                                                distance = (-(times*width-width));
                                                                current(times);
                                                                if(o.autoHeight){autoHeight(times);}
                                                                if (slides<3){
                                                                        if(times===0){$(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:(-width)});}
                                                                        if(times===1){$(o.slides,$t).children(":eq(0)").css({position:"absolute",left:0});}
                                                                }
                                                                $(o.slides,$t).animate({left: distance}, o.slidespeed,function(){
                                                                        if (times===0) {
                                                                                times = slides;
                                                                                $(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:(slides*width-width)});
                                                                                $(o.slides,$t).css({left: -(slides*width-width)});
                                                                                $(o.slides,$t).children(":eq(0)").css({left:(slides*width)});
                                                                        }
                                                                        if (times===2 ) $(o.slides,$t).children(":eq(0)").css({position:"absolute",left:0});
                                                                        if (times===1) $(o.slides,$t).children(":eq("+ (slides-1) +")").css({position:"absolute",left:-width});
                                                                        active = false;
                                                                });
                                                                break;
                                                        case "fade":
                                                                times = [times]*1;
                                                                distance = (-(times*width-width));
                                                                current(times);
                                                                if(o.autoHeight){autoHeight(times);}
                                                                $(o.slides,$t).children().fadeOut(o.fadespeed, function(){
                                                                        $(o.slides,$t).css({left: distance});
                                                                        $(o.slides,$t).children(":eq("+(slides-1)+")").css({left:slides*width-width});
                                                                        $(o.slides,$t).children(":eq(0)").css({left:0});
                                                                        if(times===slides){$(o.slides,$t).children(":eq(0)").css({left:(slides*width)});}
                                                                        if(times===1){$(o.slides,$t).children(":eq("+(slides-1)+")").css({ position:"absolute",left:-width});}
                                                                        $(o.slides,$t).children().fadeIn(o.fadespeed);
                                                                        active = false;
                                                                });
                                                                break;
                                                        default:
                                                                break;
                                                        }
                                                };
                                        }
                                );
                        }
                });
                $.fn.loopedSlider.defaults = {
                        container: ".container", //Class/id of main container. You can use "#container" for an id.
                        slides: ".slides", //Class/id of slide container. You can use "#slides" for an id.
                        pagination: "pagination", //Class name of parent ul for numbered links. Don't add a "." here.
                        containerClick: true, //Click slider to goto next slide? true/false
                        autoStart: 10, //Set to positive number for true. This number will be the time between transitions.
                        restart: 10, //Set to positive number for true. Sets time until autoStart is restarted.
                        slidespeed: 5000, //alter wert 300  - Speed of slide animation, 1000 = 1second.
                        fadespeed: 100, //alter wert 200 Speed of fade animation, 1000 = 1second.
                        autoHeight: 0, //Set to positive number for true. This number will be the speed of the animation.
                        addPagination: false //Add pagination links based on content? true/false
                };
        });
}
