(function($) {
    $.extend($.fn, {
        wscroll: function(setting) {
            var ps = $.extend({
                wscrollperH : 1,
                wscrollCssName: 'wscroll',
				wscrollStep : 0.5 //点击箭头后移动的百分比
            }, setting);
            ps.renderTo=$(this);
			/*在目标元素内部包裹一个层*/
			ps.renderTo.wrapInner("<div class='wscrollContainerBody'></div");
			ps.zbody = ps.renderTo.children('.wscrollContainerBody');
			ps.zbody.css({'position':'absolute','top':0,'left':0,'width':'100%'});
			ps.renderTo.css({'overflow':'hidden'});
			
			ps.zp=ps.renderTo.offset();
			ps.zw=ps.renderTo.width();
			ps.zh=ps.renderTo.height(); //容器的高度
			ps.wscrollHeight=parseInt(ps.wscrollperH*ps.zh);
            ps.wscrollContainer = $('<div><div></div><div></div><div><div></div><div></div><div></div></div></div>').attr('class', ps.wscrollCssName).appendTo('body');
			ps.wscrollContainer.css({'position':'absolute','height':ps.wscrollHeight+'px','z-index':'20','width':14,'top':ps.zp.top,'left':ps.zp.left+ps.zw});	
            ps.wscrollCtrlBar = ps.wscrollContainer.find('div:eq(2)').attr('class','cbar');
			ps.wscrollCtrlUp = ps.wscrollCtrlBar.find('div:eq(0)').attr('class','aUp');
			ps.wscrollCtrlMove = ps.wscrollCtrlBar.find('div:eq(1)').attr('class','aBody');
			ps.wscrollCtrlDown = ps.wscrollCtrlBar.find('div:eq(2)').attr('class','aDown');
            ps.wscrollBar = ps.wscrollContainer.find('div:eq(0)').attr('class', 'bar').css({'position':'absolute'});
			ps.wscrollCut = ps.wscrollContainer.find('div:eq(1)').attr('class', 'cut');
			ps.wscrollCut.css({'position':'absolute','top':ps.wscrollHeight});
			ps.cbarHeight = ps.wscrollCtrlBar.height();

			ps.mY=0;
			ps.dragged=false;
			ps.clicked=false;
			/*共用函数，用于设定滑动的动画*/
			if (typeof window.$zstProcess == 'undefined') {
                window.$zstProcess = function(obj, top, ms){
                     obj.animate( {'top':top},ms);
				}
            }

			$zstProcess(ps.wscrollCtrlBar, 0,0);
            $zstProcess(ps.wscrollBar, 0,0);

			ps.set=function(){
				var prt=ps.renderTo.find('div:eq(0)');
				if(!prt.hasClass('wscrollContainerBody')){
					ps.renderTo.wrapInner("<div class='wscrollContainerBody'></div");
					ps.zbody = ps.renderTo.children('.wscrollContainerBody');
					ps.zbody.css({'position':'absolute','left':0,'top':0,'width':'100%'});
				}
				
				ps.renderTo.css({'overflow':'hidden'});

				

				ps.zp=ps.renderTo.offset();
				ps.zw=ps.renderTo.width();
				ps.zh=ps.renderTo.height(); //容器的高度
				ps.wscrollHeight=parseInt(ps.wscrollperH*ps.zh);

				var lft=ps.zp.left+ps.zw-ps.wscrollContainer.width()/2;
				ps.wscrollContainer.css({'position':'absolute','height':ps.wscrollHeight+'px','z-index':'20','top':ps.zp.top,'left':lft});
				ps.wscrollCut.css({'position':'absolute','top':ps.wscrollHeight});
				ps.cbarHeight = ps.wscrollCtrlBar.height();
				//设定滚动条的长度，根据内容和容器高度百分比
				ps.zbh=ps.zbody.height(); //ps.renderTo[0].scrollHeight; //容器内内容的总高
				ps.barH=parseInt(ps.zh/ps.zbh*ps.wscrollHeight);
				if(ps.barH<ps.cbarHeight)ps.barH=ps.cbarHeight;
				if(ps.barH>ps.zh)ps.barH=ps.zh;
				ps.wscrollBar.css('height',ps.barH);

				var springH=parseInt(ps.cbarHeight/2);
				ps.limited = { min: 0-springH, max: ps.wscrollHeight-ps.cbarHeight+springH };//拖动条的活动范围
				ps.cmax = ps.wscrollHeight-ps.cbarHeight; //拖动条的最高值，用于计算真正的比例
				ps.bmax = ps.wscrollHeight-ps.barH; //背影条的最高值，用于限制背影条的活动范围
				if(ps.zbh<ps.zh)
					ps.wscrollContainer.fadeOut();
				else 
					ps.wscrollContainer.fadeIn();
				
				/*重置滚动条位置*/
				var zbt=parseInt(ps.zbody.css('top'));
				var p=-zbt/(ps.zbh-ps.zh);
				if(p>1){
					p=1;
					$zstProcess(ps.zbody,-ps.zbh+ps.zh,200);
				}
				$zstProcess(ps.wscrollBar,parseInt(ps.bmax*p),0);
				$zstProcess(ps.wscrollCtrlBar,parseInt(ps.cmax*p),0);
			}
			ps.set();
			ps.scroll=function(lr){
				$zstProcess(ps.wscrollBar,parseInt(ps.bmax*lr / ps.cmax),20);
				$zstProcess(ps.zbody,-(ps.zbody.height()-ps.zh)*lr / ps.cmax,0);
			}
			

			
            var slide = {
                drag: function(e) {
					if(ps.wscrollCtrlBar[0].setCapture){  
						ps.wscrollCtrlBar[0].setCapture();  
					}else if(window.captureEvents){  
						window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);  
					}
                    var d = e.data;
                    var l = Math.min(Math.max(e.pageY - d.pageY + d.top, ps.limited.min), ps.limited.max);
					if(l!=ps.mY)ps.dragged=true;
                    $zstProcess(ps.wscrollCtrlBar,l,0);
					var lr=l;
					if(lr<0)lr=0;
					if(lr>ps.cmax)lr=ps.cmax;
					ps.scroll(lr);
					
                },
                drop: function(e) {
					if(ps.wscrollCtrlBar[0].releaseCapture){  
						ps.wscrollCtrlBar[0].releaseCapture();  
					}else if(window.captureEvents){  
						window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);  
					} 
					var lr= parseInt(ps.wscrollCtrlBar.css('top'));
					ps.dragged=false;
					ps.mY=lr;
					if(lr<0){
						lr=0;
						ps.wscrollCtrlBar.animate({'top':0},500);
					}
					if(lr>ps.cmax){
						lr=ps.cmax;
						ps.wscrollCtrlBar.animate({'top':ps.cmax},500);
					}
					//ps.oncbarDrop(lr / ps.cmax, e);
					$().unbind('mousemove', slide.drag).unbind('mouseup', slide.drop);
					$('div.iframeCover').remove();
                },
				scrollTo : function(e){
					if(ps.dragged)
						return;
					else{
						var step=parseInt(ps.zh*ps.wscrollStep/ps.zbh*ps.wscrollHeight);
						if(e.data.a=='up')step=-step
						var top=parseInt(ps.wscrollBar.css('top'))+step;
						if(top>ps.bmax)top=ps.bmax;
						if(top<0)top=0;
						var p=top/ps.bmax;
						$zstProcess(ps.wscrollBar,top,200);
						var btop=-parseInt((ps.zbh-ps.zh)*p);
						$zstProcess(ps.zbody,btop,200);
						ps.clicked=true;
					}
				}
            };
			ps.wscrollCtrlBar.bind('mousedown', function(e) {
				var d = {
					top: parseInt(ps.wscrollCtrlBar.css('top')),
					pageY: e.pageY
				};
				$().bind('mousemove', d, slide.drag).bind('mouseup', d, slide.drop);
				 
				$("<div></div>").attr('class','iframeCover').css({'position':'absolute','left':0,'top':0,'right':0,'bottom':0,'width':'100%'}).appendTo('body');
			});
			ps.wscrollCtrlDown.bind('mousedown',function(e){
				ps.wscrollCtrlDown.bind('mouseup',{a:'down'},slide.scrollTo);
			});
			ps.wscrollCtrlUp.bind('mousedown',function(e){
				ps.wscrollCtrlUp.bind('mouseup',{a:'up'},slide.scrollTo);
			});
			ps.wscrollCtrlBar.bind('mouseout', function(e){
				if(ps.clicked){
					var l=parseInt(ps.wscrollBar.css('top'))/ps.bmax*ps.cmax;
					$zstProcess(ps.wscrollCtrlBar,l,800);
					ps.clicked=false;
				}
			});
			$(window).resize(function(){
				ps.set();
			});
            var z=ps.wscrollContainer;
			z.pps=ps;
			return z;
        },
		wreset : function(){
			var ps=this.pps;
			ps.set();
		}
    });
})(jQuery);
