PageSourceSearch

https://nathanielxross.com/wp-content/plugins/content_timeline/js/…?ver=f3d867490a5386b120fe64d5cd289ae4

js nathanielxross.com collected 2026-10-04 06:35:58 UTC 47,192 bytes, 969 lines download raw bytes

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.