1/* 2== malihu jquery custom scrollbars plugin == 3version: 2.8.3 4author: malihu (http://manos.malihu.gr) 5plugin home: http://manos.malihu.gr/jquery-custom-content-scroller 6*/ 7 8/* 9Copyright 2010-2013 Manos Malihutsakis 10 11This program is free software: you can redistribute it and/or modify 12it under the terms of the GNU Lesser General Public License as published by 13the Free Software Foundation, either version 3 of the License, or 14any later version. 15 16This program is distributed in the hope that it will be useful, 17but WITHOUT ANY WARRANTY; without even the implied warranty of 18MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19GNU Lesser General Public License for more details. 20 21You should have received a copy of the GNU Lesser General Public License 22along with this program. If not, see http://www.gnu.org/licenses/lgpl.html. 23*/ 24(function($){ 25 /*plugin script*/ 26 var methods={ 27 init:function(options){ 28 var defaults={ 29 set_width:false, /*optional element width: boolean, pixels, percentage*/ 30 set_height:false, /*optional element height: boolean, pixels, percentage*/ 31 horizontalScroll:false, /*scroll horizontally: boolean*/ 32 scrollInertia:950, /*scrolling inertia: integer (milliseconds)*/ 33 mouseWheel:true, /*mousewheel support: boolean*/ 34 mouseWheelPixels:"auto", /*mousewheel pixels amount: integer, "auto"*/ 35 autoDraggerLength:true, /*auto-adjust scrollbar dragger length: boolean*/ 36 autoHideScrollbar:false, /*auto-hide scrollbar when idle*/ 37 alwaysShowScrollbar:false, /*always show scrollbar even when there's nothing to scroll (disables autoHideScrollbar): boolean*/ 38 snapAmount:null, /* optional element always snaps to a multiple of this number in pixels */ 39 snapOffset:0, /* when snapping, snap with this number in pixels as an offset */ 40 scrollButtons:{ /*scroll buttons*/ 41 enable:false, /*scroll buttons support: boolean*/ 42 scrollType:"continuous", /*scroll buttons scrolling type: "continuous", "pixels"*/ 43 scrollSpeed:"auto", /*scroll buttons continuous scrolling speed: integer, "auto"*/ 44 scrollAmount:40 /*scroll buttons pixels scroll amount: integer (pixels)*/ 45 }, 46 advanced:{ 47 updateOnBrowserResize:true, /*update scrollbars on browser resize (for layouts based on percentages): boolean*/ 48 updateOnContentResize:false, /*auto-update scrollbars on content resize (for dynamic content): boolean*/ 49 autoExpandHorizontalScroll:false, /*auto-expand width for horizontal scrolling: boolean*/ 50 autoScrollOnFocus:true, /*auto-scroll on focused elements: boolean*/ 51 normalizeMouseWheelDelta:false /*normalize mouse-wheel delta (-1/1)*/ 52 }, 53 contentTouchScroll:true, /*scrolling by touch-swipe content: boolean*/ 54 callbacks:{ 55 onScrollStart:function(){}, /*user custom callback function on scroll start event*/ 56 onScroll:function(){}, /*user custom callback function on scroll event*/ 57 onTotalScroll:function(){}, /*user custom callback function on scroll end reached event*/ 58 onTotalScrollBack:function(){}, /*user custom callback function on scroll begin reached event*/ 59 onTotalScrollOffset:0, /*scroll end reached offset: integer (pixels)*/ 60 onTotalScrollBackOffset:0, /*scroll begin reached offset: integer (pixels)*/ 61 whileScrolling:function(){} /*user custom callback function on scrolling event*/ 62 }, 63 theme:"light" /*"light", "dark", "light-2", "dark-2", "light-thick", "dark-thick", "light-thin", "dark-thin"*/ 64 }, 65 options=$.extend(true,defaults,options); 66 return this.each(function(){ 67 var $this=$(this); 68 /*set element width/height, create markup for custom scrollbars, add classes*/ 69 if(options.set_width){ 70 $this.css("width",options.set_width); 71 } 72 if(options.set_height){ 73 $this.css("height",options.set_height); 74 } 75 if(!$(document).data("mCustomScrollbar-index")){ 76 $(document).data("mCustomScrollbar-index","1"); 77 }else{ 78 var mCustomScrollbarIndex=parseInt($(document).data("mCustomScrollbar-index")); 79 $(document).data("mCustomScrollbar-index",mCustomScrollbarIndex+1); 80 }
81 $this.wrapInner("<div class='mCustomScrollBox"+" mCS-"+options.theme+"' id='mCSB_"+$(document).data("mCustomScrollbar-index")+"' style='position:relative; height:100%; overflow:hidden; max-width:100%;' />").addClass("mCustomScrollbar _mCS_"+$(document).data("mCustomScrollbar-index")); 82 var mCustomScrollBox=$this.children(".mCustomScrollBox"); 83 if(options.horizontalScroll){ 84 mCustomScrollBox.addClass("mCSB_horizontal").wrapInner("<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />"); 85 var mCSB_h_wrapper=mCustomScrollBox.children(".mCSB_h_wrapper"); 86 mCSB_h_wrapper.wrapInner("<div class='mCSB_container' style='position:absolute; left:0;' />").children(".mCSB_container").css({"width":mCSB_h_wrapper.children().outerWidth(),"position":"relative"}).unwrap(); 87 }else{ 88 mCustomScrollBox.wrapInner("<div class='mCSB_container' style='position:relative; top:0;' />"); 89 } 90 var mCSB_container=mCustomScrollBox.children(".mCSB_container"); 91 if($.support.touch){ 92 mCSB_container.addClass("mCS_touch"); 93 } 94 mCSB_container.after("<div class='mCSB_scrollTools' style='position:absolute;'><div class='mCSB_draggerContainer'><div class='mCSB_dragger' style='position:absolute;' oncontextmenu='return false;'><div class='mCSB_dragger_bar' style='position:relative;'></div></div><div class='mCSB_draggerRail'></div></div></div>"); 95 var mCSB_scrollTools=mCustomScrollBox.children(".mCSB_scrollTools"), 96 mCSB_draggerContainer=mCSB_scrollTools.children(".mCSB_draggerContainer"), 97 mCSB_dragger=mCSB_draggerContainer.children(".mCSB_dragger"); 98 if(options.horizontalScroll){ 99 mCSB_dragger.data("minDraggerWidth",mCSB_dragger.width()); 100 }else{ 101 mCSB_dragger.data("minDraggerHeight",mCSB_dragger.height()); 102 } 103 if(options.scrollButtons.enable){ 104 if(options.horizontalScroll){ 105 mCSB_scrollTools.prepend("<a class='mCSB_buttonLeft' oncontextmenu='return false;'></a>").append("<a class='mCSB_buttonRight' oncontextmenu='return false;'></a>"); 106 }else{ 107 mCSB_scrollTools.prepend("<a class='mCSB_buttonUp' oncontextmenu='return false;'></a>").append("<a class='mCSB_buttonDown' oncontextmenu='return false;'></a>"); 108 } 109 } 110 /*mCustomScrollBox scrollTop and scrollLeft is always 0 to prevent browser focus scrolling*/ 111 mCustomScrollBox.bind("scroll",function(){ 112 if(!$this.is(".mCS_disabled")){ /*native focus scrolling for disabled scrollbars*/ 113 mCustomScrollBox.scrollTop(0).scrollLeft(0); 114 } 115 }); 116 /*store options, global vars/states, intervals*/ 117 $this.data({ 118 /*init state*/ 119 "mCS_Init":true, 120 /*instance index*/ 121 "mCustomScrollbarIndex":$(document).data("mCustomScrollbar-index"), 122 /*option parameters*/ 123 "horizontalScroll":options.horizontalScroll, 124 "scrollInertia":options.scrollInertia, 125 "scrollEasing":"mcsEaseOut", 126 "mouseWheel":options.mouseWheel, 127 "mouseWheelPixels":options.mouseWheelPixels, 128 "autoDraggerLength":options.autoDraggerLength, 129 "autoHideScrollbar":options.autoHideScrollbar, 130 "alwaysShowScrollbar":options.alwaysShowScrollbar, 131 "snapAmount":options.snapAmount, 132 "snapOffset":options.snapOffset, 133 "scrollButtons_enable":options.scrollButtons.enable, 134 "scrollButtons_scrollType":options.scrollButtons.scrollType, 135 "scrollButtons_scrollSpeed":options.scrollButtons.scrollSpeed, 136 "scrollButtons_scrollAmount":options.scrollButtons.scrollAmount, 137 "autoExpandHorizontalScroll":options.advanced.autoExpandHorizontalScroll, 138 "autoScrollOnFocus":options.advanced.autoScrollOnFocus, 139 "normalizeMouseWheelDelta":options.advanced.normalizeMouseWheelDelta, 140 "contentTouchScroll":options.contentTouchScroll, 141 "onScrollStart_Callback":options.callbacks.onScrollStart, 142 "onScroll_Callback":options.callbacks.onScroll, 143 "onTotalScroll_Callback":options.callbacks.onTotalScroll, 144 "onTotalScrollBack_Callback":options.callbacks.onTotalScrollBack, 145 "onTotalScroll_Offset":options.callbacks.onTotalScrollOffset, 146 "onTotalScrollBack_Offset":options.callbacks.onTotalScrollBackOffset, 147 "whileScrolling_Callback":options.callbacks.whileScrolling, 148 /*events binding state*/ 149 "bindEvent_scrollbar_drag":false, 150 "bindEvent_content_touch":false, 151 "bindEvent_scrollbar_click":false, 152 "bindEvent_mousewheel":false, 153 "bindEvent_buttonsContinuous_y":false, 154 "bindEvent_buttonsContinuous_x":false, 155 "bindEvent_buttonsPixels_y":false, 156 "bindEvent_buttonsPixels_x":false, 157 "bindEvent_focusin":false, 158 "bindEvent_autoHideScrollbar":false, 159 /*buttons intervals*/ 160 "mCSB_buttonScrollRight":false, 161 "mCSB_buttonScrollLeft":false, 162 "mCSB_buttonScrollDown":false, 163 "mCSB_buttonScrollUp":false 164 }); 165 /*max-width/max-height*/ 166 if(options.horizontalScroll){ 167 if($this.css("max-width")!=="none"){ 168 if(!options.advanced.updateOnContentResize){ /*needs updateOnContentResize*/ 169 options.advanced.updateOnContentResize=true; 170 } 171 } 172 }else{ 173 if($this.css("max-height")!=="none"){ 174 var percentage=false,maxHeight=parseInt($this.css("max-height")); 175 if($this.css("max-height").indexOf("%")>=0){ 176 percentage=maxHeight, 177 maxHeight=$this.parent().height()*percentage/100; 178 } 179 $this.css("overflow","hidden"); 180 mCustomScrollBox.css("max-height",maxHeight); 181 } 182 } 183 $this.mCustomScrollbar("update"); 184 /*window resize fn (for layouts based on percentages)*/ 185 if(options.advanced.updateOnBrowserResize){ 186 var mCSB_resizeTimeout,currWinWidth=$(window).width(),currWinHeight=$(window).height(); 187 $(window).bind("resize."+$this.data("mCustomScrollbarIndex"),function(){ 188 if(mCSB_resizeTimeout){ 189 clearTimeout(mCSB_resizeTimeout); 190 } 191 mCSB_resizeTimeout=setTimeout(function(){ 192 if(!$this.is(".mCS_disabled") && !$this.is(".mCS_destroyed")){ 193 var winWidth=$(window).width(),winHeight=$(window).height(); 194 if(currWinWidth!==winWidth || currWinHeight!==winHeight){ /*ie8 fix*/ 195 if($this.css("max-height")!=="none" && percentage){ 196 mCustomScrollBox.css("max-height",$this.parent().height()*percentage/100); 197 } 198 $this.mCustomScrollbar("update"); 199 currWinWidth=winWidth; currWinHeight=winHeight; 200 } 201 } 202 },150); 203 });
204 } 205 /*content resize fn (for dynamically generated content)*/ 206 if(options.advanced.updateOnContentResize){ 207 var mCSB_onContentResize; 208 if(options.horizontalScroll){ 209 var mCSB_containerOldSize=mCSB_container.outerWidth(); 210 }else{ 211 var mCSB_containerOldSize=mCSB_container.outerHeight(); 212 } 213 mCSB_onContentResize=setInterval(function(){ 214 if(options.horizontalScroll){ 215 if(options.advanced.autoExpandHorizontalScroll){ 216 mCSB_container.css({"position":"absolute","width":"auto"}).wrap("<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />").css({"width":mCSB_container.outerWidth(),"position":"relative"}).unwrap(); 217 } 218 var mCSB_containerNewSize=mCSB_container.outerWidth(); 219 }else{ 220 var mCSB_containerNewSize=mCSB_container.outerHeight(); 221 } 222 if(mCSB_containerNewSize!=mCSB_containerOldSize){ 223 $this.mCustomScrollbar("update"); 224 mCSB_containerOldSize=mCSB_containerNewSize; 225 } 226 },300); 227 } 228 }); 229 }, 230 update:function(){ 231 var $this=$(this), 232 mCustomScrollBox=$this.children(".mCustomScrollBox"), 233 mCSB_container=mCustomScrollBox.children(".mCSB_container"); 234 mCSB_container.removeClass("mCS_no_scrollbar"); 235 $this.removeClass("mCS_disabled mCS_destroyed"); 236 mCustomScrollBox.scrollTop(0).scrollLeft(0); /*reset scrollTop/scrollLeft to prevent browser focus scrolling*/ 237 var mCSB_scrollTools=mCustomScrollBox.children(".mCSB_scrollTools"), 238 mCSB_draggerContainer=mCSB_scrollTools.children(".mCSB_draggerContainer"), 239 mCSB_dragger=mCSB_draggerContainer.children(".mCSB_dragger"); 240 if($this.data("horizontalScroll")){ 241 var mCSB_buttonLeft=mCSB_scrollTools.children(".mCSB_buttonLeft"), 242 mCSB_buttonRight=mCSB_scrollTools.children(".mCSB_buttonRight"), 243 mCustomScrollBoxW=mCustomScrollBox.width(); 244 if($this.data("autoExpandHorizontalScroll")){ 245 mCSB_container.css({"position":"absolute","width":"auto"}).wrap("<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />").css({"width":mCSB_container.outerWidth(),"position":"relative"}).unwrap(); 246 } 247 var mCSB_containerW=mCSB_container.outerWidth(); 248 }else{ 249 var mCSB_buttonUp=mCSB_scrollTools.children(".mCSB_buttonUp"), 250 mCSB_buttonDown=mCSB_scrollTools.children(".mCSB_buttonDown"), 251 mCustomScrollBoxH=mCustomScrollBox.height(), 252 mCSB_containerH=mCSB_container.outerHeight(); 253 } 254 if(mCSB_containerH>mCustomScrollBoxH && !$this.data("horizontalScroll")){ /*content needs vertical scrolling*/ 255 mCSB_scrollTools.css("display","block"); 256 var mCSB_draggerContainerH=mCSB_draggerContainer.height(); 257 /*auto adjust scrollbar dragger length analogous to content*/ 258 if($this.data("autoDraggerLength")){ 259 var draggerH=Math.round(mCustomScrollBoxH/mCSB_containerH*mCSB_draggerContainerH), 260 minDraggerH=mCSB_dragger.data("minDraggerHeight"); 261 if(draggerH<=minDraggerH){ /*min dragger height*/ 262 mCSB_dragger.css({"height":minDraggerH}); 263 }else if(draggerH>=mCSB_draggerContainerH-10){ /*max dragger height*/ 264 var mCSB_draggerContainerMaxH=mCSB_draggerContainerH-10; 265 mCSB_dragger.css({"height":mCSB_draggerContainerMaxH}); 266 }else{ 267 mCSB_dragger.css({"height":draggerH}); 268 } 269 mCSB_dragger.children(".mCSB_dragger_bar").css({"line-height":mCSB_dragger.height()+"px"}); 270 } 271 var mCSB_draggerH=mCSB_dragger.height(), 272 /*calculate and store scroll amount, add scrolling*/ 273 scrollAmount=(mCSB_containerH-mCustomScrollBoxH)/(mCSB_draggerContainerH-mCSB_draggerH); 274 $this.data("scrollAmount",scrollAmount).mCustomScrollbar("scrolling",mCustomScrollBox,mCSB_container,mCSB_draggerContainer,mCSB_dragger,mCSB_buttonUp,mCSB_buttonDown,mCSB_buttonLeft,mCSB_buttonRight); 275 /*scroll*/ 276 var mCSB_containerP=Math.abs(mCSB_container.position().top); 277 $this.mCustomScrollbar("scrollTo",mCSB_containerP,{scrollInertia:0,trigger:"internal"}); 278 }else if(mCSB_containerW>mCustomScrollBoxW && $this.data("horizontalScroll")){ /*content needs horizontal scrolling*/ 279 mCSB_scrollTools.css("display","block"); 280 var mCSB_draggerContainerW=mCSB_draggerContainer.width(); 281 /*auto adjust scrollbar dragger length analogous to content*/ 282 if($this.data("autoDraggerLength")){ 283 var draggerW=Math.round(mCustomScrollBoxW/mCSB_containerW*mCSB_draggerContainerW), 284 minDraggerW=mCSB_dragger.data("minDraggerWidth"); 285 if(draggerW<=minDraggerW){ /*min dragger height*/ 286 mCSB_dragger.css({"width":minDraggerW}); 287 }else if(draggerW>=mCSB_draggerContainerW-10){ /*max dragger height*/ 288 var mCSB_draggerContainerMaxW=mCSB_draggerContainerW-10; 289 mCSB_dragger.css({"width":mCSB_draggerContainerMaxW}); 290 }else{ 291 mCSB_dragger.css({"width":draggerW}); 292 } 293 } 294 var mCSB_draggerW=mCSB_dragger.width(), 295 /*calculate and store scroll amount, add scrolling*/ 296 scrollAmount=(mCSB_containerW-mCustomScrollBoxW)/(mCSB_draggerContainerW-mCSB_draggerW); 297 $this.data("scrollAmount",scrollAmount).mCustomScrollbar("scrolling",mCustomScrollBox,mCSB_container,mCSB_draggerContainer,mCSB_dragger,mCSB_buttonUp,mCSB_buttonDown,mCSB_buttonLeft,mCSB_buttonRight); 298 /*scroll*/ 299 var mCSB_containerP=Math.abs(mCSB_container.position().left); 300 $this.mCustomScrollbar("scrollTo",mCSB_containerP,{scrollInertia:0,trigger:"internal"}); 301 }else{ /*content does not need scrolling*/ 302 /*unbind events, reset content position, hide scrollbars, remove classes*/ 303 mCustomScrollBox.unbind("mousewheel focusin"); 304 if($this.data("horizontalScroll")){ 305 mCSB_dragger.add(mCSB_container).css("left",0); 306 }else{ 307 mCSB_dragger.add(mCSB_container).css("top",0); 308 } 309 if ($this.data("alwaysShowScrollbar")) { 310 if(!$this.data("horizontalScroll")){ /*vertical scrolling*/ 311 mCSB_dragger.css({"height":mCSB_draggerContainer.height()}); 312 }else if($this.data("horizontalScroll")){ /*horizontal scrolling*/ 313 mCSB_dragger.css({"width":mCSB_draggerContainer.width()}); 314 } 315 } else { 316 mCSB_scrollTools.css("display","none"); 317 mCSB_container.addClass("mCS_no_scrollbar"); 318 } 319 $this.data({"bindEvent_mousewheel":false,"bindEvent_focusin":false}); 320 } 321 }, 322 scrolling:function(mCustomScrollBox,mCSB_container,mCSB_draggerContainer,mCSB_dragger,mCSB_buttonUp,mCSB_buttonDown,mCSB_buttonLeft,mCSB_buttonRight){ 323 var $this=$(this); 324 /*scrollbar drag scrolling*/ 325 if(!$this.data("bindEvent_scrollbar_drag")){ 326 var mCSB_draggerDragY,mCSB_draggerDragX, 327 mCSB_dragger_downEvent,mCSB_dragger_moveEvent,mCSB_dragger_upEvent;
328 if($.support.pointer){ /*pointer*/ 329 mCSB_dragger_downEvent="pointerdown"; 330 mCSB_dragger_moveEvent="pointermove"; 331 mCSB_dragger_upEvent="pointerup"; 332 }else if($.support.msPointer){ /*MSPointer*/ 333 mCSB_dragger_downEvent="MSPointerDown"; 334 mCSB_dragger_moveEvent="MSPointerMove"; 335 mCSB_dragger_upEvent="MSPointerUp"; 336 } 337 if($.support.pointer || $.support.msPointer){ /*pointer, MSPointer*/ 338 mCSB_dragger.bind(mCSB_dragger_downEvent,function(e){ 339 e.preventDefault(); 340 $this.data({"on_drag":true}); mCSB_dragger.addClass("mCSB_dragger_onDrag"); 341 var elem=$(this), 342 elemOffset=elem.offset(), 343 x=e.originalEvent.pageX-elemOffset.left, 344 y=e.originalEvent.pageY-elemOffset.top; 345 if(x<elem.width() && x>0 && y<elem.height() && y>0){ 346 mCSB_draggerDragY=y; 347 mCSB_draggerDragX=x; 348 } 349 }); 350 $(document).bind(mCSB_dragger_moveEvent+"."+$this.data("mCustomScrollbarIndex"),function(e){ 351 e.preventDefault(); 352 if($this.data("on_drag")){ 353 var elem=mCSB_dragger, 354 elemOffset=elem.offset(), 355 x=e.originalEvent.pageX-elemOffset.left, 356 y=e.originalEvent.pageY-elemOffset.top; 357 scrollbarDrag(mCSB_draggerDragY,mCSB_draggerDragX,y,x); 358 } 359 }).bind(mCSB_dragger_upEvent+"."+$this.data("mCustomScrollbarIndex"),function(e){ 360 $this.data({"on_drag":false}); mCSB_dragger.removeClass("mCSB_dragger_onDrag"); 361 }); 362 }else{ /*mouse/touch*/ 363 mCSB_dragger.bind("mousedown touchstart",function(e){ 364 e.preventDefault(); e.stopImmediatePropagation(); 365 var elem=$(this),elemOffset=elem.offset(),x,y; 366 if(e.type==="touchstart"){ 367 var touch=e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; 368 x=touch.pageX-elemOffset.left; y=touch.pageY-elemOffset.top; 369 }else{ 370 $this.data({"on_drag":true}); mCSB_dragger.addClass("mCSB_dragger_onDrag"); 371 x=e.pageX-elemOffset.left; y=e.pageY-elemOffset.top; 372 } 373 if(x<elem.width() && x>0 && y<elem.height() && y>0){ 374 mCSB_draggerDragY=y; mCSB_draggerDragX=x; 375 } 376 }).bind("touchmove",function(e){ 377 e.preventDefault(); e.stopImmediatePropagation(); 378 var touch=e.originalEvent.touches[0] || e.originalEvent.changedTouches[0], 379 elem=$(this), 380 elemOffset=elem.offset(), 381 x=touch.pageX-elemOffset.left, 382 y=touch.pageY-elemOffset.top; 383 scrollbarDrag(mCSB_draggerDragY,mCSB_draggerDragX,y,x); 384 }); 385 $(document).bind("mousemove."+$this.data("mCustomScrollbarIndex"),function(e){ 386 if($this.data("on_drag")){ 387 var elem=mCSB_dragger, 388 elemOffset=elem.offset(), 389 x=e.pageX-elemOffset.left, 390 y=e.pageY-elemOffset.top; 391 scrollbarDrag(mCSB_draggerDragY,mCSB_draggerDragX,y,x); 392 } 393 }).bind("mouseup."+$this.data("mCustomScrollbarIndex"),function(e){ 394 $this.data({"on_drag":false}); mCSB_dragger.removeClass("mCSB_dragger_onDrag"); 395 }); 396 } 397 $this.data({"bindEvent_scrollbar_drag":true}); 398 } 399 function scrollbarDrag(mCSB_draggerDragY,mCSB_draggerDragX,y,x){ 400 if($this.data("horizontalScroll")){ 401 $this.mCustomScrollbar("scrollTo",(mCSB_dragger.position().left-(mCSB_draggerDragX))+x,{moveDragger:true,trigger:"internal"}); 402 }else{ 403 $this.mCustomScrollbar("scrollTo",(mCSB_dragger.position().top-(mCSB_draggerDragY))+y,{moveDragger:true,trigger:"internal"}); 404 } 405 } 406 /*content touch-drag*/ 407 if($.support.touch && $this.data("contentTouchScroll")){ 408 if(!$this.data("bindEvent_content_touch")){ 409 var touch, 410 elem,elemOffset,y,x,mCSB_containerTouchY,mCSB_containerTouchX; 411 mCSB_container.bind("touchstart",function(e){ 412 e.stopImmediatePropagation(); 413 touch=e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; 414 elem=$(this); 415 elemOffset=elem.offset(); 416 x=touch.pageX-elemOffset.left; 417 y=touch.pageY-elemOffset.top; 418 mCSB_containerTouchY=y; 419 mCSB_containerTouchX=x; 420 }); 421 mCSB_container.bind("touchmove",function(e){
422 e.preventDefault(); e.stopImmediatePropagation(); 423 touch=e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; 424 elem=$(this).parent(); 425 elemOffset=elem.offset(); 426 x=touch.pageX-elemOffset.left; 427 y=touch.pageY-elemOffset.top; 428 if($this.data("horizontalScroll")){ 429 $this.mCustomScrollbar("scrollTo",mCSB_containerTouchX-x,{trigger:"internal"}); 430 }else{ 431 $this.mCustomScrollbar("scrollTo",mCSB_containerTouchY-y,{trigger:"internal"}); 432 } 433 }); 434 } 435 } 436 /*dragger rail click scrolling*/ 437 if(!$this.data("bindEvent_scrollbar_click")){ 438 mCSB_draggerContainer.bind("click",function(e){ 439 var scrollToPos=(e.pageY-mCSB_draggerContainer.offset().top)*$this.data("scrollAmount"),target=$(e.target); 440 if($this.data("horizontalScroll")){ 441 scrollToPos=(e.pageX-mCSB_draggerContainer.offset().left)*$this.data("scrollAmount"); 442 } 443 if(target.hasClass("mCSB_draggerContainer") || target.hasClass("mCSB_draggerRail")){ 444 $this.mCustomScrollbar("scrollTo",scrollToPos,{trigger:"internal",scrollEasing:"draggerRailEase"}); 445 } 446 }); 447 $this.data({"bindEvent_scrollbar_click":true}); 448 } 449 /*mousewheel scrolling*/ 450 if($this.data("mouseWheel")){ 451 if(!$this.data("bindEvent_mousewheel")){ 452 mCustomScrollBox.bind("mousewheel",function(e,delta){ 453 var scrollTo,mouseWheelPixels=$this.data("mouseWheelPixels"),absPos=Math.abs(mCSB_container.position().top), 454 draggerPos=mCSB_dragger.position().top,limit=mCSB_draggerContainer.height()-mCSB_dragger.height(); 455 if($this.data("normalizeMouseWheelDelta")){ 456 if(delta<0){delta=-1;}else{delta=1;} 457 } 458 if(mouseWheelPixels==="auto"){ 459 mouseWheelPixels=100+Math.round($this.data("scrollAmount")/2); 460 } 461 if($this.data("horizontalScroll")){ 462 draggerPos=mCSB_dragger.position().left; 463 limit=mCSB_draggerContainer.width()-mCSB_dragger.width(); 464 absPos=Math.abs(mCSB_container.position().left); 465 } 466 if((delta>0 && draggerPos!==0) || (delta<0 && draggerPos!==limit)){e.preventDefault(); e.stopImmediatePropagation();} 467 scrollTo=absPos-(delta*mouseWheelPixels); 468 $this.mCustomScrollbar("scrollTo",scrollTo,{trigger:"internal"}); 469 }); 470 $this.data({"bindEvent_mousewheel":true}); 471 } 472 } 473 /*buttons scrolling*/ 474 if($this.data("scrollButtons_enable")){ 475 if($this.data("scrollButtons_scrollType")==="pixels"){ /*scroll by pixels*/ 476 if($this.data("horizontalScroll")){ 477 mCSB_buttonRight.add(mCSB_buttonLeft).unbind("mousedown touchstart MSPointerDown pointerdown mouseup MSPointerUp pointerup mouseout MSPointerOut pointerout touchend",mCSB_buttonRight_stop,mCSB_buttonLeft_stop); 478 $this.data({"bindEvent_buttonsContinuous_x":false}); 479 if(!$this.data("bindEvent_buttonsPixels_x")){ 480 /*scroll right*/ 481 mCSB_buttonRight.bind("click",function(e){ 482 e.preventDefault(); 483 PixelsScrollTo(Math.abs(mCSB_container.position().left)+$this.data("scrollButtons_scrollAmount")); 484 }); 485 /*scroll left*/ 486 mCSB_buttonLeft.bind("click",function(e){ 487 e.preventDefault(); 488 PixelsScrollTo(Math.abs(mCSB_container.position().left)-$this.data("scrollButtons_scrollAmount")); 489 }); 490 $this.data({"bindEvent_buttonsPixels_x":true}); 491 } 492 }else{ 493 mCSB_buttonDown.add(mCSB_buttonUp).unbind("mousedown touchstart MSPointerDown pointerdown mouseup MSPointerUp pointerup mouseout MSPointerOut pointerout touchend",mCSB_buttonRight_stop,mCSB_buttonLeft_stop); 494 $this.data({"bindEvent_buttonsContinuous_y":false}); 495 if(!$this.data("bindEvent_buttonsPixels_y")){ 496 /*scroll down*/ 497 mCSB_buttonDown.bind("click",function(e){ 498 e.preventDefault(); 499 PixelsScrollTo(Math.abs(mCSB_container.position().top)+$this.data("scrollButtons_scrollAmount")); 500 }); 501 /*scroll up*/ 502 mCSB_buttonUp.bind("click",function(e){ 503 e.preventDefault(); 504 PixelsScrollTo(Math.abs(mCSB_container.position().top)-$this.data("scrollButtons_scrollAmount"));
505 }); 506 $this.data({"bindEvent_buttonsPixels_y":true}); 507 } 508 } 509 function PixelsScrollTo(to){ 510 if(!mCSB_dragger.data("preventAction")){ 511 mCSB_dragger.data("preventAction",true); 512 $this.mCustomScrollbar("scrollTo",to,{trigger:"internal"}); 513 } 514 } 515 }else{ /*continuous scrolling*/ 516 if($this.data("horizontalScroll")){ 517 mCSB_buttonRight.add(mCSB_buttonLeft).unbind("click"); 518 $this.data({"bindEvent_buttonsPixels_x":false}); 519 if(!$this.data("bindEvent_buttonsContinuous_x")){ 520 /*scroll right*/ 521 mCSB_buttonRight.bind("mousedown touchstart MSPointerDown pointerdown",function(e){ 522 e.preventDefault(); 523 var scrollButtonsSpeed=ScrollButtonsSpeed(); 524 $this.data({"mCSB_buttonScrollRight":setInterval(function(){ 525 $this.mCustomScrollbar("scrollTo",Math.abs(mCSB_container.position().left)+scrollButtonsSpeed,{trigger:"internal",scrollEasing:"easeOutCirc"}); 526 },17)}); 527 }); 528 var mCSB_buttonRight_stop=function(e){ 529 e.preventDefault(); clearInterval($this.data("mCSB_buttonScrollRight")); 530 } 531 mCSB_buttonRight.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",mCSB_buttonRight_stop); 532 /*scroll left*/ 533 mCSB_buttonLeft.bind("mousedown touchstart MSPointerDown pointerdown",function(e){ 534 e.preventDefault(); 535 var scrollButtonsSpeed=ScrollButtonsSpeed(); 536 $this.data({"mCSB_buttonScrollLeft":setInterval(function(){ 537 $this.mCustomScrollbar("scrollTo",Math.abs(mCSB_container.position().left)-scrollButtonsSpeed,{trigger:"internal",scrollEasing:"easeOutCirc"}); 538 },17)}); 539 }); 540 var mCSB_buttonLeft_stop=function(e){ 541 e.preventDefault(); clearInterval($this.data("mCSB_buttonScrollLeft")); 542 } 543 mCSB_buttonLeft.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",mCSB_buttonLeft_stop); 544 $this.data({"bindEvent_buttonsContinuous_x":true}); 545 } 546 }else{ 547 mCSB_buttonDown.add(mCSB_buttonUp).unbind("click"); 548 $this.data({"bindEvent_buttonsPixels_y":false}); 549 if(!$this.data("bindEvent_buttonsContinuous_y")){ 550 /*scroll down*/ 551 mCSB_buttonDown.bind("mousedown touchstart MSPointerDown pointerdown",function(e){ 552 e.preventDefault(); 553 var scrollButtonsSpeed=ScrollButtonsSpeed(); 554 $this.data({"mCSB_buttonScrollDown":setInterval(function(){ 555 $this.mCustomScrollbar("scrollTo",Math.abs(mCSB_container.position().top)+scrollButtonsSpeed,{trigger:"internal",scrollEasing:"easeOutCirc"}); 556 },17)}); 557 }); 558 var mCSB_buttonDown_stop=function(e){ 559 e.preventDefault(); clearInterval($this.data("mCSB_buttonScrollDown")); 560 } 561 mCSB_buttonDown.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",mCSB_buttonDown_stop); 562 /*scroll up*/ 563 mCSB_buttonUp.bind("mousedown touchstart MSPointerDown pointerdown",function(e){ 564 e.preventDefault(); 565 var scrollButtonsSpeed=ScrollButtonsSpeed(); 566 $this.data({"mCSB_buttonScrollUp":setInterval(function(){ 567 $this.mCustomScrollbar("scrollTo",Math.abs(mCSB_container.position().top)-scrollButtonsSpeed,{trigger:"internal",scrollEasing:"easeOutCirc"}); 568 },17)}); 569 }); 570 var mCSB_buttonUp_stop=function(e){ 571 e.preventDefault(); clearInterval($this.data("mCSB_buttonScrollUp")); 572 } 573 mCSB_buttonUp.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",mCSB_buttonUp_stop); 574 $this.data({"bindEvent_buttonsContinuous_y":true}); 575 } 576 } 577 function ScrollButtonsSpeed(){ 578 var speed=$this.data("scrollButtons_scrollSpeed"); 579 if($this.data("scrollButtons_scrollSpeed")==="auto"){ 580 speed=Math.round(($this.data("scrollInertia")+100)/40); 581 } 582 return speed; 583 } 584 } 585 } 586 /*scrolling on element focus (e.g. via TAB key)*/ 587 if($this.data("autoScrollOnFocus")){ 588 if(!$this.data("bindEvent_focusin")){ 589 mCustomScrollBox.bind("focusin",function(){ 590 mCustomScrollBox.scrollTop(0).scrollLeft(0); 591 var focusedElem=$(document.activeElement); 592 if(focusedElem.is("input,textarea,select,button,a[tabindex],area,object")){ 593 var mCSB_containerPos=mCSB_container.position().top, 594 focusedElemPos=focusedElem.position().top, 595 visibleLimit=mCustomScrollBox.height()-focusedElem.outerHeight(); 596 if($this.data("horizontalScroll")){ 597 mCSB_containerPos=mCSB_container.position().left; 598 focusedElemPos=focusedElem.position().left; 599 visibleLimit=mCustomScrollBox.width()-focusedElem.outerWidth(); 600 } 601 if(mCSB_containerPos+focusedElemPos<0 || mCSB_containerPos+focusedElemPos>visibleLimit){ 602 $this.mCustomScrollbar("scrollTo",focusedElemPos,{trigger:"internal"}); 603 } 604 } 605 });
606 $this.data({"bindEvent_focusin":true}); 607 } 608 } 609 /*auto-hide scrollbar*/ 610 if($this.data("autoHideScrollbar") && !$this.data("alwaysShowScrollbar")){ 611 if(!$this.data("bindEvent_autoHideScrollbar")){ 612 mCustomScrollBox.bind("mouseenter",function(e){ 613 mCustomScrollBox.addClass("mCS-mouse-over"); 614 functions.showScrollbar.call(mCustomScrollBox.children(".mCSB_scrollTools")); 615 }).bind("mouseleave touchend",function(e){ 616 mCustomScrollBox.removeClass("mCS-mouse-over"); 617 if(e.type==="mouseleave"){functions.hideScrollbar.call(mCustomScrollBox.children(".mCSB_scrollTools"));} 618 }); 619 $this.data({"bindEvent_autoHideScrollbar":true}); 620 } 621 } 622 }, 623 scrollTo:function(scrollTo,options){ 624 var $this=$(this), 625 defaults={ 626 moveDragger:false, 627 trigger:"external", 628 callbacks:true, 629 scrollInertia:$this.data("scrollInertia"), 630 scrollEasing:$this.data("scrollEasing") 631 }, 632 options=$.extend(defaults,options), 633 draggerScrollTo, 634 mCustomScrollBox=$this.children(".mCustomScrollBox"), 635 mCSB_container=mCustomScrollBox.children(".mCSB_container"), 636 mCSB_scrollTools=mCustomScrollBox.children(".mCSB_scrollTools"), 637 mCSB_draggerContainer=mCSB_scrollTools.children(".mCSB_draggerContainer"), 638 mCSB_dragger=mCSB_draggerContainer.children(".mCSB_dragger"), 639 contentSpeed=draggerSpeed=options.scrollInertia, 640 scrollBeginning,scrollBeginningOffset,totalScroll,totalScrollOffset; 641 if(!mCSB_container.hasClass("mCS_no_scrollbar")){ 642 $this.data({"mCS_trigger":options.trigger}); 643 if($this.data("mCS_Init")){options.callbacks=false;} 644 if(scrollTo || scrollTo===0){ 645 if(typeof(scrollTo)==="number"){ /*if integer, scroll by number of pixels*/ 646 if(options.moveDragger){ /*scroll dragger*/ 647 draggerScrollTo=scrollTo; 648 if($this.data("horizontalScroll")){ 649 scrollTo=mCSB_dragger.position().left*$this.data("scrollAmount"); 650 }else{ 651 scrollTo=mCSB_dragger.position().top*$this.data("scrollAmount"); 652 } 653 draggerSpeed=0; 654 }else{ /*scroll content by default*/ 655 draggerScrollTo=scrollTo/$this.data("scrollAmount"); 656 } 657 }else if(typeof(scrollTo)==="string"){ /*if string, scroll by element position*/ 658 var target; 659 if(scrollTo==="top"){ /*scroll to top*/ 660 target=0; 661 }else if(scrollTo==="bottom" && !$this.data("horizontalScroll")){ /*scroll to bottom*/ 662 target=mCSB_container.outerHeight()-mCustomScrollBox.height(); 663 }else if(scrollTo==="left"){ /*scroll to left*/ 664 target=0; 665 }else if(scrollTo==="right" && $this.data("horizontalScroll")){ /*scroll to right*/ 666 target=mCSB_container.outerWidth()-mCustomScrollBox.width(); 667 }else if(scrollTo==="first"){ /*scroll to first element position*/ 668 target=$this.find(".mCSB_container").find(":first"); 669 }else if(scrollTo==="last"){ /*scroll to last element position*/ 670 target=$this.find(".mCSB_container").find(":last"); 671 }else{ /*scroll to element position*/ 672 target=$this.find(scrollTo); 673 } 674 if(target.length===1){ /*if such unique element exists, scroll to it*/ 675 if($this.data("horizontalScroll")){ 676 scrollTo=target.position().left; 677 }else{ 678 scrollTo=target.position().top; 679 } 680 draggerScrollTo=scrollTo/$this.data("scrollAmount"); 681 }else{ 682 draggerScrollTo=scrollTo=target; 683 } 684 } 685 /*scroll to*/ 686 if($this.data("horizontalScroll")){ 687 if($this.data("onTotalScrollBack_Offset")){ /*scroll beginning offset*/ 688 scrollBeginningOffset=-$this.data("onTotalScrollBack_Offset"); 689 } 690 if($this.data("onTotalScroll_Offset")){ /*total scroll offset*/ 691 totalScrollOffset=mCustomScrollBox.width()-mCSB_container.outerWidth()+$this.data("onTotalScroll_Offset"); 692 } 693 if(draggerScrollTo<0){ /*scroll start position*/ 694 draggerScrollTo=scrollTo=0; clearInterval($this.data("mCSB_buttonScrollLeft")); 695 if(!scrollBeginningOffset){scrollBeginning=true;} 696 }else if(draggerScrollTo>=mCSB_draggerContainer.width()-mCSB_dragger.width()){ /*scroll end position*/ 697 draggerScrollTo=mCSB_draggerContainer.width()-mCSB_dragger.width(); 698 scrollTo=mCustomScrollBox.width()-mCSB_container.outerWidth(); clearInterval($this.data("mCSB_buttonScrollRight")); 699 if(!totalScrollOffset){totalScroll=true;} 700 }else{scrollTo=-scrollTo;} 701 var snapAmount = $this.data("snapAmount"); 702 if (snapAmount) { 703 scrollTo = Math.round(scrollTo / snapAmount) * snapAmount - $this.data("snapOffset"); 704 } 705 /*scrolling animation*/ 706 functions.mTweenAxis.call(this,mCSB_dragger[0],"left",Math.round(draggerScrollTo),draggerSpeed,options.scrollEasing); 707 functions.mTweenAxis.call(this,mCSB_container[0],"left",Math.round(scrollTo),contentSpeed,options.scrollEasing,{ 708 onStart:function(){ 709 if(options.callbacks && !$this.data("mCS_tweenRunning")){callbacks("onScrollStart");} 710 if($this.data("autoHideScrollbar") && !$this.data("alwaysShowScrollbar")){functions.showScrollbar.call(mCSB_scrollTools);} 711 }, 712 onUpdate:function(){ 713 if(options.callbacks){callbacks("whileScrolling");} 714 }, 715 onComplete:function(){ 716 if(options.callbacks){ 717 callbacks("onScroll"); 718 if(scrollBeginning || (scrollBeginningOffset && mCSB_container.position().left>=scrollBeginningOffset)){callbacks("onTotalScrollBack");} 719 if(totalScroll || (totalScrollOffset && mCSB_container.position().left<=totalScrollOffset)){callbacks("onTotalScroll");} 720 } 721 mCSB_dragger.data("preventAction",false); $this.data("mCS_tweenRunning",false); 722 if($this.data("autoHideScrollbar") && !$this.data("alwaysShowScrollbar")){if(!mCustomScrollBox.hasClass("mCS-mouse-over")){functions.hideScrollbar.call(mCSB_scrollTools);}} 723 } 724 });
725 }else{ 726 if($this.data("onTotalScrollBack_Offset")){ /*scroll beginning offset*/ 727 scrollBeginningOffset=-$this.data("onTotalScrollBack_Offset"); 728 } 729 if($this.data("onTotalScroll_Offset")){ /*total scroll offset*/ 730 totalScrollOffset=mCustomScrollBox.height()-mCSB_container.outerHeight()+$this.data("onTotalScroll_Offset"); 731 } 732 if(draggerScrollTo<0){ /*scroll start position*/ 733 draggerScrollTo=scrollTo=0; clearInterval($this.data("mCSB_buttonScrollUp")); 734 if(!scrollBeginningOffset){scrollBeginning=true;} 735 }else if(draggerScrollTo>=mCSB_draggerContainer.height()-mCSB_dragger.height()){ /*scroll end position*/ 736 draggerScrollTo=mCSB_draggerContainer.height()-mCSB_dragger.height(); 737 scrollTo=mCustomScrollBox.height()-mCSB_container.outerHeight(); clearInterval($this.data("mCSB_buttonScrollDown")); 738 if(!totalScrollOffset){totalScroll=true;} 739 }else{scrollTo=-scrollTo;} 740 var snapAmount = $this.data("snapAmount"); 741 if (snapAmount) { 742 scrollTo = Math.round(scrollTo / snapAmount) * snapAmount - $this.data("snapOffset"); 743 } 744 /*scrolling animation*/ 745 functions.mTweenAxis.call(this,mCSB_dragger[0],"top",Math.round(draggerScrollTo),draggerSpeed,options.scrollEasing); 746 functions.mTweenAxis.call(this,mCSB_container[0],"top",Math.round(scrollTo),contentSpeed,options.scrollEasing,{ 747 onStart:function(){ 748 if(options.callbacks && !$this.data("mCS_tweenRunning")){callbacks("onScrollStart");} 749 if($this.data("autoHideScrollbar") && !$this.data("alwaysShowScrollbar")){functions.showScrollbar.call(mCSB_scrollTools);} 750 }, 751 onUpdate:function(){ 752 if(options.callbacks){callbacks("whileScrolling");} 753 }, 754 onComplete:function(){ 755 if(options.callbacks){ 756 callbacks("onScroll"); 757 if(scrollBeginning || (scrollBeginningOffset && mCSB_container.position().top>=scrollBeginningOffset)){callbacks("onTotalScrollBack");} 758 if(totalScroll || (totalScrollOffset && mCSB_container.position().top<=totalScrollOffset)){callbacks("onTotalScroll");} 759 } 760 mCSB_dragger.data("preventAction",false); $this.data("mCS_tweenRunning",false); 761 if($this.data("autoHideScrollbar") && !$this.data("alwaysShowScrollbar")){if(!mCustomScrollBox.hasClass("mCS-mouse-over")){functions.hideScrollbar.call(mCSB_scrollTools);}} 762 } 763 }); 764 } 765 if($this.data("mCS_Init")){$this.data({"mCS_Init":false});} 766 } 767 } 768 /*callbacks*/ 769 function callbacks(cb){ 770 if ($this.data("mCustomScrollbarIndex")) { 771 this.mcs = { 772 top: mCSB_container.position().top, left: mCSB_container.position().left, 773 draggerTop: mCSB_dragger.position().top, draggerLeft: mCSB_dragger.position().left, 774 topPct: Math.round((100 * Math.abs(mCSB_container.position().top)) / Math.abs(mCSB_container.outerHeight() - mCustomScrollBox.height())), 775 leftPct: Math.round((100 * Math.abs(mCSB_container.position().left)) / Math.abs(mCSB_container.outerWidth() - mCustomScrollBox.width())) 776 }; 777 switch (cb) { 778 /*start scrolling callback*/ 779 case "onScrollStart": 780 $this.data("mCS_tweenRunning", true).data("onScrollStart_Callback").call($this, this.mcs); 781 break; 782 case "whileScrolling": 783 $this.data("whileScrolling_Callback").call($this, this.mcs); 784 break; 785 case "onScroll": 786 $this.data("onScroll_Callback").call($this, this.mcs); 787 break; 788 case "onTotalScrollBack": 789 $this.data("onTotalScrollBack_Callback").call($this, this.mcs); 790 break; 791 case "onTotalScroll": 792 $this.data("onTotalScroll_Callback").call($this, this.mcs); 793 break; 794 } 795 } 796 } 797 }, 798 stop:function(){ 799 var $this=$(this), 800 mCSB_container=$this.children().children(".mCSB_container"), 801 mCSB_dragger=$this.children().children().children().children(".mCSB_dragger"); 802 functions.mTweenAxisStop.call(this,mCSB_container[0]); 803 functions.mTweenAxisStop.call(this,mCSB_dragger[0]); 804 }, 805 disable:function(resetScroll){ 806 var $this=$(this), 807 mCustomScrollBox=$this.children(".mCustomScrollBox"), 808 mCSB_container=mCustomScrollBox.children(".mCSB_container"), 809 mCSB_scrollTools=mCustomScrollBox.children(".mCSB_scrollTools"), 810 mCSB_dragger=mCSB_scrollTools.children().children(".mCSB_dragger"); 811 mCustomScrollBox.unbind("mousewheel focusin mouseenter mouseleave touchend"); 812 mCSB_container.unbind("touchstart touchmove") 813 if(resetScroll){ 814 if($this.data("horizontalScroll")){ 815 mCSB_dragger.add(mCSB_container).css("left",0); 816 }else{ 817 mCSB_dragger.add(mCSB_container).css("top",0); 818 } 819 } 820 mCSB_scrollTools.css("display","none"); 821 mCSB_container.addClass("mCS_no_scrollbar"); 822 $this.data({"bindEvent_mousewheel":false,"bindEvent_focusin":false,"bindEvent_content_touch":false,"bindEvent_autoHideScrollbar":false}).addClass("mCS_disabled"); 823 }, 824 destroy:function(){ 825 var $this=$(this); 826 $this.removeClass("mCustomScrollbar _mCS_"+$this.data("mCustomScrollbarIndex")).addClass("mCS_destroyed").children().children(".mCSB_container").unwrap().children().unwrap().siblings(".mCSB_scrollTools").remove(); 827 $(document).unbind("mousemove."+$this.data("mCustomScrollbarIndex")+" mouseup."+$this.data("mCustomScrollbarIndex")+" MSPointerMove."+$this.data("mCustomScrollbarIndex")+" MSPointerUp."+$this.data("mCustomScrollbarIndex")); 828 $(window).unbind("resize."+$this.data("mCustomScrollbarIndex")); 829 } 830 }, 831 functions={ 832 /*hide/show scrollbar*/ 833 showScrollbar:function(){ 834 this.stop().animate({opacity:1},"fast"); 835 }, 836 hideScrollbar:function(){ 837 this.stop().animate({opacity:0}
837,"fast"); 838 }, 839 /*js animation tween*/ 840 mTweenAxis:function(el,prop,to,duration,easing,callbacks){ 841 var callbacks=callbacks || {}, 842 onStart=callbacks.onStart || function(){},onUpdate=callbacks.onUpdate || function(){},onComplete=callbacks.onComplete || function(){}; 843 var startTime=_getTime(),_delay,progress=0,from=el.offsetTop,elStyle=el.style; 844 if(prop==="left"){from=el.offsetLeft;} 845 var diff=to-from; 846 _cancelTween(); 847 _startTween(); 848 function _getTime(){ 849 if(window.performance && window.performance.now){ 850 return window.performance.now(); 851 }else{ 852 if(window.performance && window.performance.webkitNow){ 853 return window.performance.webkitNow(); 854 }else{ 855 if(Date.now){return Date.now();}else{return new Date().getTime();} 856 } 857 } 858 } 859 function _step(){ 860 if(!progress){onStart.call();} 861 progress=_getTime()-startTime; 862 _tween(); 863 if(progress>=el._time){ 864 el._time=(progress>el._time) ? progress+_delay-(progress- el._time) : progress+_delay-1; 865 if(el._time<progress+1){el._time=progress+1;} 866 } 867 if(el._time<duration){el._id=_request(_step);}else{onComplete.call();} 868 } 869 function _tween(){ 870 if(duration>0){ 871 el.currVal=_ease(el._time,from,diff,duration,easing); 872 elStyle[prop]=Math.round(el.currVal)+"px"; 873 }else{ 874 elStyle[prop]=to+"px"; 875 } 876 onUpdate.call(); 877 } 878 function _startTween(){ 879 _delay=1000/60; 880 el._time=progress+_delay; 881 _request=(!window.requestAnimationFrame) ? function(f){_tween(); return setTimeout(f,0.01);} : window.requestAnimationFrame; 882 el._id=_request(_step); 883 } 884 function _cancelTween(){ 885 if(el._id==null){return;} 886 if(!window.requestAnimationFrame){clearTimeout(el._id); 887 }else{window.cancelAnimationFrame(el._id);} 888 el._id=null; 889 } 890 function _ease(t,b,c,d,type){ 891 switch(type){ 892 case "linear": 893 return c*t/d + b; 894 break; 895 case "easeOutQuad": 896 t /= d; return -c * t*(t-2) + b; 897 break; 898 case "easeInOutQuad": 899 t /= d/2; 900 if (t < 1) return c/2*t*t + b; 901 t--; 902 return -c/2 * (t*(t-2) - 1) + b; 903 break; 904 case "easeOutCubic": 905 t /= d; t--; return c*(t*t*t + 1) + b; 906 break; 907 case "easeOutQuart": 908 t /= d; t--; return -c * (t*t*t*t - 1) + b; 909 break; 910 case "easeOutQuint": 911 t /= d; t--; return c*(t*t*t*t*t + 1) + b; 912 break; 913 case "easeOutCirc": 914 t /= d; t--; return c * Math.sqrt(1 - t*t) + b; 915 break; 916 case "easeOutSine": 917 return c * Math.sin(t/d * (Math.PI/2)) + b; 918 break; 919 case "easeOutExpo": 920 return c * ( -Math.pow( 2, -10 * t/d ) + 1 ) + b; 921 break; 922 case "mcsEaseOut": 923 var ts=(t/=d)*t,tc=ts*t; 924 return b+c*(0.499999999999997*tc*ts + -2.5*ts*ts + 5.5*tc + -6.5*ts + 4*t); 925 break; 926 case "draggerRailEase": 927 t /= d/2; 928 if (t < 1) return c/2*t*t*t + b; 929 t -= 2; 930 return c/2*(t*t*t + 2) + b; 931 break; 932 } 933 } 934 }, 935 /*stop js animation tweens*/ 936 mTweenAxisStop:function(el){ 937 if(el._id==null){return;} 938 if(!window.requestAnimationFrame){clearTimeout(el._id); 939 }else{window.cancelAnimationFrame(el._id);} 940 el._id=null; 941 }, 942 /*detect requestAnimationFrame and polyfill*/ 943 rafPolyfill:function(){ 944 var pfx=["ms","moz","webkit","o"],i=pfx.length; 945 while(--i > -1 && !window.requestAnimationFrame){ 946 window.requestAnimationFrame=window[pfx[i]+"RequestAnimationFrame"]; 947 window.cancelAnimationFrame=window[pfx[i]+"CancelAnimationFrame"] || window[pfx[i]+"CancelRequestAnimationFrame"]; 948 } 949 } 950 } 951 /*detect features*/ 952 functions.rafPolyfill.call(); /*requestAnimationFrame*/ 953 $.support.touch=!!('ontouchstart' in window); /*touch*/ 954 $.support.pointer=window.navigator.pointerEnabled; /*pointer support*/ 955 $.support.msPointer=window.navigator.msPointerEnabled; /*MSPointer support*/ 956 /*plugin dependencies*/ 957 var _dlp=("https:"==document.location.protocol) ? "https:" : "http:";
958 $.event.special.mousewheel || document.write('<script src="'+_dlp+'//cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.0.6/jquery.mousewheel.min.js"><\/script>'); 959 /*plugin fn*/ 960 $.fn.mCustomScrollbar=function(method){ 961 if(methods[method]){ 962 return methods[method].apply(this,Array.prototype.slice.call(arguments,1)); 963 }else if(typeof method==="object" || !method){ 964 return methods.init.apply(this,arguments); 965 }else{ 966 $.error("Method "+method+" does not exist"); 967 } 968 }; 969})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.