/*
 *  loopedCarousel 0.5 - jQuery plugin
 *  written by Nathan Searles, based on loopedSlider (http://github.com/nathansearles/loopedSlider) 
 *  http://github.com/nathansearles/loopedCarousel
 *
 *  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
 *
 */

/*
 *  markup example for $("#loopedCarousel").loopedCarousel();
 *
 *  <div id="loopedCarousel">   
 *      <div class="container">
 *          <div class="slides">
 *              <div>1</div>
 *              <div>2</div>
 *              <div>3</div>
 *              <div>4</div>
 *              <div>5</div>
 *              <div>6</div>
 *              <div>7</div>
 *              <div>8</div>
 *              <div>9</div>
 *              <div>10</div>
 *              <div>11</div>
 *              <div>12</div>
 *              <div>13</div>
 *              <div>14</div>
 *              <div>15</div>
 *          </div>
 *      </div>
 *      <a href="#" class="previous">previous</a>
 *      <a href="#" class="next">next</a>   
 *  </div>
 *
 */

(function($) {
    $.fn.loopedCarousel = function(options) {
        
    var defaults = {            
        container: '.container',
        slides: '.slides',
        pagination: '.pagination',
        autoStart: 0, // Set to positive number for auto interval and interval time
        slidespeed: 300, // Speed of slide animation
        fadespeed: 300, // Speed of fade animation
        items: 6, // Items show
        padding: 0, // Padding between items
        showPagination: false, // Shows pagination links
        vertical: false
    };
        
    this.each(function() {  
        var obj = $(this);
        var o = $.extend(defaults, options);
        var i = o.items;
        var m = 0;
        var t = 1;
        var s = $(o.slides,obj).children().size();
        var w = $(o.slides,obj).children().outerWidth()+o.padding;
        var h = $(o.slides,obj).children().outerHeight()+o.padding;
        var c = Math.ceil($(o.slides,obj).children().size()/i);
        var pd = o.padding/2;
        var p = 0;
        var u = false;
        var n = 0;
        var pt = 0;
        var os = i*c-s;
        var params = {}; 
        
        if (o.vertical===true) { w = h; }
            
        if(o.showPagination){
            var buttons = s/i;
            $(obj).append('<ul class="pagination">');
            $(o.slides,obj).children().each(function(){
                if (n<buttons) {
                    $(o.pagination,obj).append('<li><a rel="'+(n+1)+'" href="#" >'+(n+1)+'</a></li>');
                    n = n+1;
                } else {
                    n = 0;
                    return false;
                }
                $(o.pagination+' li a:eq(0)',obj).parent().addClass('active');
            });
        }
        
        if (o.vertical===true) {
            $(o.container,obj).css({height:(w*i)});
            $(o.slides,obj).css({height:(s*w)});
        } else {
            $(o.container,obj).css({width:(w*i)});
            $(o.slides,obj).css({width:(s*w)});
        }
        
        $(o.slides,obj).children().each(function(){
            if (o.vertical===true) {
                $(this).css({position:'absolute',top:p+pd,display:'block'});
            } else {
                $(this).css({position:'absolute',left:p+pd,display:'block'});
            }
            p=p+w;
        });

        $(o.slides,obj).children().each(function(){
            pt = pt+1;
            if (pt<i+1) {
                params[o.vertical ? 'top' : 'left'] = (-w*pt)+pd-(w*os);
                $(o.slides,obj).children(':eq('+(s-pt)+')').css(params);
            }
            if (pt===i+2) {
                pt = 0;
                return false;
            }
        });
        
        $('.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;
        });
        
        $(o.pagination+' li a',obj).click(function(){
            if ($(this).parent().hasClass('active')) {return false;}
            else {
                t = $(this).attr('rel');
                $(o.pagination+' li a',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===c+1){t=1;}
            if(t===0){t=c;}
            $(o.pagination+' li a',obj).parent().siblings().removeClass('active');
            $(o.pagination+' li a[rel="' + (t) + '"]',obj).parent().addClass('active');
        }
        
        function animate(dir,clicked){  
            u = true;   
            switch(dir){
                case 'next':
                    t = t+1;
                    m = (-(t*w-w)*i);
                    current(t);     
                    params[o.vertical ? 'top' : 'left'] = m;                
                    $(o.slides,obj).animate(params, o.slidespeed,function(){
                        if (t===c+1) {
                            t = 1;
                            params[o.vertical ? 'top' : 'left'] = 0;
                            $(o.slides,obj).css(params,function(){
                                $(o.slides,obj).animate(params);
                            });                     
                            $(o.slides,obj).children().each(function(){ 
                                if (pt<i) {
                                    params[o.vertical ? 'top' : 'left'] = (w*pt)+pd;
                                    $(o.slides,obj).children(':eq('+pt+')').css(params);
                                    params[o.vertical ? 'top' : 'left'] = -(w*(pt+os+1)-pd);
                                    $(o.slides,obj).children(':eq('+(s-(pt+1))+')').css(params);
                                } else {
                                    pt = 0; 
                                    return false;
                                }
                                pt = pt+1;
                            }); 
                        }
                        if (t===c) {
                            $(o.slides,obj).children().each(function(){ 
                                if (pt<i) {
                                    params[o.vertical ? 'top' : 'left'] = w*(s+pt+os)+pd;
                                    $(o.slides,obj).children(':eq('+(pt)+')').css(params);
                                } else {
                                    pt = 0;
                                    return false;
                                }
                                pt = pt+1;
                            });
                        }
                        if (t===2) {
                            $(o.slides,obj).children().each(function(){
                                pt = pt+1;
                                if (pt<i+1) {                                   
                                    params[o.vertical ? 'top' : 'left'] = ((w*s)+pd)-(w*pt);
                                    $(o.slides,obj).children(':eq('+(s-pt)+')').css(params);
                                } else {
                                    pt = 0;
                                    return false;
                                }
                            });
                        }
                        u = false;
                    });                 
                    break; 
                case 'prev':
                    t = t-1;
                    m = (-(t*w-w)*i);
                    current(t);
                    params[o.vertical ? 'top' : 'left'] = m;
                    $(o.slides,obj).animate(params, o.slidespeed,function(){
                        if (t===0) {
                            t = c;
                            params[o.vertical ? 'top' : 'left'] = -w*(s-i)-(w*os);
                            $(o.slides,obj).css(params);
                            $(o.slides,obj).children().each(function(){ 
                                if (pt<i) {
                                    params[o.vertical ? 'top' : 'left'] = w*(s+pt+os)+pd;
                                    $(o.slides,obj).children(':eq('+pt+')').css(params);                                    
                                    params[o.vertical ? 'top' : 'left'] = (s*w)+pd-(pt*w)-w;
                                    $(o.slides,obj).children(':eq('+((s-1)-pt)+')').css(params);
                                } else {
                                    pt = 0; 
                                    return false;
                                }
                                pt = pt+1;
                            });
                        }
                        if (t===2) {
                            $(o.slides,obj).children().each(function(){ 
                                if (pt<i) {
                                    params[o.vertical ? 'top' : 'left'] = (w*pt)+pd;
                                    $(o.slides,obj).children(':eq('+pt+')').css(params);
                                } else {
                                    pt = 0; 
                                    return false;
                                }
                                pt = pt+1;
                            });
                        }
                        if (t===1) {
                            $(o.slides,obj).children().each(function(){ 
                                if (pt<i) {
                                    params[o.vertical ? 'top' : 'left'] = -(w*pt)-w+pd-(w*os);
                                    $(o.slides,obj).children(':eq('+((s-1)-pt)+')').css(params);
                                } else {
                                    pt = 0; 
                                    return false;
                                }
                                pt = pt+1;
                            });
                        }

                        u = false;
                    });
                    break;
                case 'fade':
                    t = [t]*1;
                    m = (-(t*w-w)*i);
                    current(t);
                    $(o.slides,obj).children().fadeOut(o.fadespeed, function(){
                        params[o.vertical ? 'top' : 'left'] = m;
                        $(o.slides,obj).css(params);
                        $(o.slides,obj).children().each(function(){ 
                            if (pt<i) {
                                params[o.vertical ? 'top' : 'left'] = (pt*w)+pd;
                                $(o.slides,obj).children(':eq('+pt+')').css(params);
                                params[o.vertical ? 'top' : 'left'] = w*(s-pt)-w+pd;
                                $(o.slides,obj).children(':eq('+((s-1)-pt)+')').css(params);
                            } else {
                                pt = 0; 
                                return false;
                            }
                            pt = pt+1;
                        });
                        
                        if(t===c){                      
                            $(o.slides,obj).children().each(function(){ 
                                if (pt<i) {
                                    params[o.vertical ? 'top' : 'left'] = w*(s+pt+os)+pd;
                                    $(o.slides,obj).children(':eq('+(pt)+')').css(params);
                                } else {
                                    pt = 0;
                                    return false;
                                }
                                pt = pt+1;
                            });
                        }
                        if(t===1){
                            $(o.slides,obj).children().each(function(){
                                pt = pt+1;
                                if (pt<i+1) {
                                    params[o.vertical ? 'top' : 'left'] = -(w*pt)+pd-(w*os);
                                    $(o.slides,obj).children(':eq('+(s-pt)+')').css(params);
                                } else {
                                    pt = 0;
                                    return false;
                                }
                            });
                        }
                        $(o.slides,obj).children().fadeIn(o.fadespeed);
                        u = false;
                    });
                    break; 
                default:
                    break;
                }                   
            }
        });
    };
})(jQuery);
