/*
 * jscroll 2.2
 * Copyright (C) 2011 Tacker All Rights Reserved.
 * Edit By Tacker 2011-09-15
 * Licensed: http://www.gnu.org/licenses/gpl.html
*/
;
(function($){
    $.fn.extend({
        "jscroll":function(o){
            o = $.extend({
                autoScroll:true,//自动滚动
                auto: 1000,     //延迟时间（毫秒）
                speed: 800,     //单次滚动时长（毫秒）
                vertical: false,//是否向上滚动(默认向左)
                scroll: 1,      //每次滚动的元素数量
                scrollLen:100,  //每次滚动长度
                unit:0,         //每行或列元素个数
                btnUp:false,    //上行/左行按钮
                btnDown:false,  //下行/右行按钮
                rollBack:false, //回滚
                debug:false
            },o);
            var running = false,ulSize = 0,divSize=0,halfUlSize=0;
            var scrollTimer,animCss;
            var div = $(this), ul = div.find("ul"), li = ul.children(".scroll-item");
			
            div.css({
                overflow: "hidden"
            });
            ul.css({
                margin: "0", 
                padding: "0", 
                display: "inline-block"
            });
            if(!o.vertical){
                li.each(function(){
                    halfUlSize+=$(this).outerWidth();
                })
                ul.css({
                    width:halfUlSize*2
                });
            }else{
                halfUlSize+=$(this).outerHeight();
            }

            ulSize= o.vertical ? ul.outerHeight() : ul.outerWidth(); //内容宽(高)
            divSize = o.vertical ? div.innerHeight() : div.innerWidth(); //容器宽(高)
 
            if(ulSize > divSize){
                ul.html(ul.html()+ul.html());
                running = true; //UL的宽(高)大于容的器宽(高)时才滚动
            }
		
            var scrollEvent = function(){
                if(o.debug){
                    console.log('------------scroll event start------------');
                }
                if(o.vertical){
                    if(o.rollBack){
                        scrolllen=(ulSize-divSize-div.scrollTop())>=0?div.scrollTop()-o.scrollLen:ulSize-divSize;
                    }else{
                        scrolllen=(ulSize-divSize-div.scrollTop())>=o.scrollLen?div.scrollTop()+o.scrollLen:ulSize-divSize;
                    }
                }else{
                    noscrolleft=ulSize-divSize-div.scrollLeft();
                    if(o.rollBack){
                        scrolllen=noscrolleft>=0?div.scrollLeft()-o.scrollLen:ulSize-divSize;
                    }else{
                        scrolllen=noscrolleft>=o.scrollLen?div.scrollLeft()+o.scrollLen:ulSize-divSize;
                    }
                }
                if(o.debug){
                    console.log('ulSize='+ulSize);
                    console.log('divSize='+divSize);
                    console.log('div.scrollLeft='+div.scrollLeft());
                    console.log('noscrollLeft='+(ulSize-divSize-div.scrollLeft())+';o.scrollLen='+o.scrollLen+';scrolllen='+scrolllen);
                } 
                animCss = o.vertical ? {
                    scrollTop:scrolllen
                } : {
                    scrollLeft:scrolllen
                };
                div.animate(animCss, o.speed, function(){
                    if(o.vertical){
                        if(o.rollBack){
                            if(div.scrollTop()==0){
                                div.scrollTop(ulSize-divSize);
                            }
                        }else{
                            if((div.scrollTop()+divSize)>=ulSize){
                                div.scrollTop(0);
                            }
                        }
                    }else{
                        if(o.rollBack){
                            if(div.scrollLeft()==0){
                                div.scrollLeft(ulSize-divSize);
                            }
                        }else{
                            if((div.scrollLeft()+divSize)>=ulSize){
                                pause();
                                div.scrollLeft(0);
                            }
                            if(o.debug){
                                console.log('div.ScrollLeft='+div.scrollLeft()+';divSize='+divSize+';ulSize='+ulSize);
                            }
                        }
                    }
                })
            }
            
            var pause=function(){
                setTimeout(p,5000);
                if(o.debug){
                    console.log('sleep 5 sec');
                }
            }
            
            var p=function(){};
            
            if(o.btnUp!=false){
                $("#"+o.btnUp).css('cursor','pointer');
                $("#"+o.btnUp).hover(function(){
                    if(running){
                        o.rollBack=true;
                        //scrollTimer = setInterval(scrollEvent, parseInt(o.auto+o.speed));
                    }
                },function(){
                    if(running){
                        //clearInterval(scrollTimer);
                    }
                });
                $("#"+o.btnUp).click(scrollEvent);
            }
            if(o.btnDown!=false){
                $("#"+o.btnDown).css('cursor','pointer');
                $("#"+o.btnDown).hover(function(){
                    if(running){
                        o.rollBack=false;
                        //scrollTimer = setInterval(scrollEvent, parseInt(o.auto+o.speed));
                    }
                },function(){
                    if(running){
                        //clearInterval(scrollTimer);
                    }
                });
                $("#"+o.btnDown).click(scrollEvent);
            }
            
            div.parent().hover(function(){
                if(running){
                    if(o.btnUp!=false){
                        $("#"+o.btnUp).show();
                    }
                    if(o.btnDown!=false){
                        $("#"+o.btnDown).show();
                    }
                        
                    if(o.autoScroll){
                        clearInterval(scrollTimer);
                    }
                }
            },function(){
                if(running){
                    if(o.btnUp!=false){
                        $("#"+o.btnUp).hide();
                    }
                    if(o.btnDown!=false){
                        $("#"+o.btnDown).hide();
                    }
                        
                    if(o.autoScroll){
                        scrollTimer = setInterval(scrollEvent, parseInt(o.auto+o.speed));
                    }
                }
            }).trigger("mouseleave"); //DOM加载完毕后自动执行hover(fn1, fn2)的fn2
            
        }
    });
})(jQuery);
