JAVASCRIPT   42

alert.js

Guest on 28th July 2021 06:47:03 PM

  1. /*!****************************
  2.  *                            *
  3.  *  Smart Alert 1.2           *
  4.  *                            *
  5.  *  Code: Lukas Prvy          *
  6.  *  Design: Pierre Borodin    *
  7.  *                            *
  8.  ******************************
  9.  
  10.  
  11. Usage:
  12.  
  13.     $.alert.open([type], [title], content, [buttons], [callback]);
  14.  
  15.     or
  16.  
  17.     $.alert.open({settings});
  18.  
  19. Settings:
  20.  
  21.     container Container for alert placement (optional, 'body')
  22.     type      Alert type('info', 'confirm', 'warning', 'error', 'prompt') (optional, 'info')
  23.     title     Alert title (optional, default title for certain alert type)
  24.     cancel    Show close icon(alert can be then closed also with ESC) (optional, true)
  25.     icon      Set one of icons defined in theme stylesheet or hide icon by setting false (optional, 'info')
  26.     content   Alert content (optional)
  27.     align     Content alignment('left', 'center', 'right') (optional, 'left')
  28.     buttons   Object with buttons {id: 'label', ...} (optional, default buttons for certain alert type or {ok: 'Ok'})
  29.     width     Alert width (optional, 'auto')
  30.     maxHeight Content maximum height (optional, 160)
  31.     draggable Drag&drop(requires jQuery-UI)
  32.     callback  Function that will be called after button press. Parameter value will be pressed
  33.               button id or false in case of closing alert by click on close icon. (optional)
  34.     pie       Determines whether to use PIE.htc directly or use its PHP wrapper('htc', 'php') (optional, 'htc')
  35.  
  36.  
  37. Setup:
  38.  
  39.     $.alert.setup({settings});
  40.  
  41. Settings:
  42.  
  43.     defaults           Default alert settings
  44.     defaults.container Default container for alert placement
  45.     defaults.type      Default alert type('info', 'confirm', 'warning', 'error', 'prompt')
  46.     defaults.cancel    Default cancelable setting
  47.     defaults.icon      Default icon setting(icon name or false)
  48.     defaults.content   Default alert content
  49.     defaults.align     Default content alignment('left', 'center', 'right')
  50.     defaults.buttons   Default object with buttons {id: 'label', ...}
  51.     defaults.width     Default alert width
  52.     defaults.maxHeight Default content maximum height
  53.     defaults.draggable Default drag&drop setting
  54.     defaults.callback  Default callback
  55.     defaults.pie       Use PIE.htc directly or use its PHP wrapper('htc', 'php') default setting
  56.     types              Alert types {'typename': {settings}, ...} (optional)
  57.  
  58. Changelog:
  59.  
  60.     Version 1.2
  61.  
  62.     - Maximum height setting
  63.     - Scrollbar
  64.  
  65.     Version 1.1
  66.  
  67.     - Compatible with jQuery 1.9+
  68.     - New alert type "prompt"
  69.     - Button cycling
  70.  
  71. */
  72.  
  73. /**
  74.  * @fileoverview Smart Alert
  75.  * @version      1.2
  76.  * @author       Lukas Prvy
  77.  * @requires     jQuery
  78.  * @requires     jQuery-UI draggable module
  79.  * @see          http://www.codeblog.cz/alert/doc
  80.  */
  81.  
  82. /**
  83.  * @namespace jQuery library
  84.  * @name      jQuery
  85.  */
  86.  
  87. (function($) {
  88.  
  89.     /** @namespace Setup */
  90.     var setup = {
  91.  
  92.         /** Default settings */
  93.         defaults: {
  94.             container: 'body',
  95.             type: 'info',
  96.             title: ' ',
  97.             cancel: true,
  98.             icon: 'info',
  99.             content: ' ',
  100.             align: 'left',
  101.             buttons: {ok: 'Ok'},
  102.             active: null,
  103.             width: 'auto',
  104.             maxHeight: 160,
  105.             draggable: true,
  106.             callback: $.noop,
  107.             pie: 'htc'
  108.         },
  109.  
  110.         /** Alert types */
  111.         types: {
  112.             info: {
  113.                 title: 'Info',
  114.                 icon: 'info',
  115.                 buttons: {ok: 'Ok'}
  116.             },
  117.             confirm: {
  118.                 title: 'Confirm',
  119.                 icon: 'confirm',
  120.                 buttons: {
  121.                     yes: 'Yes',
  122.                     no: 'No'
  123.                 }
  124.             },
  125.             warning: {
  126.                 title: 'Warning',
  127.                 icon: 'warning',
  128.                 buttons: {ok: 'Ok'}
  129.             },
  130.             error: {
  131.                 title: 'Error',
  132.                 icon: 'error',
  133.                 buttons: {ok: 'Ok'}
  134.             },
  135.             prompt: {
  136.                 title: 'Prompt',
  137.                 icon: 'prompt',
  138.                 buttons: {
  139.                     ok: 'Ok',
  140.                     cancel: 'Cancel'
  141.                 }
  142.             }
  143.         }
  144.     };
  145.  
  146.     /** @namespace Alert settings */
  147.     var settings = {};
  148.  
  149.     /** Is alert open? */
  150.     var open = false;
  151.  
  152.     /** Alert container */
  153.     var $container = $([]);
  154.  
  155.     /** Alert box */
  156.     var $box = $([]);
  157.  
  158.     /** Images preload */
  159.     function preload() {
  160.  
  161.         // List of images to preload
  162.         var images = [
  163.             'close.png',
  164.             'info.png',
  165.             'confirm.png',
  166.             'warning.png',
  167.             'error.png'
  168.         ];
  169.  
  170.         // Normal/retina display
  171.         var retina = window.devicePixelRatio && devicePixelRatio == 2;
  172.         images = $.map(images, function(image) {
  173.             return (retina ? 'x2' : 'img') + '/' + image;
  174.         });
  175.  
  176.         // Try to detect theme path. When not successfull exit function
  177.         var $theme = $('link[href*="alert/themes/"]');
  178.         if (!$theme.length)
  179.             return;
  180.         var path = $theme.attr('href');
  181.         path = path.substr(0, path.lastIndexOf('/') + 1);
  182.  
  183.         // Preload
  184.         $.each(images, function(id, image) {
  185.             var $image = $('<img />').attr('src', path + image);
  186.         });
  187.     }
  188.  
  189.     /**
  190.      * Merge settings as follows: (global defaults <= alert type settings) <= passed options
  191.      *
  192.      * @param   {Object} options Alert settings
  193.      *
  194.      * @returns {Object}         Defaults extended by passed settings
  195.      */
  196.     function options() {
  197.         var options = {};
  198.         if (arguments.length) {
  199.  
  200.             // Object with settings
  201.             if ($.isPlainObject(arguments[0]))
  202.                 options = arguments[0];
  203.  
  204.             // Shortcut call ([type], [title], content, [buttons], [callback])
  205.             else {
  206.                 var args = Array.prototype.slice.call(arguments);
  207.                 if ($.isFunction(args[args.length - 1]))
  208.                     options.callback = args.pop();
  209.                 if ($.isPlainObject(args[args.length - 1]))
  210.                     options.buttons = args.pop();
  211.                 if (args.length == 3) {
  212.                     options.type = args[0];
  213.                     options.title = args[1];
  214.                     options.content = args[2];
  215.                 }
  216.                 else if (args.length == 2) {
  217.                     if (setup.types[args[0]])
  218.                         options.type = args[0];
  219.                     else
  220.                         options.title = args[0];
  221.                     options.content = args[1];
  222.                 }
  223.                 else
  224.                     options.content = args[0];
  225.             }
  226.         }
  227.  
  228.         // Alert type
  229.         if (!setup.types[options.type])
  230.             options.type = setup.defaults.type;
  231.  
  232.         // Merge settings
  233.         options = $.extend({}, setup.defaults, setup.types[options.type], options);
  234.  
  235.         // Active button
  236.         if (!options.active || !options.buttons[options.active])
  237.             for (var id in options.buttons) {
  238.                 options.active = id;
  239.                 break;
  240.             }
  241.  
  242.         // Drag&drop
  243.         if (typeof $.fn.draggable == 'undefined')
  244.             options.draggable = false;
  245.  
  246.         // Title
  247.         options.title = $.trim(options.title) || setup.types[options.type].title;
  248.  
  249.         // Prompt
  250.         if (options.type == 'prompt')
  251.             options.content += [
  252.                 '<input',
  253.                 '    id="smartAlertPrompt"',
  254.                 options.content
  255.                 ? '    class="smartAlertMargin"'
  256.                 : '',
  257.                 '    type="text"',
  258.                 '/>'
  259.             ].join('');
  260.  
  261.         return options;
  262.     }
  263.  
  264.     /** Render alert */
  265.     function render() {
  266.  
  267.         // Prepare buttons
  268.         var buttons = [];
  269.         $.each(settings.buttons, function(id, text) {
  270.             var active = id == settings.active ? ' smartAlertActive' : '';
  271.             buttons.push([
  272.                 '<div',
  273.                 '    class="smartAlertButton' + active + '"',
  274.                 '    data-id="' + id + '"',
  275.                 '>',
  276.                 text,
  277.                 '</div>'
  278.             ].join(''));
  279.         });
  280.  
  281.         // Render
  282.         var version = parseInt($.browser.version);
  283.         $([
  284.  
  285.             // Overlay
  286.             '<div',
  287.             '    id="smartAlert"',
  288.  
  289.             // Settings
  290.             '    data-type="' + settings.type + '"',
  291.             '    data-cancel="' + settings.cancel + '"',
  292.             '    data-icon="' + settings.icon + '"',
  293.             '    data-align="' + settings.align + '"',
  294.             '    data-draggable="' + settings.draggable + '"',
  295.             '    data-pie="' + settings.pie + '"',
  296.  
  297.             // Browser sniffing
  298.             $.browser.chrome ? 'data-chrome="' + version + '"' : '',
  299.             $.browser.webkit ? 'data-webkit="' + version + '"' : '',
  300.             $.browser.mozilla ? 'data-mozilla="' + version + '"' : '',
  301.             $.browser.opera ? 'data-opera="' + version + '"' : '',
  302.             $.browser.msie ? 'data-ie="' + version + '"' : '',
  303.             '>',
  304.  
  305.             // Box
  306.             '    <div id="smartAlertBox">',
  307.  
  308.             // Header
  309.             '        <div id="smartAlertHeader">',
  310.             '            <div id="smartAlertTitle">',
  311.             settings.title,
  312.             '            </div>',
  313.             '            <div id="smartAlertClose"></div>',
  314.             '        </div>',
  315.  
  316.             // Body
  317.             $.browser.msie && version == 7
  318.             ? [
  319.                 '        <table id="smartAlertBody">',
  320.                 '            <tbody>',
  321.                 '                <tr>',
  322.                 '                    <td id="smartAlertIcon"></td>',
  323.                 '                    <td>',
  324.                 '                        <div id="smartAlertContent">',
  325.                 '                            <div id="smartAlertScroll">',
  326.                 settings.content,
  327.                 '                            </div>',
  328.                 '                        </div>',
  329.                 '                    </td>',
  330.                 '                </tr>',
  331.                 '            </tbody>',
  332.                 '        </table>'
  333.             ].join('')
  334.             : [
  335.                 '        <div id="smartAlertBody">',
  336.                 '            <div id="smartAlertIcon"></div>',
  337.                 '            <div id="smartAlertContent">',
  338.                 '                <div id="smartAlertScroll">',
  339.                 settings.content,
  340.                 '                </div>',
  341.                 '            </div>',
  342.                 '        </div>'
  343.             ].join(''),
  344.  
  345.             // Buttons
  346.             '        <div id="smartAlertButtons">',
  347.             buttons.join(''),
  348.             '        </div>',
  349.             '    </div>',
  350.             '</div>'
  351.         ].join('')).appendTo(settings.container);
  352.  
  353.         // Select DOM objects for later use
  354.         $container = $('#smartAlert');
  355.         $box = $('#smartAlertBox');
  356.  
  357.         // Set box width
  358.         $box.width(settings.width);
  359.     }
  360.  
  361.     /** Center alert */
  362.     function center() {
  363.         $box.css({
  364.             top: Math.round(
  365.                 $container.height() / 2 -
  366.                 $box.outerHeight() / 2 -
  367.                 parseInt($box.css('margin-top'))
  368.             ),
  369.             left: Math.round(
  370.                 $container.width() / 2 -
  371.                 $box.outerWidth() / 2 -
  372.                 parseInt($box.css('margin-left'))
  373.             )
  374.         });
  375.     }
  376.  
  377.     /**
  378.      * Cycle active button
  379.      *
  380.      * @param {Number} shift Direction
  381.      */
  382.     function cycle(shift) {
  383.         var $buttons = $('.smartAlertButton', $container);
  384.         if ($buttons.length <= 1)
  385.             return true;
  386.         var $active = $buttons.filter('.smartAlertActive');
  387.         var last = $buttons.length - 1;
  388.         var next = $active.index() + shift;
  389.         $buttons
  390.             .removeClass('smartAlertActive')
  391.             .eq(next > last ? 0 : (next < 0 ? last : next))
  392.             .addClass('smartAlertActive');
  393.         return false;
  394.     }
  395.  
  396.     /**
  397.      * Close alert
  398.      *
  399.      * @param {String|Function} [button=false] Button used to close alert or callback that will
  400.      *                                         be executed after closing in place of settings.callback
  401.      *
  402.      */
  403.     function close(button, value) {
  404.         if (!open)
  405.             return;
  406.         $container
  407.             .stop(true, true)
  408.             .fadeOut(250, function() {
  409.                 $container.remove();
  410.                 open = false;
  411.                 if ($.isFunction(button))
  412.                     button();
  413.                 else
  414.                     settings.callback(button || false, value || '');
  415.             });
  416.     }
  417.  
  418.     /**
  419.      * PIE reset
  420.      *
  421.      * @see http://css3pie.com
  422.      */
  423.     function resetPie() {
  424.         if (!($.browser.msie && $.browser.version <= 9))
  425.             return;
  426.  
  427.         // Detect path
  428.         var $styles = $('link[href*="alert/css/"]');
  429.         var path = $styles.attr('href');
  430.         path = path.substr(0, path.lastIndexOf('/') + 1);
  431.  
  432.         // Reset
  433.         $('*', $container).each(function() {
  434.             var $element = $(this);
  435.             if ($element.css('behavior') != 'none') {
  436.                 if ($.browser.version < 9)
  437.                     $element.css('behavior', 'none');
  438.                 $element.css('behavior', 'url(' + path + 'PIE.' + settings.pie + ')');
  439.             }
  440.         });
  441.     }
  442.  
  443.     /** Initialization */
  444.     function init() {
  445.  
  446.         // Preload images
  447.         preload();
  448.  
  449.         // Set event handlers
  450.         $(document)
  451.  
  452.             // Keyboard
  453.             .on({
  454.                 keydown: function(event) {
  455.                     if (open) {
  456.                         switch (event.which) {
  457.  
  458.                             // Close alert with ESC
  459.                             case 27:
  460.                                 if (settings.cancel)
  461.                                     close();
  462.                                 break;
  463.  
  464.                             // Cycle buttons
  465.                             case 9:
  466.                                 return cycle(1);
  467.                                 break;
  468.  
  469.                             // Press button
  470.                             case 13:
  471.                                 $('.smartAlertActive', $container).addClass('smartAlertClick');
  472.                                 break;
  473.                             default:
  474.                                 return true;
  475.                         }
  476.                         return false;
  477.                     }
  478.                 },
  479.                 keyup: function(event) {
  480.  
  481.                     // Click button
  482.                     if (open && event.which == 13) {
  483.                         $('.smartAlertActive', $container)
  484.                             .removeClass('smartAlertClick')
  485.                             .trigger('click');
  486.                         return false;
  487.                     }
  488.                 }
  489.             })
  490.  
  491.             // Close alert after click on close
  492.             .on('click', '#smartAlertClose', function() {
  493.                 close();
  494.             })
  495.  
  496.             // Handle button click
  497.             .on({
  498.                 mousedown: function() {
  499.                     $(this).addClass('smartAlertClick');
  500.                 },
  501.                 'mouseup mouseleave': function() {
  502.                     $(this).removeClass('smartAlertClick');
  503.                 },
  504.                 click: function() {
  505.                     var id = $(this).data('id');
  506.                     var value = settings.type == 'prompt' ? $('#smartAlertPrompt').val() : '';
  507.                     close(id, value);
  508.                 }
  509.             }, '.smartAlertButton')
  510.  
  511.         // Center box on window resize
  512.         $(window).on('resize', function() {
  513.             if (open && $(settings.container).is('body'))
  514.                 center();
  515.         });
  516.     }
  517.  
  518.     /**
  519.      * @namespace jQuery Alert 1.0
  520.      * @memberOf  jQuery
  521.      */
  522.     jQuery.alert = {
  523.  
  524.         /**
  525.          * Open alert
  526.          *
  527.          * @param {Object|String}  options                           Alert settings or content
  528.          * @param {String|Object}  [options.container='body']        Container for alert placement
  529.          * @param {String}         [options.type='info']             Alert type('info', 'confirm', 'warning', 'error', 'prompt')
  530.          * @param {String}         [options.title=default title]     Alert title
  531.          * @param {Boolean}        [options.cancel=true]             Show close icon(alert can be then closed also with ESC)
  532.          * @param {String|Boolean} [options.icon='info']             Alert icon(one of icons defined in theme stylesheet or false)
  533.          * @param {String}         [options.content]                 Alert content
  534.          * @param {String}         [options.align='left']            Content alignment('left', 'center', 'right')
  535.          * @param {Object}         [options.buttons=default buttons] Object with buttons {id: 'label', ...}
  536.          * @param {Number}         [options.width='auto']            Alert width
  537.          * @param {Number}         [options.maxHeight=160]           Content maximum height
  538.          * @param {Boolean}        [options.draggable=true]          Drag&drop
  539.          * @param {Function}       [options.callback]                Callback
  540.          * @param {String}         [options.pie='php']               Use PIE.htc directly or use its PHP wrapper('htc', 'php')
  541.          */
  542.         open: function() {
  543.             var args = arguments;
  544.             function show() {
  545.  
  546.                 // Get settings
  547.                 settings = options.apply(null, args);
  548.  
  549.                 // Render alert
  550.                 render();
  551.  
  552.                 // Set drag&drop
  553.                 if (settings.draggable)
  554.                     $box.draggable({
  555.                         containment: '#smartAlert',
  556.                         handle: '#smartAlertHeader'
  557.                     });
  558.  
  559.                 // Initialize scrollbar
  560.                 $container
  561.                     .css('visibility', 'visible')
  562.                     .find('#smartAlertScroll')
  563.                     .css('max-height', settings.maxHeight)
  564.                     .mCustomScrollbar()
  565.                     .find('.mCSB_container')
  566.                     .attr('id', 'smartAlertScrollArea')
  567.                     .end()
  568.                     .find('.mCSB_draggerRail')
  569.                     .attr('id', 'smartAlertScrollBar')
  570.                     .end()
  571.                     .find('.mCSB_dragger_bar')
  572.                     .attr('id', 'smartAlertScrollDrag');
  573.                 center();
  574.  
  575.                 // Show alert
  576.                 $container
  577.                     .hide()
  578.                     .fadeIn(250, function() {
  579.                         if (settings.type == 'prompt')
  580.                             $('#smartAlertPrompt').focus();
  581.                     });
  582.                 resetPie();
  583.                 open = true;
  584.             };
  585.             if (open)
  586.                 close(show)
  587.             else
  588.                 show();
  589.         },
  590.  
  591.         /**
  592.          * Set default settings and/or alert types
  593.          *
  594.          * @param   {Object}         options                         Settings
  595.          * @param   {Object}         [options.defaults]              Default alert settings
  596.          * @param   {String|Object}  [options.defaults.container]    Default container for alert placement
  597.          * @param   {String}         [options.defaults.type]         Default alert type('info', 'confirm', 'warning', 'error', 'prompt')
  598.          * @param   {String}         [options.defaults.title]        Default alert title
  599.          * @param   {Boolean}        [options.defaults.cancel]       Default cancelable setting
  600.          * @param   {String|Boolean} [options.defaults.content]      Alert icon(one of icons defined in theme stylesheet or false)
  601.          * @param   {String}         [options.defaults.content]      Default alert content
  602.          * @param   {String}         [options.defaults.align]        Default content alignment('left', 'center', 'right')
  603.          * @param   {Object}         [options.defaults.buttons]      Default object with buttons {id: 'text', ...}
  604.          * @param   {Number}         [options.defaults.width]        Default alert width
  605.          * @param   {Number}         [options.defaults.maxHeight]    Default content maximum height
  606.          * @param   {Boolean}        [options.defaults.draggable]    Default drag&drop setting
  607.          * @param   {Function}       [options.defaults.callback]     Default callback
  608.          * @param   {String}         [options.defaults.pie]          Use PIE.htc directly or use its PHP wrapper('htc', 'php')
  609.          * @param   {Object}         [options.types]                 Alert types
  610.          * @param   {Object}         [options.types.info]            Info alert
  611.          * @param   {String}         [options.types.info.title]      Info alert title
  612.          * @param   {Object}         [options.types.info.buttons]    Info alert buttons
  613.          * @param   {Object}         [options.types.confirm]         Confirm alert
  614.          * @param   {String}         [options.types.confirm.title]   Confirm alert title
  615.          * @param   {Object}         [options.types.confirm.buttons] Confirm alert buttons
  616.          * @param   {Object}         [options.types.warning]         Warning alert
  617.          * @param   {String}         [options.types.warning.title]   Warning alert title
  618.          * @param   {Object}         [options.types.warning.buttons] Warning alert buttons
  619.          * @param   {Object}         [options.types.error]           Error alert
  620.          * @param   {String}         [options.types.error.title]     Error alert title
  621.          * @param   {Object}         [options.types.error.buttons]   Error alert buttons
  622.          *
  623.          * @returns {Object}                                         Current settings
  624.          */
  625.         setup: function(options) {
  626.             if ($.isPlainObject(options))
  627.                 $.extend(true, setup, options);
  628.             return $.extend(true, {}, setup);
  629.         }
  630.     };
  631.  
  632.     // jQuery.browser replacement
  633.     if (!jQuery.browser)
  634.         (function() {
  635.             var matched, browser;
  636.             jQuery.uaMatch = function(ua) {
  637.                 ua = ua.toLowerCase();
  638.                 var match =
  639.                     /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
  640.                     /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
  641.                     /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
  642.                     /(msie) ([\w.]+)/.exec( ua ) ||
  643.                     ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
  644.                     [];
  645.                 return {
  646.                     browser: match[ 1 ] || "",
  647.                     version: match[ 2 ] || "0"
  648.                 };
  649.             };
  650.             matched = jQuery.uaMatch(navigator.userAgent);
  651.             browser = {};
  652.             if (matched.browser) {
  653.                 browser[ matched.browser ] = true;
  654.                 browser.version = matched.version;
  655.             }
  656.             if (browser.chrome)
  657.                 browser.webkit = true;
  658.             else if (browser.webkit)
  659.                 browser.safari = true;
  660.             jQuery.browser = browser;
  661.         })();
  662.  
  663.     // Initialization
  664.     $(init);
  665. })(jQuery);
  666.  
  667. // Mousewheel plugin
  668. (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);
  669.  
  670. // Malihu custom scrollbar
  671. (function(c){var b={init:function(e){var f={set_width:false,set_height:false,horizontalScroll:false,scrollInertia:950,mouseWheel:true,mouseWheelPixels:"auto",autoDraggerLength:true,autoHideScrollbar:false,scrollButtons:{enable:false,scrollType:"continuous",scrollSpeed:"auto",scrollAmount:40},advanced:{updateOnBrowserResize:true,updateOnContentResize:false,autoExpandHorizontalScroll:false,autoScrollOnFocus:true,normalizeMouseWheelDelta:false},contentTouchScroll:true,callbacks:{onScrollStart:function(){},onScroll:function(){},onTotalScroll:function(){},onTotalScrollBack:function(){},onTotalScrollOffset:0,onTotalScrollBackOffset:0,whileScrolling:function(){}},theme:"light"},e=c.extend(true,f,e);return this.each(function(){var m=c(this);if(e.set_width){m.css("width",e.set_width)}if(e.set_height){m.css("height",e.set_height)}if(!c(document).data("mCustomScrollbar-index")){c(document).data("mCustomScrollbar-index","1")}else{var t=parseInt(c(document).data("mCustomScrollbar-index"));c(document).data("mCustomScrollbar-index",t+1)}m.wrapInner("<div class='mCustomScrollBox mCS-"+e.theme+"' id='mCSB_"+c(document).data("mCustomScrollbar-index")+"' style='position:relative; height:100%; overflow:hidden; max-width:100%;' />").addClass("mCustomScrollbar _mCS_"+c(document).data("mCustomScrollbar-index"));var g=m.children(".mCustomScrollBox");if(e.horizontalScroll){g.addClass("mCSB_horizontal").wrapInner("<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />");var k=g.children(".mCSB_h_wrapper");k.wrapInner("<div class='mCSB_container' style='position:absolute; left:0;' />").children(".mCSB_container").css({width:k.children().outerWidth(),position:"relative"}).unwrap()}else{g.wrapInner("<div class='mCSB_container' style='position:relative; top:0;' />")}var o=g.children(".mCSB_container");if(c.support.touch){o.addClass("mCS_touch")}o.after("<div class='mCSB_scrollTools' style='position:absolute;'><div class='mCSB_draggerContainer'><div class='mCSB_dragger' style='position:absolute;' oncontextmenu='return false;'><div class='mCSB_dragger_bar' style='position:relative;'></div></div><div class='mCSB_draggerRail'></div></div></div>");var l=g.children(".mCSB_scrollTools"),h=l.children(".mCSB_draggerContainer"),q=h.children(".mCSB_dragger");if(e.horizontalScroll){q.data("minDraggerWidth",q.width())}else{q.data("minDraggerHeight",q.height())}if(e.scrollButtons.enable){if(e.horizontalScroll){l.prepend("<a class='mCSB_buttonLeft' oncontextmenu='return false;'></a>").append("<a class='mCSB_buttonRight' oncontextmenu='return false;'></a>")}else{l.prepend("<a class='mCSB_buttonUp' oncontextmenu='return false;'></a>").append("<a class='mCSB_buttonDown' oncontextmenu='return false;'></a>")}}g.bind("scroll",function(){if(!m.is(".mCS_disabled")){g.scrollTop(0).scrollLeft(0)}});m.data({mCS_Init:true,mCustomScrollbarIndex:c(document).data("mCustomScrollbar-index"),horizontalScroll:e.horizontalScroll,scrollInertia:e.scrollInertia,scrollEasing:"mcsEaseOut",mouseWheel:e.mouseWheel,mouseWheelPixels:e.mouseWheelPixels,autoDraggerLength:e.autoDraggerLength,autoHideScrollbar:e.autoHideScrollbar,scrollButtons_enable:e.scrollButtons.enable,scrollButtons_scrollType:e.scrollButtons.scrollType,scrollButtons_scrollSpeed:e.scrollButtons.scrollSpeed,scrollButtons_scrollAmount:e.scrollButtons.scrollAmount,autoExpandHorizontalScroll:e.advanced.autoExpandHorizontalScroll,autoScrollOnFocus:e.advanced.autoScrollOnFocus,normalizeMouseWheelDelta:e.advanced.normalizeMouseWheelDelta,contentTouchScroll:e.contentTouchScroll,onScrollStart_Callback:e.callbacks.onScrollStart,onScroll_Callback:e.callbacks.onScroll,onTotalScroll_Callback:e.callbacks.onTotalScroll,onTotalScrollBack_Callback:e.callbacks.onTotalScrollBack,onTotalScroll_Offset:e.callbacks.onTotalScrollOffset,onTotalScrollBack_Offset:e.callbacks.onTotalScrollBackOffset,whileScrolling_Callback:e.callbacks.whileScrolling,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,mCSB_buttonScrollRight:false,mCSB_buttonScrollLeft:false,mCSB_buttonScrollDown:false,mCSB_buttonScrollUp:false});if(e.horizontalScroll){if(m.css("max-width")!=="none"){if(!e.advanced.updateOnContentResize){e.advanced.updateOnContentResize=true}}}else{if(m.css("max-height")!=="none"){var s=false,r=parseInt(m.css("max-height"));if(m.css("max-height").indexOf("%")>=0){s=r,r=m.parent().height()*s/100}m.css("overflow","hidden");g.css("max-height",r)}}m.mCustomScrollbar("update");if(e.advanced.updateOnBrowserResize){var i,j=c(window).width(),u=c(window).height();c(window).bind("resize."+m.data("mCustomScrollbarIndex"),function(){if(i){clearTimeout(i)}i=setTimeout(function(){if(!m.is(".mCS_disabled")&&!m.is(".mCS_destroyed")){var w=c(window).width(),v=c(window).height();if(j!==w||u!==v){if(m.css("max-height")!=="none"&&s){g.css("max-height",m.parent().height()*s/100)}m.mCustomScrollbar("update");j=w;u=v}}},150)})}if(e.advanced.updateOnContentResize){var p;if(e.horizontalScroll){var n=o.outerWidth()}else{var n=o.outerHeight()}p=setInterval(function(){if(e.horizontalScroll){if(e.advanced.autoExpandHorizontalScroll){o.css({position:"absolute",width:"auto"}).wrap("<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />").css({width:o.outerWidth(),position:"relative"}).unwrap()}var v=o.outerWidth()}else{var v=o.outerHeight()}if(v!=n){m.mCustomScrollbar("update");n=v}},300)}})},update:function(){var n=c(this),k=n.children(".mCustomScrollBox"),q=k.children(".mCSB_container");q.removeClass("mCS_no_scrollbar");n.removeClass("mCS_disabled mCS_destroyed");k.scrollTop(0).scrollLeft(0);var y=k.children(".mCSB_scrollTools"),o=y.children(".mCSB_draggerContainer"),m=o.children(".mCSB_dragger");if(n.data("horizontalScroll")){var A=y.children(".mCSB_buttonLeft"),t=y.children(".mCSB_buttonRight"),f=k.width();if(n.data("autoExpandHorizontalScroll")){q.css({position:"absolute",width:"auto"}).wrap("<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />").css({width:q.outerWidth(),position:"relative"}).unwrap()}var z=q.outerWidth()}else{var w=y.children(".mCSB_buttonUp"),g=y.children(".mCSB_buttonDown"),r=k.height(),i=q.outerHeight()}if(i>r&&!n.data("horizontalScroll")){y.css("display","block");var s=o.height();if(n.data("autoDraggerLength")){var u=Math.round(r/i*s),l=m.data("minDraggerHeight");if(u<=l){m.css({height:l})}else{if(u>=s-10){var p=s-10;m.css({height:p})}else{m.css({height:u})}}m.children(".mCSB_dragger_bar").css({"line-height":m.height()+"px"})}var B=m.height(),x=(i-r)/(s-B);n.data("scrollAmount",x).mCustomScrollbar("scrolling",k,q,o,m,w,g,A,t);var D=Math.abs(q.position().top);n.mCustomScrollbar("scrollTo",D,{scrollInertia:0})}else{if(z>f&&n.data("horizontalScroll")){y.css("display","block");var h=o.width();if(n.data("autoDraggerLength")){var j=Math.round(f/z*h),C=m.data("minDraggerWidth");if(j<=C){m.css({width:C})}else{if(j>=h-10){var e=h-10;m.css({width:e})}else{m.css({width:j})}}}var v=m.width(),x=(z-f)/(h-v);n.data("scrollAmount",x).mCustomScrollbar("scrolling",k,q,o,m,w,g,A,t);var D=Math.abs(q.position().left);n.mCustomScrollbar("scrollTo",D,{scrollInertia:0})}else{k.unbind("mousewheel focusin");if(n.data("horizontalScroll")){m.add(q).css("left",0)}else{m.add(q).css("top",0)}y.css("display","none");q.addClass("mCS_no_scrollbar");n.data({bindEvent_mousewheel:false,bindEvent_focusin:false})}}},scrolling:function(h,p,m,j,w,e,A,v){var k=c(this);if(!k.data("bindEvent_scrollbar_drag")){var n,o;if(c.support.msPointer){j.bind("MSPointerDown",function(H){H.preventDefault();k.data({on_drag:true});j.addClass("mCSB_dragger_onDrag");var G=c(this),J=G.offset(),F=H.originalEvent.pageX-J.left,I=H.originalEvent.pageY-J.top;if(F<G.width()&&F>0&&I<G.height()&&I>0){n=I;o=F}});c(document).bind("MSPointerMove."+k.data("mCustomScrollbarIndex"),function(H){H.preventDefault();if(k.data("on_drag")){var G=j,J=G.offset(),F=H.originalEvent.pageX-J.left,I=H.originalEvent.pageY-J.top;D(n,o,I,F)}}).bind("MSPointerUp."+k.data("mCustomScrollbarIndex"),function(x){x.preventDefault();k.data({on_drag:false});j.removeClass("mCSB_dragger_onDrag")})}else{j.bind("mousedown touchstart",function(H){H.preventDefault();H.stopImmediatePropagation();var G=c(this),K=G.offset(),F,J;if(H.type==="touchstart"){var I=H.originalEvent.touches[0]||H.originalEvent.changedTouches[0];F=I.pageX-K.left;J=I.pageY-K.top}else{k.data({on_drag:true});j.addClass("mCSB_dragger_onDrag");F=H.pageX-K.left;J=H.pageY-K.top}if(F<G.width()&&F>0&&J<G.height()&&J>0){n=J;o=F}}).bind("touchmove",function(H){H.preventDefault();H.stopImmediatePropagation();var K=H.originalEvent.touches[0]||H.originalEvent.changedTouches[0],G=c(this),J=G.offset(),F=K.pageX-J.left,I=K.pageY-J.top;D(n,o,I,F)});c(document).bind("mousemove."+k.data("mCustomScrollbarIndex"),function(H){H.preventDefault();if(k.data("on_drag")){var G=j,J=G.offset(),F=H.pageX-J.left,I=H.pageY-J.top;D(n,o,I,F)}}).bind("mouseup."+k.data("mCustomScrollbarIndex"),function(x){x.preventDefault();k.data({on_drag:false});j.removeClass("mCSB_dragger_onDrag")})}k.data({bindEvent_scrollbar_drag:true})}function D(G,H,I,F){if(k.data("horizontalScroll")){k.mCustomScrollbar("scrollTo",(j.position().left-(H))+F,{moveDragger:true,trigger:"internal"})}else{k.mCustomScrollbar("scrollTo",(j.position().top-(G))+I,{moveDragger:true,trigger:"internal"})}}if(c.support.touch&&k.data("contentTouchScroll")){if(!k.data("bindEvent_content_touch")){var l,B,r,s,u,C,E;p.bind("touchstart",function(x){x.stopImmediatePropagation();l=x.originalEvent.touches[0]||x.originalEvent.changedTouches[0];B=c(this);r=B.offset();u=l.pageX-r.left;s=l.pageY-r.top;C=s;E=u});p.bind("touchmove",function(x){x.preventDefault();x.stopImmediatePropagation();l=x.originalEvent.touches[0]||x.originalEvent.changedTouches[0];B=c(this).parent();r=B.offset();u=l.pageX-r.left;s=l.pageY-r.top;if(k.data("horizontalScroll")){k.mCustomScrollbar("scrollTo",E-u,{trigger:"internal"})}else{k.mCustomScrollbar("scrollTo",C-s,{trigger:"internal"})}})}}if(!k.data("bindEvent_scrollbar_click")){m.bind("click",function(F){var x=(F.pageY-m.offset().top)*k.data("scrollAmount"),y=c(F.target);if(k.data("horizontalScroll")){x=(F.pageX-m.offset().left)*k.data("scrollAmount")}if(y.hasClass("mCSB_draggerContainer")||y.hasClass("mCSB_draggerRail")){k.mCustomScrollbar("scrollTo",x,{trigger:"internal",scrollEasing:"draggerRailEase"})}});k.data({bindEvent_scrollbar_click:true})}if(k.data("mouseWheel")){if(!k.data("bindEvent_mousewheel")){h.bind("mousewheel",function(H,J){var G,F=k.data("mouseWheelPixels"),x=Math.abs(p.position().top),I=j.position().top,y=m.height()-j.height();if(k.data("normalizeMouseWheelDelta")){if(J<0){J=-1}else{J=1}}if(F==="auto"){F=100+Math.round(k.data("scrollAmount")/2)}if(k.data("horizontalScroll")){I=j.position().left;y=m.width()-j.width();x=Math.abs(p.position().left)}if((J>0&&I!==0)||(J<0&&I!==y)){H.preventDefault();H.stopImmediatePropagation()}G=x-(J*F);k.mCustomScrollbar("scrollTo",G,{trigger:"internal"})});k.data({bindEvent_mousewheel:true})}}if(k.data("scrollButtons_enable")){if(k.data("scrollButtons_scrollType")==="pixels"){if(k.data("horizontalScroll")){v.add(A).unbind("mousedown touchstart MSPointerDown mouseup MSPointerUp mouseout MSPointerOut touchend",i,g);k.data({bindEvent_buttonsContinuous_x:false});if(!k.data("bindEvent_buttonsPixels_x")){v.bind("click",function(x){x.preventDefault();q(Math.abs(p.position().left)+k.data("scrollButtons_scrollAmount"))});A.bind("click",function(x){x.preventDefault();q(Math.abs(p.position().left)-k.data("scrollButtons_scrollAmount"))});k.data({bindEvent_buttonsPixels_x:true})}}else{e.add(w).unbind("mousedown touchstart MSPointerDown mouseup MSPointerUp mouseout MSPointerOut touchend",i,g);k.data({bindEvent_buttonsContinuous_y:false});if(!k.data("bindEvent_buttonsPixels_y")){e.bind("click",function(x){x.preventDefault();q(Math.abs(p.position().top)+k.data("scrollButtons_scrollAmount"))});w.bind("click",function(x){x.preventDefault();q(Math.abs(p.position().top)-k.data("scrollButtons_scrollAmount"))});k.data({bindEvent_buttonsPixels_y:true})}}function q(x){if(!j.data("preventAction")){j.data("preventAction",true);k.mCustomScrollbar("scrollTo",x,{trigger:"internal"})}}}else{if(k.data("horizontalScroll")){v.add(A).unbind("click");k.data({bindEvent_buttonsPixels_x:false});if(!k.data("bindEvent_buttonsContinuous_x")){v.bind("mousedown touchstart MSPointerDown",function(y){y.preventDefault();var x=z();k.data({mCSB_buttonScrollRight:setInterval(function(){k.mCustomScrollbar("scrollTo",Math.abs(p.position().left)+x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var i=function(x){x.preventDefault();clearInterval(k.data("mCSB_buttonScrollRight"))};v.bind("mouseup touchend MSPointerUp mouseout MSPointerOut",i);A.bind("mousedown touchstart MSPointerDown",function(y){y.preventDefault();var x=z();k.data({mCSB_buttonScrollLeft:setInterval(function(){k.mCustomScrollbar("scrollTo",Math.abs(p.position().left)-x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var g=function(x){x.preventDefault();clearInterval(k.data("mCSB_buttonScrollLeft"))};A.bind("mouseup touchend MSPointerUp mouseout MSPointerOut",g);k.data({bindEvent_buttonsContinuous_x:true})}}else{e.add(w).unbind("click");k.data({bindEvent_buttonsPixels_y:false});if(!k.data("bindEvent_buttonsContinuous_y")){e.bind("mousedown touchstart MSPointerDown",function(y){y.preventDefault();var x=z();k.data({mCSB_buttonScrollDown:setInterval(function(){k.mCustomScrollbar("scrollTo",Math.abs(p.position().top)+x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var t=function(x){x.preventDefault();clearInterval(k.data("mCSB_buttonScrollDown"))};e.bind("mouseup touchend MSPointerUp mouseout MSPointerOut",t);w.bind("mousedown touchstart MSPointerDown",function(y){y.preventDefault();var x=z();k.data({mCSB_buttonScrollUp:setInterval(function(){k.mCustomScrollbar("scrollTo",Math.abs(p.position().top)-x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var f=function(x){x.preventDefault();clearInterval(k.data("mCSB_buttonScrollUp"))};w.bind("mouseup touchend MSPointerUp mouseout MSPointerOut",f);k.data({bindEvent_buttonsContinuous_y:true})}}function z(){var x=k.data("scrollButtons_scrollSpeed");if(k.data("scrollButtons_scrollSpeed")==="auto"){x=Math.round((k.data("scrollInertia")+100)/40)}return x}}}if(k.data("autoScrollOnFocus")){if(!k.data("bindEvent_focusin")){h.bind("focusin",function(){h.scrollTop(0).scrollLeft(0);var x=c(document.activeElement);if(x.is("input,textarea,select,button,a[tabindex],area,object")){var G=p.position().top,y=x.position().top,F=h.height()-x.outerHeight();if(k.data("horizontalScroll")){G=p.position().left;y=x.position().left;F=h.width()-x.outerWidth()}if(G+y<0||G+y>F){k.mCustomScrollbar("scrollTo",y,{trigger:"internal"})}}});k.data({bindEvent_focusin:true})}}if(k.data("autoHideScrollbar")){if(!k.data("bindEvent_autoHideScrollbar")){h.bind("mouseenter",function(x){h.addClass("mCS-mouse-over");d.showScrollbar.call(h.children(".mCSB_scrollTools"))}).bind("mouseleave touchend",function(x){h.removeClass("mCS-mouse-over");if(x.type==="mouseleave"){d.hideScrollbar.call(h.children(".mCSB_scrollTools"))}});k.data({bindEvent_autoHideScrollbar:true})}}},scrollTo:function(n,u){var r=c(this),k={moveDragger:false,trigger:"external",callbacks:true,scrollInertia:r.data("scrollInertia"),scrollEasing:r.data("scrollEasing")},u=c.extend(k,u),j,i=r.children(".mCustomScrollBox"),s=i.children(".mCSB_container"),q=i.children(".mCSB_scrollTools"),h=q.children(".mCSB_draggerContainer"),t=h.children(".mCSB_dragger"),g=draggerSpeed=u.scrollInertia,m,f,l,e;r.data({mCS_trigger:u.trigger});if(r.data("mCS_Init")){u.callbacks=false}if(n||n===0){if(typeof(n)==="number"){if(u.moveDragger){j=n;if(r.data("horizontalScroll")){n=t.position().left*r.data("scrollAmount")}else{n=t.position().top*r.data("scrollAmount")}draggerSpeed=0}else{j=n/r.data("scrollAmount")}}else{if(typeof(n)==="string"){var p;if(n==="top"){p=0}else{if(n==="bottom"&&!r.data("horizontalScroll")){p=s.outerHeight()-i.height()}else{if(n==="left"){p=0}else{if(n==="right"&&r.data("horizontalScroll")){p=s.outerWidth()-i.width()}else{if(n==="first"){p=r.find(".mCSB_container").find(":first")}else{if(n==="last"){p=r.find(".mCSB_container").find(":last")}else{p=r.find(n)}}}}}}if(p.length===1){if(r.data("horizontalScroll")){n=p.position().left}else{n=p.position().top}j=n/r.data("scrollAmount")}else{j=n=p}}}if(r.data("horizontalScroll")){if(r.data("onTotalScrollBack_Offset")){f=-r.data("onTotalScrollBack_Offset")}if(r.data("onTotalScroll_Offset")){e=i.width()-s.outerWidth()+r.data("onTotalScroll_Offset")}if(j<0){j=n=0;clearInterval(r.data("mCSB_buttonScrollLeft"));if(!f){m=true}}else{if(j>=h.width()-t.width()){j=h.width()-t.width();n=i.width()-s.outerWidth();clearInterval(r.data("mCSB_buttonScrollRight"));if(!e){l=true}}else{n=-n}}d.mTweenAxis.call(this,t[0],"left",Math.round(j),draggerSpeed,u.scrollEasing);d.mTweenAxis.call(this,s[0],"left",Math.round(n),g,u.scrollEasing,{onStart:function(){if(u.callbacks&&!r.data("mCS_tweenRunning")){o("onScrollStart")}if(r.data("autoHideScrollbar")){d.showScrollbar.call(q)}},onUpdate:function(){if(u.callbacks){o("whileScrolling")}},onComplete:function(){if(u.callbacks){o("onScroll");if(m||(f&&s.position().left>=f)){o("onTotalScrollBack")}if(l||(e&&s.position().left<=e)){o("onTotalScroll")}}t.data("preventAction",false);r.data("mCS_tweenRunning",false);if(r.data("autoHideScrollbar")){if(!i.hasClass("mCS-mouse-over")){d.hideScrollbar.call(q)}}},})}else{if(r.data("onTotalScrollBack_Offset")){f=-r.data("onTotalScrollBack_Offset")}if(r.data("onTotalScroll_Offset")){e=i.height()-s.outerHeight()+r.data("onTotalScroll_Offset")}if(j<0){j=n=0;clearInterval(r.data("mCSB_buttonScrollUp"));if(!f){m=true}}else{if(j>=h.height()-t.height()){j=h.height()-t.height();n=i.height()-s.outerHeight();clearInterval(r.data("mCSB_buttonScrollDown"));if(!e){l=true}}else{n=-n}}d.mTweenAxis.call(this,t[0],"top",Math.round(j),draggerSpeed,u.scrollEasing);d.mTweenAxis.call(this,s[0],"top",Math.round(n),g,u.scrollEasing,{onStart:function(){if(u.callbacks&&!r.data("mCS_tweenRunning")){o("onScrollStart")}if(r.data("autoHideScrollbar")){d.showScrollbar.call(q)}},onUpdate:function(){if(u.callbacks){o("whileScrolling")}},onComplete:function(){if(u.callbacks){o("onScroll");if(m||(f&&s.position().top>=f)){o("onTotalScrollBack")}if(l||(e&&s.position().top<=e)){o("onTotalScroll")}}t.data("preventAction",false);r.data("mCS_tweenRunning",false);if(r.data("autoHideScrollbar")){if(!i.hasClass("mCS-mouse-over")){d.hideScrollbar.call(q)}}},})}if(r.data("mCS_Init")){r.data({mCS_Init:false})}}function o(v){this.mcs={top:s.position().top,left:s.position().left,draggerTop:t.position().top,draggerLeft:t.position().left,topPct:Math.round((100*Math.abs(s.position().top))/Math.abs(s.outerHeight()-i.height())),leftPct:Math.round((100*Math.abs(s.position().left))/Math.abs(s.outerWidth()-i.width()))};switch(v){case"onScrollStart":r.data("mCS_tweenRunning",true).data("onScrollStart_Callback").call(r,this.mcs);break;case"whileScrolling":r.data("whileScrolling_Callback").call(r,this.mcs);break;case"onScroll":r.data("onScroll_Callback").call(r,this.mcs);break;case"onTotalScrollBack":r.data("onTotalScrollBack_Callback").call(r,this.mcs);break;case"onTotalScroll":r.data("onTotalScroll_Callback").call(r,this.mcs);break}}},stop:function(){var g=c(this),e=g.children().children(".mCSB_container"),f=g.children().children().children().children(".mCSB_dragger");d.mTweenAxisStop.call(this,e[0]);d.mTweenAxisStop.call(this,f[0])},disable:function(e){var j=c(this),f=j.children(".mCustomScrollBox"),h=f.children(".mCSB_container"),g=f.children(".mCSB_scrollTools"),i=g.children().children(".mCSB_dragger");f.unbind("mousewheel focusin mouseenter mouseleave touchend");h.unbind("touchstart touchmove");if(e){if(j.data("horizontalScroll")){i.add(h).css("left",0)}else{i.add(h).css("top",0)}}g.css("display","none");h.addClass("mCS_no_scrollbar");j.data({bindEvent_mousewheel:false,bindEvent_focusin:false,bindEvent_content_touch:false,bindEvent_autoHideScrollbar:false}).addClass("mCS_disabled")},destroy:function(){var e=c(this);e.removeClass("mCustomScrollbar _mCS_"+e.data("mCustomScrollbarIndex")).addClass("mCS_destroyed").children().children(".mCSB_container").unwrap().children().unwrap().siblings(".mCSB_scrollTools").remove();c(document).unbind("mousemove."+e.data("mCustomScrollbarIndex")+" mouseup."+e.data("mCustomScrollbarIndex")+" MSPointerMove."+e.data("mCustomScrollbarIndex")+" MSPointerUp."+e.data("mCustomScrollbarIndex"));c(window).unbind("resize."+e.data("mCustomScrollbarIndex"))}},d={showScrollbar:function(){this.stop().animate({opacity:1},"fast")},hideScrollbar:function(){this.stop().animate({opacity:0},"fast")},mTweenAxis:function(g,i,h,f,o,y){var y=y||{},v=y.onStart||function(){},p=y.onUpdate||function(){},w=y.onComplete||function(){};var n=t(),l,j=0,r=g.offsetTop,s=g.style;if(i==="left"){r=g.offsetLeft}var m=h-r;q();e();function t(){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 x(){if(!j){v.call()}j=t()-n;u();if(j>=g._time){g._time=(j>g._time)?j+l-(j-g._time):j+l-1;if(g._time<j+1){g._time=j+1}}if(g._time<f){g._id=_request(x)}else{w.call()}}function u(){if(f>0){g.currVal=k(g._time,r,m,f,o);s[i]=Math.round(g.currVal)+"px"}else{s[i]=h+"px"}p.call()}function e(){l=1000/60;g._time=j+l;_request=(!window.requestAnimationFrame)?function(z){u();return setTimeout(z,0.01)}:window.requestAnimationFrame;g._id=_request(x)}function q(){if(g._id==null){return}if(!window.requestAnimationFrame){clearTimeout(g._id)}else{window.cancelAnimationFrame(g._id)}g._id=null}function k(B,A,F,E,C){switch(C){case"linear":return F*B/E+A;break;case"easeOutQuad":B/=E;return -F*B*(B-2)+A;break;case"easeInOutQuad":B/=E/2;if(B<1){return F/2*B*B+A}B--;return -F/2*(B*(B-2)-1)+A;break;case"easeOutCubic":B/=E;B--;return F*(B*B*B+1)+A;break;case"easeOutQuart":B/=E;B--;return -F*(B*B*B*B-1)+A;break;case"easeOutQuint":B/=E;B--;return F*(B*B*B*B*B+1)+A;break;case"easeOutCirc":B/=E;B--;return F*Math.sqrt(1-B*B)+A;break;case"easeOutSine":return F*Math.sin(B/E*(Math.PI/2))+A;break;case"easeOutExpo":return F*(-Math.pow(2,-10*B/E)+1)+A;break;case"mcsEaseOut":var D=(B/=E)*B,z=D*B;return A+F*(0.499999999999997*z*D+-2.5*D*D+5.5*z+-6.5*D+4*B);break;case"draggerRailEase":B/=E/2;if(B<1){return F/2*B*B*B+A}B-=2;return F/2*(B*B*B+2)+A;break}}},mTweenAxisStop:function(e){if(e._id==null){return}if(!window.requestAnimationFrame){clearTimeout(e._id)}else{window.cancelAnimationFrame(e._id)}e._id=null},rafPolyfill:function(){var f=["ms","moz","webkit","o"],e=f.length;while(--e>-1&&!window.requestAnimationFrame){window.requestAnimationFrame=window[f[e]+"RequestAnimationFrame"];window.cancelAnimationFrame=window[f[e]+"CancelAnimationFrame"]||window[f[e]+"CancelRequestAnimationFrame"]}}};d.rafPolyfill.call();c.support.touch=!!("ontouchstart" in window);c.support.msPointer=window.navigator.msPointerEnabled;var a=("https:"==document.location.protocol)?"https:":"http:";c.event.special.mousewheel||document.write('<script src="'+a+'//cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.0.6/jquery.mousewheel.min.js"><\/script>');c.fn.mCustomScrollbar=function(e){if(b[e]){return b[e].apply(this,Array.prototype.slice.call(arguments,1))}else{if(typeof e==="object"||!e){return b.init.apply(this,arguments)}else{c.error("Method "+e+" does not exist")}}}})(jQuery);

Raw Paste


Login or Register to edit or fork this paste. It's free.