/*! 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('