/*
 * 	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=\"#\" ></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;
					        });
					    }
					   
					   
					    function paginationClick() {
					        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.enableLink)
					        $(pagination, $t).click(paginationClick);
					    if (o.enableHover)
					        $(pagination, $t).hover(paginationClick, null);

					    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 (!o.fadeOnNextPrev) {
					                    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;
					                    });
					                }
					                else {
					                    if (times === slides + 1) {
					                        times = 1;
					                        distance = (-(times * width - width));
					                        current(times);
					                        if (o.autoHeight) { autoHeight(times); }
					                    }
					                    $(o.slides, $t).children().fadeOut(o.fadespeed, function() {
					                        for (var i = 0; i < slides; i++)
					                            $(o.slides, $t).children(":eq(" + i + ")").css({ left: i * width });
					                        $(o.slides, $t).css({ left: distance });
					                        $(o.slides, $t).children().fadeIn(o.fadespeed);
					                        active = false;
					                    });
					                }
					                break;
					            case "prev":
					                times = times - 1;
					                distance = (-(times * width - width));
					                current(times);
					                if (o.autoHeight) { autoHeight(times); }
					                if (!o.fadeOnNextPrev) {
					                    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;
					                    });
					                }
					                else {
					                    $(o.slides, $t).children().fadeOut(o.fadespeed, function() {
					                        if (times === 0) {
					                            times = slides;
					                            distance = (-(times * width - width));
					                            current(times);
					                            if (o.autoHeight) { autoHeight(times); }
					                        }
					                        $(o.slides, $t).children().fadeOut(o.fadespeed, function() {
					                            for (var i = 0; i < slides; i++)
					                                $(o.slides, $t).children(":eq(" + i + ")").css({ left: i * width });
					                            $(o.slides, $t).css({ left: distance });
					                            $(o.slides, $t).children().fadeIn(o.fadespeed);
					                            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.
            fadeOnNextPrev: false, //true if next and prev should be animated with fade
            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
            enableHover: false, // if true hover on pagination causes transition
            enableLink: false // if true clicking pagination navigates to the url
        };
        
    });
}
