(function($) {
    $.fn.slideWithMinimap=function(options) {
        if(typeof(options)=='undefined') options = {};
        var settings = defaultSettings();
        if(options) { 
            $.extend(settings, options);
        };
	    iniSlideWithMinimap(settings,$(this));
        return this; 
    };
	//默认参数设置
	var defaultSettings=function() {
		return {
			prevBtnId: null,
			nextBtnId: null,
			minimapOlId:null,//缩略图对象，必须是ol元素
			minimapSelClass:null,//缩略图当前选中li的样式class名称
			minimapEvent:'mouseover',//缩略图触发事件名称，"mouseover"/"click"
			vertical: false,//是否上下滚动
			autoSlide:true,//自动滚动
			slideTimeSlice:400,//完成一次滑动效果所需时间(毫秒)，值越大速度越慢
			pauseTimeSlice:2000,//动画停顿时间(毫秒)，autoSlide为true时才有意义
			autoSlideDirection:'next',//autoSlide为true时，自动滚动的方向，左/上则为'previous'，右/下则为'next'
			hoverStopSlide:true,//autoSlide为true时鼠标悬停在被滚动对象上时是否停止滚动
			clearLagAnimate:true,//当执行当前新的动画时，是否先立即中断ul上的所有动画（以前的滞后动画），这样就能消除因连续操作动画带来的动画滞后问题
			circleType:'auto',//循环方式，auto/cutover/continue，分别是默认方式（滑动回起点）/切换方式（切换回起点）/连续滑动方式（无缝循环）
			reTimeout:1,//setTimeout()函数返回值
			index:0//起始Li索引,当前Li索引(从0开始的索引)
		}
	};
	function iniSlideWithMinimap(settings,obj){
        var ul = obj.children();
        var itemPath = 0;
        ul.children().css({"float":"left"});
//        var liW = getLiActualWidth(ul.children());
        var liW = ul.children().outerWidth("true");
        var liH = ul.children().outerHeight("true");
        obj.css({"overflow":"hidden","width":liW+"px","height":liH+"px"});
        if(!settings.vertical){
            itemPath = liW;
            ul.css({"width":liW*ul.children().length+"px"});//当水平滚动时，把ul的li水平辅开
            ul.css({"height":liH+"px"});
        }
        else{
            itemPath = liH;
            ul.css({"width":liW+"px"});
            ul.css({"height":liH*ul.children().length+"px"});//当垂直滚动时，把ul的li垂直辅开
            ul.children().css({"float":"none"});
        }
        iniSlideIndex(settings,ul,itemPath);
        if(settings.autoSlide){
            setTimeout(function() {startSlideAuto(settings,ul,itemPath)},settings.pauseTimeSlice);
            if(settings.hoverStopSlide){
                ul.bind("mouseout",function() {reStartSlideAuto(settings,ul,itemPath);})
                .bind("mouseover",function() {clearTimeout(settings.reTimeout);});
            }
        }
        $("#"+settings.prevBtnId).bind("click",function() {slidePrevious(settings,ul,itemPath);});
        $("#"+settings.nextBtnId).bind("click",function() {slideNext(settings,ul,itemPath);});
	    if(settings.minimapOlId != null){
            var minimapOl = $("#"+settings.minimapOlId);
            minimapOl.children().each(function(i){
                if(settings.minimapEvent == "click"){
                    $(this).bind("click",function() {
                        clearTimeout(settings.reTimeout);
                        slideToIndex(settings,ul,itemPath,settings.index=i);
                        reStartSlideAuto(settings,ul,itemPath);
                    });
                }
                else{
                    $(this).bind("mouseout",function() {reStartSlideAuto(settings,ul,itemPath);})
                    .bind("mouseover",function() {
                        clearTimeout(settings.reTimeout);
                        slideToIndex(settings,ul,itemPath,settings.index=i);
                    });
                }
            });
        }
	};
	function startSlideAuto(settings,ul,itemPath){
	    if(settings.autoSlideDirection == "previous")
	        slidePrevious(settings,ul,itemPath);
	    else
	        slideNext(settings,ul,itemPath);
	}
	function getLiActualWidth(li){
	    var reWidth = 0;
        var c = "<div id = \"checkLiWidthDiv\" style = \"display:inline;float:left\"></div>";
        $(c).appendTo("body");
        $("#checkLiWidthDiv").html(li.html());
        reWidth = $("#checkLiWidthDiv").width();
        $("#checkLiWidthDiv").remove();
        return reWidth;
	}
	function iniSlideIndex(settings,ul,itemPath){
        if(!settings.vertical){
            ul.css({marginLeft:-1*itemPath*settings.index});
        }
        else{
            ul.css({marginTop:-1*itemPath*settings.index});
        }
        changeSelMinimapLiClass(settings,settings.index);
	}
	function slideToIndex(settings,ul,itemPath,targetIndex){
	    if(settings.clearLagAnimate){
	        ul.stop();
	    }
        if(!settings.vertical){
            ul.animate({marginLeft:-1*itemPath*targetIndex}, settings.slideTimeSlice);
        }
        else{
            ul.animate({marginTop:-1*itemPath*targetIndex}, settings.slideTimeSlice);
        }
        changeSelMinimapLiClass(settings,targetIndex);
	}
	function changeSelMinimapLiClass(settings,targetIndex){
	    if(settings.minimapOlId != null){
            var minimapOl = $("#"+settings.minimapOlId);
            minimapOl.children().removeClass(settings.minimapSelClass);
            minimapOl.children().eq(targetIndex).addClass(settings.minimapSelClass);
        }
	}
	function slidePrevious(settings,ul,itemPath){
        if(settings.index <= 0){
            if(settings.circleType == "cutover"){
                settings.index = ul.children().length - 1;
                iniSlideIndex(settings,ul,itemPath);
            }
            else if(settings.circleType == "continue"){
            }
            else{//settings.circleType == "auto"
                settings.index = ul.children().length;
                slideToIndex(settings,ul,itemPath,--settings.index);
            }
        }
        else{
            slideToIndex(settings,ul,itemPath,--settings.index);
        }
        if(settings.autoSlide){
            reStartSlideAuto(settings,ul,itemPath);
        }
	}
	function slideNext(settings,ul,itemPath){
        if(settings.index >= ul.children().length-1){
            if(settings.circleType == "cutover"){
                settings.index = 0;
                iniSlideIndex(settings,ul,itemPath);
            }
            else if(settings.circleType == "continue"){
            }
            else{//settings.circleType == "auto"
                settings.index = -1;
                slideToIndex(settings,ul,itemPath,++settings.index);
            }
        }
        else{
            slideToIndex(settings,ul,itemPath,++settings.index);
        }
        if(settings.autoSlide){
            reStartSlideAuto(settings,ul,itemPath);
        }
	}
	function reStartSlideAuto(settings,ul,itemPath){
        clearTimeout(settings.reTimeout);
        settings.reTimeout = setTimeout(function() {startSlideAuto(settings,ul,itemPath)},settings.pauseTimeSlice);
	}
})(jQuery)
