/*
 * 	loopedSlider 0.5.1 - 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.
 *
 */
(function ($) {
    $.fn.loopedSlider = function (options) {
        var defaults = {
            container: '.container',
            slides: '.slides',
            pagination: '.pagination',
            containerClick: true,
            autoStart: 0,
            slidespeed: 300,
            fadespeed: 300,
            autoHeight: false
        };
        this.each(function () {
            var obj = $(this);
            var o = $.extend(defaults, options);
            var pagination = $(o.pagination + ' li a', obj);
            var m = 0;
            var t = 1;
            var s = $(o.slides, obj).children().size();
            var w = $(o.slides, obj).children().outerWidth();
            var p = 0;
            var u = false;
            var n = 0;
            $(o.slides, obj).css({
                width: (s * w)
            });
            $(o.slides, obj).children().each(function () {
                $(this).css({
                    position: 'absolute',
                    left: p,
                    display: 'block'
                });
                p = p + w
            });
            $(pagination, obj).each(function () {
                n = n + 1;
                $(this).attr('rel', n);
                $(pagination.eq(0), obj).parent().addClass('active')
            });
            $(o.slides, obj).children(':eq(' + (s - 1) + ')').css({
                position: 'absolute',
                left: -w
            });
            if (o.autoHeight) {
                autoHeight(t)
            }
            $('.next', obj).click(function () {
                if (u === false) {
                    animate('next', true);
                    if (o.autoStart) {
                        clearInterval(sliderIntervalID)
                    }
                }
                return false
            });
            $('.previous', obj).click(function () {
                if (u === false) {
                    animate('prev', true);
                    if (o.autoStart) {
                        clearInterval(sliderIntervalID)
                    }
                }
                return false
            });
            if (o.containerClick) {
                $(o.container, obj).click(function () {
                    if (u === false) {
                        animate('next', true);
                        if (o.autoStart) {
                            clearInterval(sliderIntervalID)
                        }
                    }
                    return false
                })
            }
            $(pagination, obj).click(function () {
                if ($(this).parent().hasClass('active')) {
                    return false
                } else {
                    t = $(this).attr('rel');
                    $(pagination, obj).parent().siblings().removeClass('active');
                    $(this).parent().addClass('active');
                    animate('fade', t);
                    if (o.autoStart) {
                        clearInterval(sliderIntervalID)
                    }
                }
                return false
            });
            if (o.autoStart) {
                sliderIntervalID = setInterval(function () {
                    if (u === false) {
                        animate('next', true)
                    }
                }, o.autoStart)
            }
            function current(t) {
                if (t === s + 1) {
                    t = 1
                }
                if (t === 0) {
                    t = s
                }
                $(pagination, obj).parent().siblings().removeClass('active');
                $(pagination + '[rel="' + (t) + '"]', obj).parent().addClass('active')
            };

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

            function animate(dir, clicked) {
                u = true;
                switch (dir) {
                case 'next':
                    t = t + 1;
                    m = (-(t * w - w));
                    current(t);
                    if (o.autoHeight) {
                        autoHeight(t)
                    }
                    $(o.slides, obj).animate({
                        left: m
                    }, o.slidespeed, function () {
                        if (t === s + 1) {
                            t = 1;
                            $(o.slides, obj).css({
                                left: 0
                            }, function () {
                                $(o.slides, obj).animate({
                                    left: m
                                })
                            });
                            $(o.slides, obj).children(':eq(0)').css({
                                left: 0
                            });
                            $(o.slides, obj).children(':eq(' + (s - 1) + ')').css({
                                position: 'absolute',
                                left: -w
                            })
                        }
                        if (t === s) $(o.slides, obj).children(':eq(0)').css({
                            left: (s * w)
                        });
                        if (t === s - 1) $(o.slides, obj).children(':eq(' + (s - 1) + ')').css({
                            left: s * w - w
                        });
                        u = false
                    });
                    break;
                case 'prev':
                    t = t - 1;
                    m = (-(t * w - w));
                    current(t);
                    if (o.autoHeight) {
                        autoHeight(t)
                    }
                    $(o.slides, obj).animate({
                        left: m
                    }, o.slidespeed, function () {
                        if (t === 0) {
                            t = s;
                            $(o.slides, obj).children(':eq(' + (s - 1) + ')').css({
                                position: 'absolute',
                                left: (s * w - w)
                            });
                            $(o.slides, obj).css({
                                left: -(s * w - w)
                            });
                            $(o.slides, obj).children(':eq(0)').css({
                                left: (s * w)
                            })
                        }
                        if (t === 2) $(o.slides, obj).children(':eq(0)').css({
                            position: 'absolute',
                            left: 0
                        });
                        if (t === 1) $(o.slides, obj).children(':eq(' + (s - 1) + ')').css({
                            position: 'absolute',
                            left: -w
                        });
                        u = false
                    });
                    break;
                case 'fade':
                    t = [t] * 1;
                    m = (-(t * w - w));
                    current(t);
                    if (o.autoHeight) {
                        autoHeight(t)
                    }
                    $(o.slides, obj).children().fadeOut(o.fadespeed, function () {
                        $(o.slides, obj).css({
                            left: m
                        });
                        $(o.slides, obj).children(':eq(' + (s - 1) + ')').css({
                            left: s * w - w
                        });
                        $(o.slides, obj).children(':eq(0)').css({
                            left: 0
                        });
                        if (t === s) {
                            $(o.slides, obj).children(':eq(0)').css({
                                left: (s * w)
                            })
                        }
                        if (t === 1) {
                            $(o.slides, obj).children(':eq(' + (s - 1) + ')').css({
                                position: 'absolute',
                                left: -w
                            })
                        }
                        $(o.slides, obj).children().fadeIn(o.fadespeed);
                        u = false
                    });
                    break;
                default:
                    break
                }
            }
        })
    }
})(jQuery);
