/*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net) * Licensed under the MIT License (LICENSE.txt). * * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. * Thanks to: Seamus Leahy for adding deltaX and deltaY * * Version: 3.0.6 * * Requires: 1.2.2+ */ (function(a) { function d(b) { var c = b || window.event, d = [].slice.call(arguments, 1), e = 0, f = !0, g = 0, h = 0; return b = a.event.fix(c), b.type = "mousewheel", c.wheelDelta && (e = c.wheelDelta / 120), c.detail && (e = -c.detail / 3), h = e, c.axis !== undefined && c.axis === c.HORIZONTAL_AXIS && (h = 0, g = -1 * e), c.wheelDeltaY !== undefined && (h = c.wheelDeltaY / 120), c.wheelDeltaX !== undefined && (g = -1 * c.wheelDeltaX / 120), d.unshift(b, e, g, h), (a.event.dispatch || a.event.handle).apply(this, d) } var b = ["DOMMouseScroll", "mousewheel"]; if (a.event.fixHooks) for (var c = b.length; c;) a.event.fixHooks[b[--c]] = a.event.mouseHooks; a.event.special.mousewheel = { setup: function() { if (this.addEventListener) for (var a = b.length; a;) this.addEventListener(b[--a], d, !1); else this.onmousewheel = d }, teardown: function() { if (this.removeEventListener) for (var a = b.length; a;) this.removeEventListener(b[--a], d, !1); else this.onmousewheel = null } }, a.fn.extend({ mousewheel: function(a) { return a ? this.bind("mousewheel", a) : this.trigger("mousewheel") }, unmousewheel: function(a) { return this.unbind("mousewheel", a) } }) })(jQuery); /* * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ * * Uses the built in easing capabilities added In jQuery 1.1 * to offer multiple easing options * * TERMS OF USE - jQuery Easing * * Open source under the BSD License. * * Copyright © 2008 George McGinley Smith * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * Neither the name of the author nor the names of contributors may be used to endorse * or promote products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ // t: current time, b: begInnIng value, c: change In value, d: duration jQuery.easing['jswing'] = jQuery.easing['swing']; jQuery.extend(jQuery.easing, { def: 'easeOutQuad', swing: function(x, t, b, c, d) { //alert(jQuery.easing.default); return jQuery.easing[jQuery.easing.def](x, t, b, c, d); }, easeInQuad: function(x, t, b, c, d) { return c * (t /= d) * t + b; }, easeOutQuad: function(x, t, b, c, d) { return -c * (t /= d) * (t - 2) + b; }, easeInOutQuad: function(x, t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t + b; return -c / 2 * ((--t) * (t - 2) - 1) + b; }, easeInCubic: function(x, t, b, c, d) { return c * (t /= d) * t * t + b; }, easeOutCubic: function(x, t, b, c, d) { return c * ((t = t / d - 1) * t * t + 1) + b; }, easeInOutCubic: function(x, t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t + b; return c / 2 * ((t -= 2) * t * t + 2) + b; }, easeInQuart: function(x, t, b, c, d) { return c * (t /= d) * t * t * t + b; }, easeOutQuart: function(x, t, b, c, d) { return -c * ((t = t / d - 1) * t * t * t - 1) + b; }, easeInOutQuart: function(x, t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b; return -c / 2 * ((t -= 2) * t * t * t - 2) + b; }, easeInQuint: function(x, t, b, c, d) { return c * (t /= d) * t * t * t * t + b; }, easeOutQuint: function(x, t, b, c, d) { return c * ((t = t / d - 1) * t * t * t * t + 1) + b; }, easeInOutQuint: function(x, t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b; return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; }, easeInSine: function(x, t, b, c, d) { return -c * Math.cos(t / d * (Math.PI / 2)) + c + b; }, easeOutSine: function(x, t, b, c, d) { return c * Math.sin(t / d * (Math.PI / 2)) + b; }, easeInOutSine: function(x, t, b, c, d) { return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b; }, easeInExpo: function(x, t, b, c, d) { return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b; }, easeOutExpo: function(x, t, b, c, d) { return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; }, easeInOutExpo: function(x, t, b, c, d) { if (t == 0) return b; if (t == d) return b + c; if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b; return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b; }, easeInCirc: function(x, t, b, c, d) { return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b; }, easeOutCirc: function(x, t, b, c, d) { return c * Math.sqrt(1 - (t = t / d - 1) * t) + b; }, easeInOutCirc: function(x, t, b, c, d) { if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b; return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; }, easeInElastic: function(x, t, b, c, d) { var s = 1.70158; var p = 0; var a = c; if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!p) p = d * .3; if (a < Math.abs(c)) { a = c; var s = p / 4; } else var s = p / (2 * Math.PI) * Math.asin(c / a); return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; }, easeOutElastic: function(x, t, b, c, d) { var s = 1.70158; var p = 0; var a = c; if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!p) p = d * .3; if (a < Math.abs(c)) { a = c; var s = p / 4; } else var s = p / (2 * Math.PI) * Math.asin(c / a); return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b; }, easeInOutElastic: function(x, t, b, c, d) { var s = 1.70158; var p = 0; var a = c; if (t == 0) return b; if ((t /= d / 2) == 2) return b + c; if (!p) p = d * (.3 * 1.5); if (a < Math.abs(c)) { a = c; var s = p / 4; } else var s = p / (2 * Math.PI) * Math.asin(c / a); if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b; }, easeInBack: function(x, t, b, c, d, s) { if (s == undefined) s = 1.70158; return c * (t /= d) * t * ((s + 1) * t - s) + b; }, easeOutBack: function(x, t, b, c, d, s) { if (s == undefined) s = 1.70158; return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; }, easeInOutBack: function(x, t, b, c, d, s) { if (s == undefined) s = 1.70158; if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; }, easeInBounce: function(x, t, b, c, d) { return c - jQuery.easing.easeOutBounce(x, d - t, 0, c, d) + b; }, easeOutBounce: function(x, t, b, c, d) { if ((t /= d) < (1 / 2.75)) { return c * (7.5625 * t * t) + b; } else if (t < (2 / 2.75)) { return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b; } else if (t < (2.5 / 2.75)) { return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b; } else { return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b; } }, easeInOutBounce: function(x, t, b, c, d) { if (t < d / 2) return jQuery.easing.easeInBounce(x, t * 2, 0, c, d) * .5 + b; return jQuery.easing.easeOutBounce(x, t * 2 - d, 0, c, d) * .5 + c * .5 + b; } }); /* * * TERMS OF USE - EASING EQUATIONS * * Open source under the BSD License. * * Copyright © 2001 Robert Penner * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * Neither the name of the author nor the names of contributors may be used to endorse * or promote products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ ; /* == malihu jquery custom scrollbars plugin == version: 2.8.3 author: malihu (http://manos.malihu.gr) plugin home: http://manos.malihu.gr/jquery-custom-content-scroller */ /* Copyright 2010-2013 Manos Malihutsakis This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see http://www.gnu.org/licenses/lgpl.html. */ (function($) { /*plugin script*/ var methods = { init: function(options) { var defaults = { set_width: false, /*optional element width: boolean, pixels, percentage*/ set_height: false, /*optional element height: boolean, pixels, percentage*/ horizontalScroll: true, /*scroll horizontally: boolean*/ scrollInertia: 950, /*scrolling inertia: integer (milliseconds)*/ mouseWheel: true, /*mousewheel support: boolean*/ mouseWheelPixels: "auto", /*mousewheel pixels amount: integer, "auto"*/ autoDraggerLength: true, /*auto-adjust scrollbar dragger length: boolean*/ autoHideScrollbar: false, /*auto-hide scrollbar when idle*/ alwaysShowScrollbar: false, /*always show scrollbar even when there's nothing to scroll (disables autoHideScrollbar): boolean*/ snapAmount: null, /* optional element always snaps to a multiple of this number in pixels */ snapOffset: 0, /* when snapping, snap with this number in pixels as an offset */ scrollButtons: { /*scroll buttons*/ enable: false, /*scroll buttons support: boolean*/ scrollType: "continuous", /*scroll buttons scrolling type: "continuous", "pixels"*/ scrollSpeed: "auto", /*scroll buttons continuous scrolling speed: integer, "auto"*/ scrollAmount: 40 /*scroll buttons pixels scroll amount: integer (pixels)*/ }, advanced: { updateOnBrowserResize: true, /*update scrollbars on browser resize (for layouts based on percentages): boolean*/ updateOnContentResize: false, /*auto-update scrollbars on content resize (for dynamic content): boolean*/ autoExpandHorizontalScroll: false, /*auto-expand width for horizontal scrolling: boolean*/ autoScrollOnFocus: true, /*auto-scroll on focused elements: boolean*/ normalizeMouseWheelDelta: false /*normalize mouse-wheel delta (-1/1)*/ }, contentTouchScroll: true, /*scrolling by touch-swipe content: boolean*/ callbacks: { onScrollStart: function() {}, /*user custom callback function on scroll start event*/ onScroll: function() {}, /*user custom callback function on scroll event*/ onTotalScroll: function() {}, /*user custom callback function on scroll end reached event*/ onTotalScrollBack: function() {}, /*user custom callback function on scroll begin reached event*/ onTotalScrollOffset: 0, /*scroll end reached offset: integer (pixels)*/ onTotalScrollBackOffset: 0, /*scroll begin reached offset: integer (pixels)*/ whileScrolling: function() {} /*user custom callback function on scrolling event*/ }, theme: "light" /*"light", "dark", "light-2", "dark-2", "light-thick", "dark-thick", "light-thin", "dark-thin"*/ }, options = $.extend(true, defaults, options); return this.each(function() { var $this = $(this); /*set element width/height, create markup for custom scrollbars, add classes*/ if (options.set_width) { $this.css("width", options.set_width); } if (options.set_height) { $this.css("height", options.set_height); } if (!$(document).data("mCustomScrollbar-index")) { $(document).data("mCustomScrollbar-index", "1"); } else { var mCustomScrollbarIndex = parseInt($(document).data("mCustomScrollbar-index")); $(document).data("mCustomScrollbar-index", mCustomScrollbarIndex + 1); } $this.wrapInner("
").addClass("mCustomScrollbar _mCS_" + $(document).data("mCustomScrollbar-index")); var mCustomScrollBox = $this.children(".mCustomScrollBox"); if (options.horizontalScroll) { mCustomScrollBox.addClass("mCSB_horizontal").wrapInner("
"); var mCSB_h_wrapper = mCustomScrollBox.children(".mCSB_h_wrapper"); mCSB_h_wrapper.wrapInner("
").children(".mCSB_container").css({ "width": mCSB_h_wrapper.children().outerWidth(), "position": "relative" }).unwrap(); } else { mCustomScrollBox.wrapInner("
"); } var mCSB_container = mCustomScrollBox.children(".mCSB_container"); if ($.support.touch) { mCSB_container.addClass("mCS_touch"); } mCSB_container.after("
"); var mCSB_scrollTools = mCustomScrollBox.children(".mCSB_scrollTools"), mCSB_draggerContainer = mCSB_scrollTools.children(".mCSB_draggerContainer"), mCSB_dragger = mCSB_draggerContainer.children(".mCSB_dragger"); if (options.horizontalScroll) { mCSB_dragger.data("minDraggerWidth", mCSB_dragger.width()); } else { mCSB_dragger.data("minDraggerHeight", mCSB_dragger.height()); } if (options.scrollButtons.enable) { if (options.horizontalScroll) { mCSB_scrollTools.prepend("").append(""); } else { mCSB_scrollTools.prepend("").append(""); } } /*mCustomScrollBox scrollTop and scrollLeft is always 0 to prevent browser focus scrolling*/ mCustomScrollBox.bind("scroll", function() { if (!$this.is(".mCS_disabled")) { /*native focus scrolling for disabled scrollbars*/ mCustomScrollBox.scrollTop(0).scrollLeft(0); } }); /*store options, global vars/states, intervals*/ $this.data({ /*init state*/ "mCS_Init": true, /*instance index*/ "mCustomScrollbarIndex": $(document).data("mCustomScrollbar-index"), /*option parameters*/ "horizontalScroll": options.horizontalScroll, "scrollInertia": options.scrollInertia, "scrollEasing": "mcsEaseOut", "mouseWheel": options.mouseWheel, "mouseWheelPixels": options.mouseWheelPixels, "autoDraggerLength": options.autoDraggerLength, "autoHideScrollbar": options.autoHideScrollbar, "alwaysShowScrollbar": options.alwaysShowScrollbar, "snapAmount": options.snapAmount, "snapOffset": options.snapOffset, "scrollButtons_enable": options.scrollButtons.enable, "scrollButtons_scrollType": options.scrollButtons.scrollType, "scrollButtons_scrollSpeed": options.scrollButtons.scrollSpeed, "scrollButtons_scrollAmount": options.scrollButtons.scrollAmount, "autoExpandHorizontalScroll": options.advanced.autoExpandHorizontalScroll, "autoScrollOnFocus": options.advanced.autoScrollOnFocus, "normalizeMouseWheelDelta": options.advanced.normalizeMouseWheelDelta, "contentTouchScroll": options.contentTouchScroll, "onScrollStart_Callback": options.callbacks.onScrollStart, "onScroll_Callback": options.callbacks.onScroll, "onTotalScroll_Callback": options.callbacks.onTotalScroll, "onTotalScrollBack_Callback": options.callbacks.onTotalScrollBack, "onTotalScroll_Offset": options.callbacks.onTotalScrollOffset, "onTotalScrollBack_Offset": options.callbacks.onTotalScrollBackOffset, "whileScrolling_Callback": options.callbacks.whileScrolling, /*events binding state*/ "bindEvent_scrollbar_drag": false, "bindEvent_content_touch": false, "bindEvent_scrollbar_click": false, "bindEvent_mousewheel": false, "bindEvent_buttonsContinuous_y": false, "bindEvent_buttonsContinuous_x": false, "bindEvent_buttonsPixels_y": false, "bindEvent_buttonsPixels_x": false, "bindEvent_focusin": false, "bindEvent_autoHideScrollbar": false, /*buttons intervals*/ "mCSB_buttonScrollRight": false, "mCSB_buttonScrollLeft": false, "mCSB_buttonScrollDown": false, "mCSB_buttonScrollUp": false }); /*max-width/max-height*/ if (options.horizontalScroll) { if ($this.css("max-width") !== "none") { if (!options.advanced.updateOnContentResize) { /*needs updateOnContentResize*/ options.advanced.updateOnContentResize = true; } } } else { if ($this.css("max-height") !== "none") { var percentage = false, maxHeight = parseInt($this.css("max-height")); if ($this.css("max-height").indexOf("%") >= 0) { percentage = maxHeight, maxHeight = $this.parent().height() * percentage / 100; } $this.css("overflow", "hidden"); mCustomScrollBox.css("max-height", maxHeight); } } $this.mCustomScrollbar("update"); /*window resize fn (for layouts based on percentages)*/ if (options.advanced.updateOnBrowserResize) { var mCSB_resizeTimeout, currWinWidth = $(window).width(), currWinHeight = $(window).height(); $(window).bind("resize." + $this.data("mCustomScrollbarIndex"), function() { if (mCSB_resizeTimeout) { clearTimeout(mCSB_resizeTimeout); } mCSB_resizeTimeout = setTimeout(function() { if (!$this.is(".mCS_disabled") && !$this.is(".mCS_destroyed")) { var winWidth = $(window).width(), winHeight = $(window).height(); if (currWinWidth !== winWidth || currWinHeight !== winHeight) { /*ie8 fix*/ if ($this.css("max-height") !== "none" && percentage) { mCustomScrollBox.css("max-height", $this.parent().height() * percentage / 100); } $this.mCustomScrollbar("update"); currWinWidth = winWidth; currWinHeight = winHeight; } } }, 150); }); } /*content resize fn (for dynamically generated content)*/ if (options.advanced.updateOnContentResize) { var mCSB_onContentResize; if (options.horizontalScroll) { var mCSB_containerOldSize = mCSB_container.outerWidth(); } else { var mCSB_containerOldSize = mCSB_container.outerHeight(); } mCSB_onContentResize = setInterval(function() { if (options.horizontalScroll) { if (options.advanced.autoExpandHorizontalScroll) { mCSB_container.css({ "position": "absolute", "width": "auto" }).wrap("
").css({ "width": mCSB_container.outerWidth(), "position": "relative" }).unwrap(); } var mCSB_containerNewSize = mCSB_container.outerWidth(); } else { var mCSB_containerNewSize = mCSB_container.outerHeight(); } if (mCSB_containerNewSize != mCSB_containerOldSize) { $this.mCustomScrollbar("update"); mCSB_containerOldSize = mCSB_containerNewSize; } }, 300); } }); }, update: function() { var $this = $(this), mCustomScrollBox = $this.children(".mCustomScrollBox"), mCSB_container = mCustomScrollBox.children(".mCSB_container"); mCSB_container.removeClass("mCS_no_scrollbar"); $this.removeClass("mCS_disabled mCS_destroyed"); mCustomScrollBox.scrollTop(0).scrollLeft(0); /*reset scrollTop/scrollLeft to prevent browser focus scrolling*/ var mCSB_scrollTools = mCustomScrollBox.children(".mCSB_scrollTools"), mCSB_draggerContainer = mCSB_scrollTools.children(".mCSB_draggerContainer"), mCSB_dragger = mCSB_draggerContainer.children(".mCSB_dragger"); if ($this.data("horizontalScroll")) { var mCSB_buttonLeft = mCSB_scrollTools.children(".mCSB_buttonLeft"), mCSB_buttonRight = mCSB_scrollTools.children(".mCSB_buttonRight"), mCustomScrollBoxW = mCustomScrollBox.width(); if ($this.data("autoExpandHorizontalScroll")) { mCSB_container.css({ "position": "absolute", "width": "auto" }).wrap("
").css({ "width": mCSB_container.outerWidth(), "position": "relative" }).unwrap(); } var mCSB_containerW = mCSB_container.outerWidth(); } else { var mCSB_buttonUp = mCSB_scrollTools.children(".mCSB_buttonUp"), mCSB_buttonDown = mCSB_scrollTools.children(".mCSB_buttonDown"), mCustomScrollBoxH = mCustomScrollBox.height(), mCSB_containerH = mCSB_container.outerHeight(); } if (mCSB_containerH > mCustomScrollBoxH && !$this.data("horizontalScroll")) { /*content needs vertical scrolling*/ mCSB_scrollTools.css("display", "block"); var mCSB_draggerContainerH = mCSB_draggerContainer.height(); /*auto adjust scrollbar dragger length analogous to content*/ if ($this.data("autoDraggerLength")) { var draggerH = Math.round(mCustomScrollBoxH / mCSB_containerH * mCSB_draggerContainerH), minDraggerH = mCSB_dragger.data("minDraggerHeight"); if (draggerH <= minDraggerH) { /*min dragger height*/ mCSB_dragger.css({ "height": minDraggerH }); } else if (draggerH >= mCSB_draggerContainerH - 10) { /*max dragger height*/ var mCSB_draggerContainerMaxH = mCSB_draggerContainerH - 10; mCSB_dragger.css({ "height": mCSB_draggerContainerMaxH }); } else { mCSB_dragger.css({ "height": draggerH }); } mCSB_dragger.children(".mCSB_dragger_bar").css({ "line-height": mCSB_dragger.height() + "px" }); } var mCSB_draggerH = mCSB_dragger.height(), /*calculate and store scroll amount, add scrolling*/ scrollAmount = (mCSB_containerH - mCustomScrollBoxH) / (mCSB_draggerContainerH - mCSB_draggerH); $this.data("scrollAmount", scrollAmount).mCustomScrollbar("scrolling", mCustomScrollBox, mCSB_container, mCSB_draggerContainer, mCSB_dragger, mCSB_buttonUp, mCSB_buttonDown, mCSB_buttonLeft, mCSB_buttonRight); /*scroll*/ var mCSB_containerP = Math.abs(mCSB_container.position().top); $this.mCustomScrollbar("scrollTo", mCSB_containerP, { scrollInertia: 0, trigger: "internal" }); } else if (mCSB_containerW > mCustomScrollBoxW && $this.data("horizontalScroll")) { /*content needs horizontal scrolling*/ mCSB_scrollTools.css("display", "block"); var mCSB_draggerContainerW = mCSB_draggerContainer.width(); /*auto adjust scrollbar dragger length analogous to content*/ if ($this.data("autoDraggerLength")) { var draggerW = Math.round(mCustomScrollBoxW / mCSB_containerW * mCSB_draggerContainerW), minDraggerW = mCSB_dragger.data("minDraggerWidth"); if (draggerW <= minDraggerW) { /*min dragger height*/ mCSB_dragger.css({ "width": minDraggerW }); } else if (draggerW >= mCSB_draggerContainerW - 10) { /*max dragger height*/ var mCSB_draggerContainerMaxW = mCSB_draggerContainerW - 10; mCSB_dragger.css({ "width": mCSB_draggerContainerMaxW }); } else { mCSB_dragger.css({ "width": draggerW }); } } var mCSB_draggerW = mCSB_dragger.width(), /*calculate and store scroll amount, add scrolling*/ scrollAmount = (mCSB_containerW - mCustomScrollBoxW) / (mCSB_draggerContainerW - mCSB_draggerW); $this.data("scrollAmount", scrollAmount).mCustomScrollbar("scrolling", mCustomScrollBox, mCSB_container, mCSB_draggerContainer, mCSB_dragger, mCSB_buttonUp, mCSB_buttonDown, mCSB_buttonLeft, mCSB_buttonRight); /*scroll*/ var mCSB_containerP = Math.abs(mCSB_container.position().left); $this.mCustomScrollbar("scrollTo", mCSB_containerP, { scrollInertia: 0, trigger: "internal" }); } else { /*content does not need scrolling*/ /*unbind events, reset content position, hide scrollbars, remove classes*/ mCustomScrollBox.unbind("mousewheel focusin"); if ($this.data("horizontalScroll")) { mCSB_dragger.add(mCSB_container).css("left", 0); } else { mCSB_dragger.add(mCSB_container).css("top", 0); } if ($this.data("alwaysShowScrollbar")) { if (!$this.data("horizontalScroll")) { /*vertical scrolling*/ mCSB_dragger.css({ "height": mCSB_draggerContainer.height() }); } else if ($this.data("horizontalScroll")) { /*horizontal scrolling*/ mCSB_dragger.css({ "width": mCSB_draggerContainer.width() }); } } else { mCSB_scrollTools.css("display", "none"); mCSB_container.addClass("mCS_no_scrollbar"); } $this.data({ "bindEvent_mousewheel": false, "bindEvent_focusin": false }); } }, scrolling: function(mCustomScrollBox, mCSB_container, mCSB_draggerContainer, mCSB_dragger, mCSB_buttonUp, mCSB_buttonDown, mCSB_buttonLeft, mCSB_buttonRight) { var $this = $(this); /*scrollbar drag scrolling*/ if (!$this.data("bindEvent_scrollbar_drag")) { var mCSB_draggerDragY, mCSB_draggerDragX, mCSB_dragger_downEvent, mCSB_dragger_moveEvent, mCSB_dragger_upEvent; if ($.support.pointer) { /*pointer*/ mCSB_dragger_downEvent = "pointerdown"; mCSB_dragger_moveEvent = "pointermove"; mCSB_dragger_upEvent = "pointerup"; } else if ($.support.msPointer) { /*MSPointer*/ mCSB_dragger_downEvent = "MSPointerDown"; mCSB_dragger_moveEvent = "MSPointerMove"; mCSB_dragger_upEvent = "MSPointerUp"; } if ($.support.pointer || $.support.msPointer) { /*pointer, MSPointer*/ mCSB_dragger.bind(mCSB_dragger_downEvent, function(e) { e.preventDefault(); $this.data({ "on_drag": true }); mCSB_dragger.addClass("mCSB_dragger_onDrag"); var elem = $(this), elemOffset = elem.offset(), x = e.originalEvent.pageX - elemOffset.left, y = e.originalEvent.pageY - elemOffset.top; if (x < elem.width() && x > 0 && y < elem.height() && y > 0) { mCSB_draggerDragY = y; mCSB_draggerDragX = x; } }); $(document).bind(mCSB_dragger_moveEvent + "." + $this.data("mCustomScrollbarIndex"), function(e) { e.preventDefault(); if ($this.data("on_drag")) { var elem = mCSB_dragger, elemOffset = elem.offset(), x = e.originalEvent.pageX - elemOffset.left, y = e.originalEvent.pageY - elemOffset.top; scrollbarDrag(mCSB_draggerDragY, mCSB_draggerDragX, y, x); } }).bind(mCSB_dragger_upEvent + "." + $this.data("mCustomScrollbarIndex"), function(e) { $this.data({ "on_drag": false }); mCSB_dragger.removeClass("mCSB_dragger_onDrag"); }); } else { /*mouse/touch*/ mCSB_dragger.bind("mousedown touchstart", function(e) { e.preventDefault(); e.stopImmediatePropagation(); var elem = $(this), elemOffset = elem.offset(), x, y; if (e.type === "touchstart") { var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; x = touch.pageX - elemOffset.left; y = touch.pageY - elemOffset.top; } else { $this.data({ "on_drag": true }); mCSB_dragger.addClass("mCSB_dragger_onDrag"); x = e.pageX - elemOffset.left; y = e.pageY - elemOffset.top; } if (x < elem.width() && x > 0 && y < elem.height() && y > 0) { mCSB_draggerDragY = y; mCSB_draggerDragX = x; } }).bind("touchmove", function(e) { e.preventDefault(); e.stopImmediatePropagation(); var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0], elem = $(this), elemOffset = elem.offset(), x = touch.pageX - elemOffset.left, y = touch.pageY - elemOffset.top; scrollbarDrag(mCSB_draggerDragY, mCSB_draggerDragX, y, x); }); $(document).bind("mousemove." + $this.data("mCustomScrollbarIndex"), function(e) { if ($this.data("on_drag")) { var elem = mCSB_dragger, elemOffset = elem.offset(), x = e.pageX - elemOffset.left, y = e.pageY - elemOffset.top; scrollbarDrag(mCSB_draggerDragY, mCSB_draggerDragX, y, x); } }).bind("mouseup." + $this.data("mCustomScrollbarIndex"), function(e) { $this.data({ "on_drag": false }); mCSB_dragger.removeClass("mCSB_dragger_onDrag"); }); } $this.data({ "bindEvent_scrollbar_drag": true }); } function scrollbarDrag(mCSB_draggerDragY, mCSB_draggerDragX, y, x) { if ($this.data("horizontalScroll")) { $this.mCustomScrollbar("scrollTo", (mCSB_dragger.position().left - (mCSB_draggerDragX)) + x, { moveDragger: true, trigger: "internal" }); } else { $this.mCustomScrollbar("scrollTo", (mCSB_dragger.position().top - (mCSB_draggerDragY)) + y, { moveDragger: true, trigger: "internal" }); } } /*content touch-drag*/ if ($.support.touch && $this.data("contentTouchScroll")) { if (!$this.data("bindEvent_content_touch")) { var touch, elem, elemOffset, y, x, mCSB_containerTouchY, mCSB_containerTouchX; mCSB_container.bind("touchstart", function(e) { e.stopImmediatePropagation(); touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; elem = $(this); elemOffset = elem.offset(); x = touch.pageX - elemOffset.left; y = touch.pageY - elemOffset.top; mCSB_containerTouchY = y; mCSB_containerTouchX = x; }); mCSB_container.bind("touchmove", function(e) { e.preventDefault(); e.stopImmediatePropagation(); touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; elem = $(this).parent(); elemOffset = elem.offset(); x = touch.pageX - elemOffset.left; y = touch.pageY - elemOffset.top; if ($this.data("horizontalScroll")) { $this.mCustomScrollbar("scrollTo", mCSB_containerTouchX - x, { trigger: "internal" }); } else { $this.mCustomScrollbar("scrollTo", mCSB_containerTouchY - y, { trigger: "internal" }); } }); } } /*dragger rail click scrolling*/ if (!$this.data("bindEvent_scrollbar_click")) { mCSB_draggerContainer.bind("click", function(e) { var scrollToPos = (e.pageY - mCSB_draggerContainer.offset().top) * $this.data("scrollAmount"), target = $(e.target); if ($this.data("horizontalScroll")) { scrollToPos = (e.pageX - mCSB_draggerContainer.offset().left) * $this.data("scrollAmount"); } if (target.hasClass("mCSB_draggerContainer") || target.hasClass("mCSB_draggerRail")) { $this.mCustomScrollbar("scrollTo", scrollToPos, { trigger: "internal", scrollEasing: "draggerRailEase" }); } }); $this.data({ "bindEvent_scrollbar_click": true }); } /*mousewheel scrolling*/ if ($this.data("mouseWheel")) { if (!$this.data("bindEvent_mousewheel")) { mCustomScrollBox.bind("mousewheel", function(e, delta) { var scrollTo, mouseWheelPixels = $this.data("mouseWheelPixels"), absPos = Math.abs(mCSB_container.position().top), draggerPos = mCSB_dragger.position().top, limit = mCSB_draggerContainer.height() - mCSB_dragger.height(); if ($this.data("normalizeMouseWheelDelta")) { if (delta < 0) { delta = -1; } else { delta = 1; } } if (mouseWheelPixels === "auto") { mouseWheelPixels = 100 + Math.round($this.data("scrollAmount") / 2); } if ($this.data("horizontalScroll")) { draggerPos = mCSB_dragger.position().left; limit = mCSB_draggerContainer.width() - mCSB_dragger.width(); absPos = Math.abs(mCSB_container.position().left); } if ((delta > 0 && draggerPos !== 0) || (delta < 0 && draggerPos !== limit)) { e.preventDefault(); e.stopImmediatePropagation(); } scrollTo = absPos - (delta * mouseWheelPixels); $this.mCustomScrollbar("scrollTo", scrollTo, { trigger: "internal" }); }); $this.data({ "bindEvent_mousewheel": true }); } } /*buttons scrolling*/ if ($this.data("scrollButtons_enable")) { if ($this.data("scrollButtons_scrollType") === "pixels") { /*scroll by pixels*/ if ($this.data("horizontalScroll")) { mCSB_buttonRight.add(mCSB_buttonLeft).unbind("mousedown touchstart MSPointerDown pointerdown mouseup MSPointerUp pointerup mouseout MSPointerOut pointerout touchend", mCSB_buttonRight_stop, mCSB_buttonLeft_stop); $this.data({ "bindEvent_buttonsContinuous_x": false }); if (!$this.data("bindEvent_buttonsPixels_x")) { /*scroll right*/ mCSB_buttonRight.bind("click", function(e) { e.preventDefault(); PixelsScrollTo(Math.abs(mCSB_container.position().left) + $this.data("scrollButtons_scrollAmount")); }); /*scroll left*/ mCSB_buttonLeft.bind("click", function(e) { e.preventDefault(); PixelsScrollTo(Math.abs(mCSB_container.position().left) - $this.data("scrollButtons_scrollAmount")); }); $this.data({ "bindEvent_buttonsPixels_x": true }); } } else { mCSB_buttonDown.add(mCSB_buttonUp).unbind("mousedown touchstart MSPointerDown pointerdown mouseup MSPointerUp pointerup mouseout MSPointerOut pointerout touchend", mCSB_buttonRight_stop, mCSB_buttonLeft_stop); $this.data({ "bindEvent_buttonsContinuous_y": false }); if (!$this.data("bindEvent_buttonsPixels_y")) { /*scroll down*/ mCSB_buttonDown.bind("click", function(e) { e.preventDefault(); PixelsScrollTo(Math.abs(mCSB_container.position().top) + $this.data("scrollButtons_scrollAmount")); }); /*scroll up*/ mCSB_buttonUp.bind("click", function(e) { e.preventDefault(); PixelsScrollTo(Math.abs(mCSB_container.position().top) - $this.data("scrollButtons_scrollAmount")); }); $this.data({ "bindEvent_buttonsPixels_y": true }); } } function PixelsScrollTo(to) { if (!mCSB_dragger.data("preventAction")) { mCSB_dragger.data("preventAction", true); $this.mCustomScrollbar("scrollTo", to, { trigger: "internal" }); } } } else { /*continuous scrolling*/ if ($this.data("horizontalScroll")) { mCSB_buttonRight.add(mCSB_buttonLeft).unbind("click"); $this.data({ "bindEvent_buttonsPixels_x": false }); if (!$this.data("bindEvent_buttonsContinuous_x")) { /*scroll right*/ mCSB_buttonRight.bind("mousedown touchstart MSPointerDown pointerdown", function(e) { e.preventDefault(); var scrollButtonsSpeed = ScrollButtonsSpeed(); $this.data({ "mCSB_buttonScrollRight": setInterval(function() { $this.mCustomScrollbar("scrollTo", Math.abs(mCSB_container.position().left) + scrollButtonsSpeed, { trigger: "internal", scrollEasing: "easeOutCirc" }); }, 17) }); }); var mCSB_buttonRight_stop = function(e) { e.preventDefault(); clearInterval($this.data("mCSB_buttonScrollRight")); } mCSB_buttonRight.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout", mCSB_buttonRight_stop); /*scroll left*/ mCSB_buttonLeft.bind("mousedown touchstart MSPointerDown pointerdown", function(e) { e.preventDefault(); var scrollButtonsSpeed = ScrollButtonsSpeed(); $this.data({ "mCSB_buttonScrollLeft": setInterval(function() { $this.mCustomScrollbar("scrollTo", Math.abs(mCSB_container.position().left) - scrollButtonsSpeed, { trigger: "internal", scrollEasing: "easeOutCirc" }); }, 17) }); }); var mCSB_buttonLeft_stop = function(e) { e.preventDefault(); clearInterval($this.data("mCSB_buttonScrollLeft")); } mCSB_buttonLeft.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout", mCSB_buttonLeft_stop); $this.data({ "bindEvent_buttonsContinuous_x": true }); } } else { mCSB_buttonDown.add(mCSB_buttonUp).unbind("click"); $this.data({ "bindEvent_buttonsPixels_y": false }); if (!$this.data("bindEvent_buttonsContinuous_y")) { /*scroll down*/ mCSB_buttonDown.bind("mousedown touchstart MSPointerDown pointerdown", function(e) { e.preventDefault(); var scrollButtonsSpeed = ScrollButtonsSpeed(); $this.data({ "mCSB_buttonScrollDown": setInterval(function() { $this.mCustomScrollbar("scrollTo", Math.abs(mCSB_container.position().top) + scrollButtonsSpeed, { trigger: "internal", scrollEasing: "easeOutCirc" }); }, 17) }); }); var mCSB_buttonDown_stop = function(e) { e.preventDefault(); clearInterval($this.data("mCSB_buttonScrollDown")); } mCSB_buttonDown.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout", mCSB_buttonDown_stop); /*scroll up*/ mCSB_buttonUp.bind("mousedown touchstart MSPointerDown pointerdown", function(e) { e.preventDefault(); var scrollButtonsSpeed = ScrollButtonsSpeed(); $this.data({ "mCSB_buttonScrollUp": setInterval(function() { $this.mCustomScrollbar("scrollTo", Math.abs(mCSB_container.position().top) - scrollButtonsSpeed, { trigger: "internal", scrollEasing: "easeOutCirc" }); }, 17) }); }); var mCSB_buttonUp_stop = function(e) { e.preventDefault(); clearInterval($this.data("mCSB_buttonScrollUp")); } mCSB_buttonUp.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout", mCSB_buttonUp_stop); $this.data({ "bindEvent_buttonsContinuous_y": true }); } } function ScrollButtonsSpeed() { var speed = $this.data("scrollButtons_scrollSpeed"); if ($this.data("scrollButtons_scrollSpeed") === "auto") { speed = Math.round(($this.data("scrollInertia") + 100) / 40); } return speed; } } } /*scrolling on element focus (e.g. via TAB key)*/ if ($this.data("autoScrollOnFocus")) { if (!$this.data("bindEvent_focusin")) { mCustomScrollBox.bind("focusin", function() { mCustomScrollBox.scrollTop(0).scrollLeft(0); var focusedElem = $(document.activeElement); if (focusedElem.is("input,textarea,select,button,a[tabindex],area,object")) { var mCSB_containerPos = mCSB_container.position().top, focusedElemPos = focusedElem.position().top, visibleLimit = mCustomScrollBox.height() - focusedElem.outerHeight(); if ($this.data("horizontalScroll")) { mCSB_containerPos = mCSB_container.position().left; focusedElemPos = focusedElem.position().left; visibleLimit = mCustomScrollBox.width() - focusedElem.outerWidth(); } if (mCSB_containerPos + focusedElemPos < 0 || mCSB_containerPos + focusedElemPos > visibleLimit) { $this.mCustomScrollbar("scrollTo", focusedElemPos, { trigger: "internal" }); } } }); $this.data({ "bindEvent_focusin": true }); } } /*auto-hide scrollbar*/ if ($this.data("autoHideScrollbar") && !$this.data("alwaysShowScrollbar")) { if (!$this.data("bindEvent_autoHideScrollbar")) { mCustomScrollBox.bind("mouseenter", function(e) { mCustomScrollBox.addClass("mCS-mouse-over"); functions.showScrollbar.call(mCustomScrollBox.children(".mCSB_scrollTools")); }).bind("mouseleave touchend", function(e) { mCustomScrollBox.removeClass("mCS-mouse-over"); if (e.type === "mouseleave") { functions.hideScrollbar.call(mCustomScrollBox.children(".mCSB_scrollTools")); } }); $this.data({ "bindEvent_autoHideScrollbar": true }); } } }, scrollTo: function(scrollTo, options) { var $this = $(this), defaults = { moveDragger: false, trigger: "external", callbacks: true, scrollInertia: $this.data("scrollInertia"), scrollEasing: $this.data("scrollEasing") }, options = $.extend(defaults, options), draggerScrollTo, mCustomScrollBox = $this.children(".mCustomScrollBox"), mCSB_container = mCustomScrollBox.children(".mCSB_container"), mCSB_scrollTools = mCustomScrollBox.children(".mCSB_scrollTools"), mCSB_draggerContainer = mCSB_scrollTools.children(".mCSB_draggerContainer"), mCSB_dragger = mCSB_draggerContainer.children(".mCSB_dragger"), contentSpeed = draggerSpeed = options.scrollInertia, scrollBeginning, scrollBeginningOffset, totalScroll, totalScrollOffset; if (!mCSB_container.hasClass("mCS_no_scrollbar")) { $this.data({ "mCS_trigger": options.trigger }); if ($this.data("mCS_Init")) { options.callbacks = false; } if (scrollTo || scrollTo === 0) { if (typeof(scrollTo) === "number") { /*if integer, scroll by number of pixels*/ if (options.moveDragger) { /*scroll dragger*/ draggerScrollTo = scrollTo; if ($this.data("horizontalScroll")) { scrollTo = mCSB_dragger.position().left * $this.data("scrollAmount"); } else { scrollTo = mCSB_dragger.position().top * $this.data("scrollAmount"); } draggerSpeed = 0; } else { /*scroll content by default*/ draggerScrollTo = scrollTo / $this.data("scrollAmount"); } } else if (typeof(scrollTo) === "string") { /*if string, scroll by element position*/ var target; if (scrollTo === "top") { /*scroll to top*/ target = 0; } else if (scrollTo === "bottom" && !$this.data("horizontalScroll")) { /*scroll to bottom*/ target = mCSB_container.outerHeight() - mCustomScrollBox.height(); } else if (scrollTo === "left") { /*scroll to left*/ target = 0; } else if (scrollTo === "right" && $this.data("horizontalScroll")) { /*scroll to right*/ target = mCSB_container.outerWidth() - mCustomScrollBox.width(); } else if (scrollTo === "first") { /*scroll to first element position*/ target = $this.find(".mCSB_container").find(":first"); } else if (scrollTo === "last") { /*scroll to last element position*/ target = $this.find(".mCSB_container").find(":last"); } else { /*scroll to element position*/ target = $this.find(scrollTo); } if (target.length === 1) { /*if such unique element exists, scroll to it*/ if ($this.data("horizontalScroll")) { scrollTo = target.position().left; } else { scrollTo = target.position().top; } draggerScrollTo = scrollTo / $this.data("scrollAmount"); } else { draggerScrollTo = scrollTo = target; } } /*scroll to*/ if ($this.data("horizontalScroll")) { if ($this.data("onTotalScrollBack_Offset")) { /*scroll beginning offset*/ scrollBeginningOffset = -$this.data("onTotalScrollBack_Offset"); } if ($this.data("onTotalScroll_Offset")) { /*total scroll offset*/ totalScrollOffset = mCustomScrollBox.width() - mCSB_container.outerWidth() + $this.data("onTotalScroll_Offset"); } if (draggerScrollTo < 0) { /*scroll start position*/ draggerScrollTo = scrollTo = 0; clearInterval($this.data("mCSB_buttonScrollLeft")); if (!scrollBeginningOffset) { scrollBeginning = true; } } else if (draggerScrollTo >= mCSB_draggerContainer.width() - mCSB_dragger.width()) { /*scroll end position*/ draggerScrollTo = mCSB_draggerContainer.width() - mCSB_dragger.width(); scrollTo = mCustomScrollBox.width() - mCSB_container.outerWidth(); clearInterval($this.data("mCSB_buttonScrollRight")); if (!totalScrollOffset) { totalScroll = true; } } else { scrollTo = -scrollTo; } var snapAmount = $this.data("snapAmount"); if (snapAmount) { scrollTo = Math.round(scrollTo / snapAmount) * snapAmount - $this.data("snapOffset"); } /*scrolling animation*/ functions.mTweenAxis.call(this, mCSB_dragger[0], "left", Math.round(draggerScrollTo), draggerSpeed, options.scrollEasing); functions.mTweenAxis.call(this, mCSB_container[0], "left", Math.round(scrollTo), contentSpeed, options.scrollEasing, { onStart: function() { if (options.callbacks && !$this.data("mCS_tweenRunning")) { callbacks("onScrollStart"); } if ($this.data("autoHideScrollbar") && !$this.data("alwaysShowScrollbar")) { functions.showScrollbar.call(mCSB_scrollTools); } }, onUpdate: function() { if (options.callbacks) { callbacks("whileScrolling"); } }, onComplete: function() { if (options.callbacks) { callbacks("onScroll"); if (scrollBeginning || (scrollBeginningOffset && mCSB_container.position().left >= scrollBeginningOffset)) { callbacks("onTotalScrollBack"); } if (totalScroll || (totalScrollOffset && mCSB_container.position().left <= totalScrollOffset)) { callbacks("onTotalScroll"); } } mCSB_dragger.data("preventAction", false); $this.data("mCS_tweenRunning", false); if ($this.data("autoHideScrollbar") && !$this.data("alwaysShowScrollbar")) { if (!mCustomScrollBox.hasClass("mCS-mouse-over")) { functions.hideScrollbar.call(mCSB_scrollTools); } } } }); } else { if ($this.data("onTotalScrollBack_Offset")) { /*scroll beginning offset*/ scrollBeginningOffset = -$this.data("onTotalScrollBack_Offset"); } if ($this.data("onTotalScroll_Offset")) { /*total scroll offset*/ totalScrollOffset = mCustomScrollBox.height() - mCSB_container.outerHeight() + $this.data("onTotalScroll_Offset"); } if (draggerScrollTo < 0) { /*scroll start position*/ draggerScrollTo = scrollTo = 0; clearInterval($this.data("mCSB_buttonScrollUp")); if (!scrollBeginningOffset) { scrollBeginning = true; } } else if (draggerScrollTo >= mCSB_draggerContainer.height() - mCSB_dragger.height()) { /*scroll end position*/ draggerScrollTo = mCSB_draggerContainer.height() - mCSB_dragger.height(); scrollTo = mCustomScrollBox.height() - mCSB_container.outerHeight(); clearInterval($this.data("mCSB_buttonScrollDown")); if (!totalScrollOffset) { totalScroll = true; } } else { scrollTo = -scrollTo; } var snapAmount = $this.data("snapAmount"); if (snapAmount) { scrollTo = Math.round(scrollTo / snapAmount) * snapAmount - $this.data("snapOffset"); } /*scrolling animation*/ functions.mTweenAxis.call(this, mCSB_dragger[0], "top", Math.round(draggerScrollTo), draggerSpeed, options.scrollEasing); functions.mTweenAxis.call(this, mCSB_container[0], "top", Math.round(scrollTo), contentSpeed, options.scrollEasing, { onStart: function() { if (options.callbacks && !$this.data("mCS_tweenRunning")) { callbacks("onScrollStart"); } if ($this.data("autoHideScrollbar") && !$this.data("alwaysShowScrollbar")) { functions.showScrollbar.call(mCSB_scrollTools); } }, onUpdate: function() { if (options.callbacks) { callbacks("whileScrolling"); } }, onComplete: function() { if (options.callbacks) { callbacks("onScroll"); if (scrollBeginning || (scrollBeginningOffset && mCSB_container.position().top >= scrollBeginningOffset)) { callbacks("onTotalScrollBack"); } if (totalScroll || (totalScrollOffset && mCSB_container.position().top <= totalScrollOffset)) { callbacks("onTotalScroll"); } } mCSB_dragger.data("preventAction", false); $this.data("mCS_tweenRunning", false); if ($this.data("autoHideScrollbar") && !$this.data("alwaysShowScrollbar")) { if (!mCustomScrollBox.hasClass("mCS-mouse-over")) { functions.hideScrollbar.call(mCSB_scrollTools); } } } }); } if ($this.data("mCS_Init")) { $this.data({ "mCS_Init": false }); } } } /*callbacks*/ function callbacks(cb) { if ($this.data("mCustomScrollbarIndex")) { this.mcs = { top: mCSB_container.position().top, left: mCSB_container.position().left, draggerTop: mCSB_dragger.position().top, draggerLeft: mCSB_dragger.position().left, topPct: Math.round((100 * Math.abs(mCSB_container.position().top)) / Math.abs(mCSB_container.outerHeight() - mCustomScrollBox.height())), leftPct: Math.round((100 * Math.abs(mCSB_container.position().left)) / Math.abs(mCSB_container.outerWidth() - mCustomScrollBox.width())) }; switch (cb) { /*start scrolling callback*/ case "onScrollStart": $this.data("mCS_tweenRunning", true).data("onScrollStart_Callback").call($this, this.mcs); break; case "whileScrolling": $this.data("whileScrolling_Callback").call($this, this.mcs); break; case "onScroll": $this.data("onScroll_Callback").call($this, this.mcs); break; case "onTotalScrollBack": $this.data("onTotalScrollBack_Callback").call($this, this.mcs); break; case "onTotalScroll": $this.data("onTotalScroll_Callback").call($this, this.mcs); break; } } } }, stop: function() { var $this = $(this), mCSB_container = $this.children().children(".mCSB_container"), mCSB_dragger = $this.children().children().children().children(".mCSB_dragger"); functions.mTweenAxisStop.call(this, mCSB_container[0]); functions.mTweenAxisStop.call(this, mCSB_dragger[0]); }, disable: function(resetScroll) { var $this = $(this), mCustomScrollBox = $this.children(".mCustomScrollBox"), mCSB_container = mCustomScrollBox.children(".mCSB_container"), mCSB_scrollTools = mCustomScrollBox.children(".mCSB_scrollTools"), mCSB_dragger = mCSB_scrollTools.children().children(".mCSB_dragger"); mCustomScrollBox.unbind("mousewheel focusin mouseenter mouseleave touchend"); mCSB_container.unbind("touchstart touchmove") if (resetScroll) { if ($this.data("horizontalScroll")) { mCSB_dragger.add(mCSB_container).css("left", 0); } else { mCSB_dragger.add(mCSB_container).css("top", 0); } } mCSB_scrollTools.css("display", "none"); mCSB_container.addClass("mCS_no_scrollbar"); $this.data({ "bindEvent_mousewheel": false, "bindEvent_focusin": false, "bindEvent_content_touch": false, "bindEvent_autoHideScrollbar": false }).addClass("mCS_disabled"); }, destroy: function() { var $this = $(this); $this.removeClass("mCustomScrollbar _mCS_" + $this.data("mCustomScrollbarIndex")).addClass("mCS_destroyed").children().children(".mCSB_container").unwrap().children().unwrap().siblings(".mCSB_scrollTools").remove(); $(document).unbind("mousemove." + $this.data("mCustomScrollbarIndex") + " mouseup." + $this.data("mCustomScrollbarIndex") + " MSPointerMove." + $this.data("mCustomScrollbarIndex") + " MSPointerUp." + $this.data("mCustomScrollbarIndex")); $(window).unbind("resize." + $this.data("mCustomScrollbarIndex")); } }, functions = { /*hide/show scrollbar*/ showScrollbar: function() { this.stop().animate({ opacity: 1 }, "fast"); }, hideScrollbar: function() { this.stop().animate({ opacity: 0 }, "fast"); }, /*js animation tween*/ mTweenAxis: function(el, prop, to, duration, easing, callbacks) { var callbacks = callbacks || {}, onStart = callbacks.onStart || function() {}, onUpdate = callbacks.onUpdate || function() {}, onComplete = callbacks.onComplete || function() {}; var startTime = _getTime(), _delay, progress = 0, from = el.offsetTop, elStyle = el.style; if (prop === "left") { from = el.offsetLeft; } var diff = to - from; _cancelTween(); _startTween(); function _getTime() { if (window.performance && window.performance.now) { return window.performance.now(); } else { if (window.performance && window.performance.webkitNow) { return window.performance.webkitNow(); } else { if (Date.now) { return Date.now(); } else { return new Date().getTime(); } } } } function _step() { if (!progress) { onStart.call(); } progress = _getTime() - startTime; _tween(); if (progress >= el._time) { el._time = (progress > el._time) ? progress + _delay - (progress - el._time) : progress + _delay - 1; if (el._time < progress + 1) { el._time = progress + 1; } } if (el._time < duration) { el._id = _request(_step); } else { onComplete.call(); } } function _tween() { if (duration > 0) { el.currVal = _ease(el._time, from, diff, duration, easing); elStyle[prop] = Math.round(el.currVal) + "px"; } else { elStyle[prop] = to + "px"; } onUpdate.call(); } function _startTween() { _delay = 1000 / 60; el._time = progress + _delay; _request = (!window.requestAnimationFrame) ? function(f) { _tween(); return setTimeout(f, 0.01); } : window.requestAnimationFrame; el._id = _request(_step); } function _cancelTween() { if (el._id == null) { return; } if (!window.requestAnimationFrame) { clearTimeout(el._id); } else { window.cancelAnimationFrame(el._id); } el._id = null; } function _ease(t, b, c, d, type) { switch (type) { case "linear": return c * t / d + b; break; case "easeOutQuad": t /= d; return -c * t * (t - 2) + b; break; case "easeInOutQuad": t /= d / 2; if (t < 1) return c / 2 * t * t + b; t--; return -c / 2 * (t * (t - 2) - 1) + b; break; case "easeOutCubic": t /= d; t--; return c * (t * t * t + 1) + b; break; case "easeOutQuart": t /= d; t--; return -c * (t * t * t * t - 1) + b; break; case "easeOutQuint": t /= d; t--; return c * (t * t * t * t * t + 1) + b; break; case "easeOutCirc": t /= d; t--; return c * Math.sqrt(1 - t * t) + b; break; case "easeOutSine": return c * Math.sin(t / d * (Math.PI / 2)) + b; break; case "easeOutExpo": return c * (-Math.pow(2, -10 * t / d) + 1) + b; break; case "mcsEaseOut": var ts = (t /= d) * t, tc = ts * t; return b + c * (0.499999999999997 * tc * ts + -2.5 * ts * ts + 5.5 * tc + -6.5 * ts + 4 * t); break; case "draggerRailEase": t /= d / 2; if (t < 1) return c / 2 * t * t * t + b; t -= 2; return c / 2 * (t * t * t + 2) + b; break; } } }, /*stop js animation tweens*/ mTweenAxisStop: function(el) { if (el._id == null) { return; } if (!window.requestAnimationFrame) { clearTimeout(el._id); } else { window.cancelAnimationFrame(el._id); } el._id = null; }, /*detect requestAnimationFrame and polyfill*/ rafPolyfill: function() { var pfx = ["ms", "moz", "webkit", "o"], i = pfx.length; while (--i > -1 && !window.requestAnimationFrame) { window.requestAnimationFrame = window[pfx[i] + "RequestAnimationFrame"]; window.cancelAnimationFrame = window[pfx[i] + "CancelAnimationFrame"] || window[pfx[i] + "CancelRequestAnimationFrame"]; } } } /*detect features*/ functions.rafPolyfill.call(); /*requestAnimationFrame*/ $.support.touch = !!('ontouchstart' in window); /*touch*/ $.support.pointer = window.navigator.pointerEnabled; /*pointer support*/ $.support.msPointer = window.navigator.msPointerEnabled; /*MSPointer support*/ /*plugin dependencies*/ var _dlp = ("https:" == document.location.protocol) ? "https:" : "http:"; $.event.special.mousewheel || document.write('