(function($){

	$.fn.extend({

		cScroll:function(opt){

			if(opt===undefined)

				opt={}

			var th=this

			th.each(function(){

				var th=$(this),

					data=th.data('cScroll'),

					_={

						step:'80px',

						duration:150,

						sleep:150,

						easing:'swing',

						pasta:'<div></div>',

						trackCl:'_track',

						upButtonCl:'_up-butt',

						downButtonCl:'_down-butt',

						shuttleCl:'_shuttle',

						preFu:function(){							

							if(_.me.css('position')=='static')

								_.me.css({position:'relative',zIndex:1})

							if(_.me.css('zIndex')=='auto')

								_.me.css({zIndex:1})

							_.me.css({overflow:'hidden'})

							_.hH=_.me.height()

							_.hW=_.me.width()

							_.val=0

							_.step=parseInt(_.step)



							_.track=$(_.pasta)

							_.track

								.addClass(_.trackCl)

								.appendTo(_.me.parent())

								.css({

									position:'absolute',

									top:_.me.prop('offsetTop'),

									left:_.me.prop('offsetLeft')+_.me.outerWidth()-(_.width=_.track.width()),

									zIndex:2

								})

							

							_.track.slider({

								min:1,max:100,value:100,

								orientation: "vertical",

								slide:function(e,ui){

									_.shuttle

										.css({

											top:(100-ui.value)+'%'

										})

									_.me.prop({scrollTop:(100-ui.value)*_.delta/100})

								},

								change:function(e,ui){

									_.val=(100-ui.value)*_.delta/99

								}

							})

							

							_.shuttle=$(_.pasta)

							_.shuttle

								.appendTo(_.track)

								.addClass(_.shuttleCl)

								.css({

									marginTop:-_.shuttle.height()/2+1,

									cursor:'pointer',

									position:'absolute'

								})

							if(!_.shuttle.height())

								_.shuttle.height(_.width)

							_.sH=_.shuttle.height()

							_.track

								.css({

									top:parseInt(_.track.css('top'))+_.sH/2,

									bottom:parseInt(_.track.css('bottom'))+_.sH/2,

									height:_.hH-_.sH

								})

							

							_.trackBG=$(_.pasta)

								.appendTo(_.me.parent())

								.css({

									width:_.width,

									height:_.hH-2,

									position:'absolute',

									left:_.track.css('left'),

									top:parseInt(_.track.css('top'))-_.sH/2+1,

									backgroundColor:_.track.css('backgroundColor'),

									backgroundImage:_.track.css('backgroundImage'),

									backgroundPosition:_.track.css('backgroundPosition'),

									backgroundRepeat:_.track.css('backgroundRepeat')

								})

							_.track.css('background','none')

								

							_.delta=_.me.prop('scrollHeight')-_.hH

							

							_.upBu=$(_.pasta)

								.appendTo(_.trackBG)

								.addClass(_.upButtonCl)

								.css({

									position:'absolute',

									width:_.width,

									height:_.width,

									left:0,

									top:0,

									cursor:'pointer',

									zIndex:3

								})

								.click(function(){

									_.upFu()

								})

							_.downBu=$(_.pasta)

								.appendTo(_.trackBG)

								.addClass(_.downButtonCl)

								.css({

									position:'absolute',

									width:_.width,

									height:_.width,

									left:0,

									bottom:0,

									cursor:'pointer',

									zIndex:3

								})

								.click(function(){

									_.downFu()

								})

						},

						scrollFu:function(n){

							if(!_.b)

								return false

							_.b=false

							_.val+=n

							_.val=_.val<0?0:_.val

							_.val=_.val<=_.delta?_.val:_.delta

							

							_.me

								.stop()

								.animate({

									scrollTop:_.val

								},{

									duration:_.duration,

									easing:_.easing,

									step:function(now){

										var v=100-now/_.delta*100

										_.track.slider({value:v})

										_.shuttle.css({top:(100-v)+'%'})

								},

									complete:function(){

										_.val=_.me.prop('scrollTop')

									}

								})

							setTimeout(function(){

								_.b=true

							},_.sleep)

						},

						downFu:function(){

							_.scrollFu(_.step)

						},

						upFu:function(){

							_.scrollFu(-_.step)

						},

						wheelFu:function(){

							_.b=true

							_.me.add(_.track)

								.bind('mousewheel',function(e,d){

									if(d<0)

										_.downFu()							

									else

										_.upFu()

									return false

								})

						},

						init:function(){

							_.me=this

							_.preFu()

							if($.fn.mousewheel)

								_.wheelFu()

						}

					}

				if(!data)

					(typeof opt=='object'?$.extend(_,opt):_).init.call(th),

					th.data({cScroll:_}),

					data=_

				else

					_=typeof opt=='object'?$.extend(data,opt):data

			})

			return th

		}

	})	

})(jQuery)
