/*
 * 	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: 0, //Set to positive number for true. This number will be the time between transitions.
            restart: 0, //Set to positive number for true. Sets time until autoStart is restarted.
            slidespeed: 300, //Speed of slide animation, 1000 = 1second.
            fadespeed: 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
        };
    });
}
