{"version":3,"file":"jquery.selectric.min.js","sources":["Scripts/commun/lib/plugins/jquery.selectric.js"],"sourcesContent":["/*\r\n * SELECTRIC\r\n * http://lcdsantos.github.io/jQuery-Selectric/\r\n * http://lcdsantos.github.io/jQuery-Selectric/\r\n * \r\n * Version: inconnue. date du 14 nov 2017\r\n */\n\n(function (factory) {\n  /* global define */\n  /* istanbul ignore next */\n  if (typeof __cw__define === 'function' && __cw__define.amd) {\n    __cw__define(['jquery'], factory);\n  } else if (typeof module === 'object' && module.exports) {\n    // Node/CommonJS\n    module.exports = function (root, jQuery) {\n      if (jQuery === undefined) {\n        if (typeof window !== 'undefined') {\n          jQuery = require('jquery');\n        } else {\n          jQuery = require('jquery')(root);\n        }\n      }\n      factory(jQuery);\n      return jQuery;\n    };\n  } else {\n    // Browser globals\n    factory(jQuery);\n  }\n})(function ($) {\n  'use strict';\n\n  var $doc = $(document);\n  var $win = $(window);\n  var pluginName = 'selectric';\n  var classList = 'Input Items Open Disabled TempShow HideSelect Wrapper Focus Hover Responsive Above Below Scroll Group GroupLabel';\n  var eventNamespaceSuffix = '.sl';\n  var chars = ['a', 'e', 'i', 'o', 'u', 'n', 'c', 'y'];\n  var diacritics = [/[\\xE0-\\xE5]/g,\n  // a\n  /[\\xE8-\\xEB]/g,\n  // e\n  /[\\xEC-\\xEF]/g,\n  // i\n  /[\\xF2-\\xF6]/g,\n  // o\n  /[\\xF9-\\xFC]/g,\n  // u\n  /[\\xF1]/g,\n  // n\n  /[\\xE7]/g,\n  // c\n  /[\\xFD-\\xFF]/g // y\n  ];\n\n  /**\r\n   * Create an instance of Selectric\r\n   *\r\n   * @constructor\r\n   * @param {Node} element - The &lt;select&gt; element\r\n   * @param {object}  opts - Options\r\n   */\n  var Selectric = function Selectric(element, opts) {\n    var _this = this;\n    _this.element = element;\n    _this.$element = $(element);\n    _this.state = {\n      multiple: !!_this.$element.attr('multiple'),\n      enabled: false,\n      opened: false,\n      currValue: -1,\n      selectedIdx: -1,\n      highlightedIdx: -1\n    };\n    _this.eventTriggers = {\n      open: _this.open,\n      close: _this.close,\n      destroy: _this.destroy,\n      refresh: _this.refresh,\n      init: _this.init\n    };\n    _this.init(opts);\n  };\n  Selectric.prototype = {\n    utils: {\n      /**\r\n       * Detect mobile browser\r\n       *\r\n       * @return {boolean}\r\n       */\n      isMobile: function isMobile() {\n        return /android|ip(hone|od|ad)/i.test(navigator.userAgent);\n      },\n      /**\r\n       * Escape especial characters in string (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions)\r\n       *\r\n       * @param  {string} str - The string to be escaped\r\n       * @return {string}       The string with the special characters escaped\r\n       */\n      escapeRegExp: function escapeRegExp(str) {\n        return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n      },\n      /**\r\n       * Replace diacritics\r\n       *\r\n       * @param  {string} str - The string to replace the diacritics\r\n       * @return {string}       The string with diacritics replaced with ascii characters\r\n       */\n      replaceDiacritics: function replaceDiacritics(str) {\n        var k = diacritics.length;\n        while (k--) {\n          str = str.toLowerCase().replace(diacritics[k], chars[k]);\n        }\n        return str;\n      },\n      /**\r\n       * Format string\r\n       * https://gist.github.com/atesgoral/984375\r\n       *\r\n       * @param  {string} f - String to be formated\r\n       * @return {string}     String formated\r\n       */\n      format: function format(f) {\n        var a = arguments; // store outer arguments\n        return ('' + f // force format specifier to String\n        ).replace(\n        // replace tokens in format specifier\n        /\\{(?:(\\d+)|(\\w+))\\}/g,\n        // match {token} references\n        function (s,\n        // the matched string (ignored)\n        i,\n        // an argument index\n        p // a property name\n        ) {\n          return p && a[1] // if property name and first argument exist\n          ? a[1][p] // return property from first argument\n          : a[i]; // assume argument index and return i-th argument\n        });\n      },\n      /**\r\n       * Get the next enabled item in the options list.\r\n       *\r\n       * @param  {object} selectItems - The options object.\r\n       * @param  {number}    selected - Index of the currently selected option.\r\n       * @return {object}               The next enabled item.\r\n       */\n      nextEnabledItem: function nextEnabledItem(selectItems, selected) {\n        while (selectItems[selected = (selected + 1) % selectItems.length].disabled) {\n          // empty\n        }\n        return selected;\n      },\n      /**\r\n       * Get the previous enabled item in the options list.\r\n       *\r\n       * @param  {object} selectItems - The options object.\r\n       * @param  {number}    selected - Index of the currently selected option.\r\n       * @return {object}               The previous enabled item.\r\n       */\n      previousEnabledItem: function previousEnabledItem(selectItems, selected) {\n        while (selectItems[selected = (selected > 0 ? selected : selectItems.length) - 1].disabled) {\n          // empty\n        }\n        return selected;\n      },\n      /**\r\n       * Transform camelCase string to dash-case.\r\n       *\r\n       * @param  {string} str - The camelCased string.\r\n       * @return {string}       The string transformed to dash-case.\r\n       */\n      toDash: function toDash(str) {\n        return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n      },\n      /**\r\n       * Calls the events registered with function name.\r\n       *\r\n       * @param {string}    fn - The name of the function.\r\n       * @param {number} scope - Scope that should be set on the function.\r\n       */\n      triggerCallback: function triggerCallback(fn, scope) {\n        var elm = scope.element;\n        var func = scope.options['on' + fn];\n        var args = [elm].concat([].slice.call(arguments).slice(1));\n        if ($.isFunction(func)) {\n          func.apply(elm, args);\n        }\n        $(elm).trigger(pluginName + '-' + this.toDash(fn), args);\n      },\n      /**\r\n       * Transform array list to concatenated string and remove empty values\r\n       * @param  {array} arr - Class list\r\n       * @return {string}      Concatenated string\r\n       */\n      arrayToClassname: function arrayToClassname(arr) {\n        var newArr = $.grep(arr, function (item) {\n          return !!item;\n        });\n        return $.trim(newArr.join(' '));\n      }\n    },\n    /** Initializes */\n    init: function init(opts) {\n      var _this = this;\n\n      // Set options\n      _this.options = $.extend(true, {}, $.fn[pluginName].defaults, _this.options, opts);\n      _this.utils.triggerCallback('BeforeInit', _this);\n\n      // Preserve data\n      _this.destroy(true);\n\n      // Disable on mobile browsers\n      if (_this.options.disableOnMobile && _this.utils.isMobile()) {\n        _this.disableOnMobile = true;\n        return;\n      }\n\n      // Get classes\n      _this.classes = _this.getClassNames();\n\n      // Create elements\n      var input = $('<input/>', {\n        'class': _this.classes.input,\n        'readonly': _this.utils.isMobile()\n      });\n      var items = $('<div/>', {\n        'class': _this.classes.items,\n        'tabindex': -1\n      });\n      var itemsScroll = $('<div/>', {\n        'class': _this.classes.scroll\n      });\n      var wrapper = $('<div/>', {\n        'class': _this.classes.prefix,\n        'html': _this.options.arrowButtonMarkup\n      });\n      var label = $('<span/>', {\n        'class': 'label'\n      });\n      var outerWrapper = _this.$element.wrap('<div/>').parent().append(wrapper.prepend(label), items, input);\n      var hideSelectWrapper = $('<div/>', {\n        'class': _this.classes.hideselect\n      });\n      _this.elements = {\n        input: input,\n        items: items,\n        itemsScroll: itemsScroll,\n        wrapper: wrapper,\n        label: label,\n        outerWrapper: outerWrapper\n      };\n      if (_this.options.nativeOnMobile && _this.utils.isMobile()) {\n        _this.elements.input = undefined;\n        hideSelectWrapper.addClass(_this.classes.prefix + '-is-native');\n        _this.$element.on('change', function () {\n          _this.refresh();\n        });\n      }\n      _this.$element.on(_this.eventTriggers).wrap(hideSelectWrapper);\n      _this.originalTabindex = _this.$element.prop('tabindex');\n      _this.$element.prop('tabindex', -1);\n      _this.populate();\n      _this.activate();\n      _this.utils.triggerCallback('Init', _this);\n    },\n    /** Activates the plugin */\n    activate: function activate() {\n      var _this = this;\n      var hiddenChildren = _this.elements.items.closest(':visible').children(':hidden').addClass(_this.classes.tempshow);\n      var originalWidth = _this.$element.width();\n      hiddenChildren.removeClass(_this.classes.tempshow);\n      _this.utils.triggerCallback('BeforeActivate', _this);\n      _this.elements.outerWrapper.prop('class', _this.utils.arrayToClassname([_this.classes.wrapper, _this.$element.prop('class').replace(/\\S+/g, _this.classes.prefix + '-$&'), _this.options.responsive ? _this.classes.responsive : '']));\n      if (_this.options.inheritOriginalWidth && originalWidth > 0) {\n        _this.elements.outerWrapper.width(originalWidth);\n      }\n      _this.unbindEvents();\n      if (!_this.$element.prop('disabled')) {\n        _this.state.enabled = true;\n\n        // Not disabled, so... Removing disabled class\n        _this.elements.outerWrapper.removeClass(_this.classes.disabled);\n\n        // Remove styles from items box\n        // Fix incorrect height when refreshed is triggered with fewer options\n        _this.$li = _this.elements.items.removeAttr('style').find('li');\n        _this.bindEvents();\n      } else {\n        _this.elements.outerWrapper.addClass(_this.classes.disabled);\n        if (_this.elements.input) {\n          _this.elements.input.prop('disabled', true);\n        }\n      }\n      _this.utils.triggerCallback('Activate', _this);\n    },\n    /**\r\n     * Generate classNames for elements\r\n     *\r\n     * @return {object} Classes object\r\n     */\n    getClassNames: function getClassNames() {\n      var _this = this;\n      var customClass = _this.options.customClass;\n      var classesObj = {};\n      $.each(classList.split(' '), function (i, currClass) {\n        var c = customClass.prefix + currClass;\n        classesObj[currClass.toLowerCase()] = customClass.camelCase ? c : _this.utils.toDash(c);\n      });\n      classesObj.prefix = customClass.prefix;\n      return classesObj;\n    },\n    /** Set the label text */\n    setLabel: function setLabel() {\n      var _this = this;\n      var labelBuilder = _this.options.labelBuilder;\n      if (_this.state.multiple) {\n        // Make sure currentValues is an array\n        var currentValues = $.isArray(_this.state.currValue) ? _this.state.currValue : [_this.state.currValue];\n        // I'm not happy with this, but currentValues can be an empty\n        // array and we need to fallback to the default option.\n        currentValues = currentValues.length === 0 ? [0] : currentValues;\n        var labelMarkup = $.map(currentValues, function (value) {\n          return $.grep(_this.lookupItems, function (item) {\n            return item.index === value;\n          })[0]; // we don't want nested arrays here\n        });\n        labelMarkup = $.grep(labelMarkup, function (item) {\n          // Hide default (please choose) if more then one element were selected.\n          // If no option value were given value is set to option text by default\n          if (labelMarkup.length > 1 || labelMarkup.length === 0) {\n            return $.trim(item.value) !== '';\n          }\n          return item;\n        });\n        labelMarkup = $.map(labelMarkup, function (item) {\n          return $.isFunction(labelBuilder) ? labelBuilder(item) : _this.utils.format(labelBuilder, item);\n        });\n\n        // Limit the amount of selected values shown in label\n        if (_this.options.multiple.maxLabelEntries) {\n          if (labelMarkup.length >= _this.options.multiple.maxLabelEntries + 1) {\n            labelMarkup = labelMarkup.slice(0, _this.options.multiple.maxLabelEntries);\n            labelMarkup.push($.isFunction(labelBuilder) ? labelBuilder({\n              text: '...'\n            }) : _this.utils.format(labelBuilder, {\n              text: '...'\n            }));\n          } else {\n            labelMarkup.slice(labelMarkup.length - 1);\n          }\n        }\n        _this.elements.label.html(labelMarkup.join(_this.options.multiple.separator));\n      } else {\n        var currItem = _this.lookupItems[_this.state.currValue];\n        _this.elements.label.html($.isFunction(labelBuilder) ? labelBuilder(currItem) : _this.utils.format(labelBuilder, currItem));\n      }\n    },\n    /** Get and save the available options */\n    populate: function populate() {\n      var _this = this;\n      var $options = _this.$element.children();\n      var $justOptions = _this.$element.find('option');\n      var $selected = $justOptions.filter(':selected');\n      var selectedIndex = $justOptions.index($selected);\n      var currIndex = 0;\n      var emptyValue = _this.state.multiple ? [] : 0;\n      if ($selected.length > 1 && _this.state.multiple) {\n        selectedIndex = [];\n        $selected.each(function () {\n          selectedIndex.push($(this).index());\n        });\n      }\n      _this.state.currValue = ~selectedIndex ? selectedIndex : emptyValue;\n      _this.state.selectedIdx = _this.state.currValue;\n      _this.state.highlightedIdx = _this.state.currValue;\n      _this.items = [];\n      _this.lookupItems = [];\n      if ($options.length) {\n        // Build options markup\n        $options.each(function (i) {\n          var $elm = $(this);\n          if ($elm.is('optgroup')) {\n            var optionsGroup = {\n              element: $elm,\n              label: $elm.prop('label'),\n              groupDisabled: $elm.prop('disabled'),\n              items: []\n            };\n            $elm.children().each(function (i) {\n              var $elm = $(this);\n              optionsGroup.items[i] = _this.getItemData(currIndex, $elm, optionsGroup.groupDisabled || $elm.prop('disabled'));\n              _this.lookupItems[currIndex] = optionsGroup.items[i];\n              currIndex++;\n            });\n            _this.items[i] = optionsGroup;\n          } else {\n            _this.items[i] = _this.getItemData(currIndex, $elm, $elm.prop('disabled'));\n            _this.lookupItems[currIndex] = _this.items[i];\n            currIndex++;\n          }\n        });\n        _this.setLabel();\n        _this.elements.items.append(_this.elements.itemsScroll.html(_this.getItemsMarkup(_this.items)));\n      }\n    },\n    /**\r\n     * Generate items object data\r\n     * @param  {integer} index      - Current item index\r\n     * @param  {node}    $elm       - Current element node\r\n     * @param  {boolean} isDisabled - Current element disabled state\r\n     * @return {object}               Item object\r\n     */\n    getItemData: function getItemData(index, $elm, isDisabled) {\n      var _this = this;\n      return {\n        index: index,\n        element: $elm,\n        value: $elm.val(),\n        className: $elm.prop('class'),\n        text: $elm.html(),\n        slug: $.trim(_this.utils.replaceDiacritics($elm.html())),\n        alt: $elm.attr('data-alt'),\n        selected: $elm.prop('selected'),\n        disabled: isDisabled\n      };\n    },\n    /**\r\n     * Generate options markup\r\n     *\r\n     * @param  {object} items - Object containing all available options\r\n     * @return {string}         HTML for the options box\r\n     */\n    getItemsMarkup: function getItemsMarkup(items) {\n      var _this = this;\n      var markup = '<ul>';\n      if ($.isFunction(_this.options.listBuilder) && _this.options.listBuilder) {\n        items = _this.options.listBuilder(items);\n      }\n      $.each(items, function (i, elm) {\n        if (elm.label !== undefined) {\n          markup += _this.utils.format('<ul class=\"{1}\"><li class=\"{2}\">{3}</li>', _this.utils.arrayToClassname([_this.classes.group, elm.groupDisabled ? 'disabled' : '', elm.element.prop('class')]), _this.classes.grouplabel, elm.element.prop('label'));\n          $.each(elm.items, function (i, elm) {\n            markup += _this.getItemMarkup(elm.index, elm);\n          });\n          markup += '</ul>';\n        } else {\n          markup += _this.getItemMarkup(elm.index, elm);\n        }\n      });\n      return markup + '</ul>';\n    },\n    /**\r\n     * Generate every option markup\r\n     *\r\n     * @param  {number} index    - Index of current item\r\n     * @param  {object} itemData - Current item\r\n     * @return {string}            HTML for the option\r\n     */\n    getItemMarkup: function getItemMarkup(index, itemData) {\n      var _this = this;\n      var itemBuilder = _this.options.optionsItemBuilder;\n      // limit access to item data to provide a simple interface\n      // to most relevant options.\n      var filteredItemData = {\n        value: itemData.value,\n        text: itemData.text,\n        slug: itemData.slug,\n        index: itemData.index\n      };\n      return _this.utils.format('<li data-index=\"{1}\" class=\"{2}\">{3}</li>', index, _this.utils.arrayToClassname([itemData.className, index === _this.items.length - 1 ? 'last' : '', itemData.disabled ? 'disabled' : '', itemData.selected ? 'selected' : '']), $.isFunction(itemBuilder) ? _this.utils.format(itemBuilder(itemData, this.$element, index), itemData) : _this.utils.format(itemBuilder, filteredItemData));\n    },\n    /** Remove events on the elements */\n    unbindEvents: function unbindEvents() {\n      var _this = this;\n      _this.elements.wrapper.add(_this.$element).add(_this.elements.outerWrapper).add(_this.elements.input).off(eventNamespaceSuffix);\n    },\n    /** Bind events on the elements */\n    bindEvents: function bindEvents() {\n      var _this = this;\n      _this.elements.outerWrapper.on('mouseenter' + eventNamespaceSuffix + ' mouseleave' + eventNamespaceSuffix, function (e) {\n        $(this).toggleClass(_this.classes.hover, e.type === 'mouseenter');\n\n        // Delay close effect when openOnHover is true\n        if (_this.options.openOnHover) {\n          clearTimeout(_this.closeTimer);\n          if (e.type === 'mouseleave') {\n            _this.closeTimer = setTimeout($.proxy(_this.close, _this), _this.options.hoverIntentTimeout);\n          } else {\n            _this.open();\n          }\n        }\n      });\n\n      // Toggle open/close\n      _this.elements.wrapper.on('click' + eventNamespaceSuffix, function (e) {\n        _this.state.opened ? _this.close() : _this.open(e);\n      });\n\n      // Translate original element focus event to dummy input.\n      // Disabled on mobile devices because the default option list isn't\n      // shown due the fact that hidden input gets focused\n      if (!(_this.options.nativeOnMobile && _this.utils.isMobile())) {\n        _this.$element.on('focus' + eventNamespaceSuffix, function () {\n          _this.elements.input.focus();\n        });\n        _this.elements.input.prop({\n          tabindex: _this.originalTabindex,\n          disabled: false\n        }).on('keydown' + eventNamespaceSuffix, $.proxy(_this.handleKeys, _this)).on('focusin' + eventNamespaceSuffix, function (e) {\n          _this.elements.outerWrapper.addClass(_this.classes.focus);\n\n          // Prevent the flicker when focusing out and back again in the browser window\n          _this.elements.input.one('blur', function () {\n            _this.elements.input.blur();\n          });\n          if (_this.options.openOnFocus && !_this.state.opened) {\n            _this.open(e);\n          }\n        }).on('focusout' + eventNamespaceSuffix, function () {\n          _this.elements.outerWrapper.removeClass(_this.classes.focus);\n        }).on('input propertychange', function () {\n          var val = _this.elements.input.val();\n          var searchRegExp = new RegExp('^' + _this.utils.escapeRegExp(val), 'i');\n\n          // Clear search\n          clearTimeout(_this.resetStr);\n          _this.resetStr = setTimeout(function () {\n            _this.elements.input.val('');\n          }, _this.options.keySearchTimeout);\n          if (val.length) {\n            // Search in select options\n            $.each(_this.items, function (i, elm) {\n              if (elm.disabled) {\n                return;\n              }\n              if (searchRegExp.test(elm.text) || searchRegExp.test(elm.slug)) {\n                _this.highlight(i);\n                return false;\n              }\n              if (!elm.alt) {\n                return;\n              }\n              var altItems = elm.alt.split('|');\n              for (var ai = 0; ai < altItems.length; ai++) {\n                if (!altItems[ai]) {\n                  break;\n                }\n                if (searchRegExp.test(altItems[ai].trim())) {\n                  _this.highlight(i);\n                  return false;\n                }\n              }\n            });\n          }\n        });\n      }\n      _this.$li.on({\n        // Prevent <input> blur on Chrome\n        mousedown: function mousedown(e) {\n          e.preventDefault();\n          e.stopPropagation();\n        },\n        click: function click() {\n          _this.select($(this).data('index'));\n\n          // Chrome doesn't close options box if select is wrapped with a label\n          // We need to 'return false' to avoid that\n          return false;\n        }\n      });\n    },\n    /**\r\n     * Behavior when keyboard keys is pressed\r\n     *\r\n     * @param {object} e - Event object\r\n     */\n    handleKeys: function handleKeys(e) {\n      var _this = this;\n      var key = e.which;\n      var keys = _this.options.keys;\n      var isPrevKey = $.inArray(key, keys.previous) > -1;\n      var isNextKey = $.inArray(key, keys.next) > -1;\n      var isSelectKey = $.inArray(key, keys.select) > -1;\n      var isOpenKey = $.inArray(key, keys.open) > -1;\n      var idx = _this.state.highlightedIdx;\n      var isFirstOrLastItem = isPrevKey && idx === 0 || isNextKey && idx + 1 === _this.items.length;\n      var goToItem = 0;\n\n      // Enter / Space\n      if (key === 13 || key === 32) {\n        e.preventDefault();\n      }\n\n      // If it's a directional key\n      if (isPrevKey || isNextKey) {\n        if (!_this.options.allowWrap && isFirstOrLastItem) {\n          return;\n        }\n        if (isPrevKey) {\n          goToItem = _this.utils.previousEnabledItem(_this.lookupItems, idx);\n        }\n        if (isNextKey) {\n          goToItem = _this.utils.nextEnabledItem(_this.lookupItems, idx);\n        }\n        _this.highlight(goToItem);\n      }\n\n      // Tab / Enter / ESC\n      if (isSelectKey && _this.state.opened) {\n        _this.select(idx);\n        if (!_this.state.multiple || !_this.options.multiple.keepMenuOpen) {\n          _this.close();\n        }\n        return;\n      }\n\n      // Space / Enter / Left / Up / Right / Down\n      if (isOpenKey && !_this.state.opened) {\n        _this.open();\n      }\n    },\n    /** Update the items object */\n    refresh: function refresh() {\n      var _this = this;\n      _this.populate();\n      _this.activate();\n      _this.utils.triggerCallback('Refresh', _this);\n    },\n    /** Set options box width/height */\n    setOptionsDimensions: function setOptionsDimensions() {\n      var _this = this;\n\n      // Calculate options box height\n      // Set a temporary class on the hidden parent of the element\n      var hiddenChildren = _this.elements.items.closest(':visible').children(':hidden').addClass(_this.classes.tempshow);\n      var maxHeight = _this.options.maxHeight;\n      var itemsWidth = _this.elements.items.outerWidth();\n      var wrapperWidth = _this.elements.wrapper.outerWidth() - (itemsWidth - _this.elements.items.width());\n\n      // Set the dimensions, minimum is wrapper width, expand for long items if option is true\n      if (!_this.options.expandToItemText || wrapperWidth > itemsWidth) {\n        _this.finalWidth = wrapperWidth;\n      } else {\n        // Make sure the scrollbar width is included\n        _this.elements.items.css('overflow', 'scroll');\n\n        // Set a really long width for _this.elements.outerWrapper\n        _this.elements.outerWrapper.width(9e4);\n        _this.finalWidth = _this.elements.items.width();\n        // Set scroll bar to auto\n        _this.elements.items.css('overflow', '');\n        _this.elements.outerWrapper.width('');\n      }\n      _this.elements.items.width(_this.finalWidth).height() > maxHeight && _this.elements.items.height(maxHeight);\n\n      // Remove the temporary class\n      hiddenChildren.removeClass(_this.classes.tempshow);\n    },\n    /** Detect if the options box is inside the window */\n    isInViewport: function isInViewport() {\n      var _this = this;\n      if (_this.options.forceRenderAbove === true) {\n        _this.elements.outerWrapper.addClass(_this.classes.above);\n      } else if (_this.options.forceRenderBelow === true) {\n        _this.elements.outerWrapper.addClass(_this.classes.below);\n      } else {\n        var scrollTop = $win.scrollTop();\n        var winHeight = $win.height();\n        var uiPosX = _this.elements.outerWrapper.offset().top;\n        var uiHeight = _this.elements.outerWrapper.outerHeight();\n        var fitsDown = uiPosX + uiHeight + _this.itemsHeight <= scrollTop + winHeight;\n        var fitsAbove = uiPosX - _this.itemsHeight > scrollTop;\n\n        // If it does not fit below, only render it\n        // above it fit's there.\n        // It's acceptable that the user needs to\n        // scroll the viewport to see the cut off UI\n        var renderAbove = !fitsDown && fitsAbove;\n        var renderBelow = !renderAbove;\n        _this.elements.outerWrapper.toggleClass(_this.classes.above, renderAbove);\n        _this.elements.outerWrapper.toggleClass(_this.classes.below, renderBelow);\n      }\n    },\n    /**\r\n     * Detect if currently selected option is visible and scroll the options box to show it\r\n     *\r\n     * @param {Number|Array} index - Index of the selected items\r\n     */\n    detectItemVisibility: function detectItemVisibility(index) {\n      var _this = this;\n      var $filteredLi = _this.$li.filter('[data-index]');\n      if (_this.state.multiple) {\n        // If index is an array, we can assume a multiple select and we\n        // want to scroll to the uppermost selected item!\n        // Math.min.apply(Math, index) returns the lowest entry in an Array.\n        index = $.isArray(index) && index.length === 0 ? 0 : index;\n        index = $.isArray(index) ? Math.min.apply(Math, index) : index;\n      }\n      var liHeight = $filteredLi.eq(index).outerHeight();\n      var liTop = $filteredLi[index].offsetTop;\n      var itemsScrollTop = _this.elements.itemsScroll.scrollTop();\n      var scrollT = liTop + liHeight * 2;\n      _this.elements.itemsScroll.scrollTop(scrollT > itemsScrollTop + _this.itemsHeight ? scrollT - _this.itemsHeight : liTop - liHeight < itemsScrollTop ? liTop - liHeight : itemsScrollTop);\n    },\n    /**\r\n     * Open the select options box\r\n     *\r\n     * @param {Event} e - Event\r\n     */\n    open: function open(e) {\n      var _this = this;\n      if (_this.options.nativeOnMobile && _this.utils.isMobile()) {\n        return false;\n      }\n      _this.utils.triggerCallback('BeforeOpen', _this);\n      if (e) {\n        e.preventDefault();\n        if (_this.options.stopPropagation) {\n          e.stopPropagation();\n        }\n      }\n      if (_this.state.enabled) {\n        _this.setOptionsDimensions();\n\n        // Find any other opened instances of select and close it\n        $('.' + _this.classes.hideselect, '.' + _this.classes.open).children()[pluginName]('close');\n        _this.state.opened = true;\n        _this.itemsHeight = _this.elements.items.outerHeight();\n        _this.itemsInnerHeight = _this.elements.items.height();\n\n        // Toggle options box visibility\n        _this.elements.outerWrapper.addClass(_this.classes.open);\n\n        // Give dummy input focus\n        _this.elements.input.val('');\n        if (e && e.type !== 'focusin') {\n          _this.elements.input.focus();\n        }\n\n        // Delayed binds events on Document to make label clicks work\n        setTimeout(function () {\n          $doc.on('click' + eventNamespaceSuffix, $.proxy(_this.close, _this)).on('scroll' + eventNamespaceSuffix, $.proxy(_this.isInViewport, _this));\n        }, 1);\n        _this.isInViewport();\n\n        // Prevent window scroll when using mouse wheel inside items box\n        if (_this.options.preventWindowScroll) {\n          /* istanbul ignore next */\n          $doc.on('mousewheel' + eventNamespaceSuffix + ' DOMMouseScroll' + eventNamespaceSuffix, '.' + _this.classes.scroll, function (e) {\n            var orgEvent = e.originalEvent;\n            var scrollTop = $(this).scrollTop();\n            var deltaY = 0;\n            if ('detail' in orgEvent) {\n              deltaY = orgEvent.detail * -1;\n            }\n            if ('wheelDelta' in orgEvent) {\n              deltaY = orgEvent.wheelDelta;\n            }\n            if ('wheelDeltaY' in orgEvent) {\n              deltaY = orgEvent.wheelDeltaY;\n            }\n            if ('deltaY' in orgEvent) {\n              deltaY = orgEvent.deltaY * -1;\n            }\n            if (scrollTop === this.scrollHeight - _this.itemsInnerHeight && deltaY < 0 || scrollTop === 0 && deltaY > 0) {\n              e.preventDefault();\n            }\n          });\n        }\n        _this.detectItemVisibility(_this.state.selectedIdx);\n        _this.highlight(_this.state.multiple ? -1 : _this.state.selectedIdx);\n        _this.utils.triggerCallback('Open', _this);\n      }\n    },\n    /** Close the select options box */\n    close: function close() {\n      var _this = this;\n      _this.utils.triggerCallback('BeforeClose', _this);\n\n      // Remove custom events on document\n      $doc.off(eventNamespaceSuffix);\n\n      // Remove visible class to hide options box\n      _this.elements.outerWrapper.removeClass(_this.classes.open);\n      _this.state.opened = false;\n      _this.utils.triggerCallback('Close', _this);\n    },\n    /** Select current option and change the label */\n    change: function change() {\n      var _this = this;\n      _this.utils.triggerCallback('BeforeChange', _this);\n      if (_this.state.multiple) {\n        // Reset old selected\n        $.each(_this.lookupItems, function (idx) {\n          _this.lookupItems[idx].selected = false;\n          _this.$element.find('option').prop('selected', false);\n        });\n\n        // Set new selected\n        $.each(_this.state.selectedIdx, function (idx, value) {\n          _this.lookupItems[value].selected = true;\n          _this.$element.find('option').eq(value).prop('selected', true);\n        });\n        _this.state.currValue = _this.state.selectedIdx;\n        _this.setLabel();\n        _this.utils.triggerCallback('Change', _this);\n      } else if (_this.state.currValue !== _this.state.selectedIdx) {\n        // Apply changed value to original select\n        _this.$element.prop('selectedIndex', _this.state.currValue = _this.state.selectedIdx).data('value', _this.lookupItems[_this.state.selectedIdx].text);\n\n        // Change label text\n        _this.setLabel();\n        _this.utils.triggerCallback('Change', _this);\n      }\n    },\n    /**\r\n     * Highlight option\r\n     * @param {number} index - Index of the options that will be highlighted\r\n     */\n    highlight: function highlight(index) {\n      var _this = this;\n      var $filteredLi = _this.$li.filter('[data-index]').removeClass('highlighted');\n      _this.utils.triggerCallback('BeforeHighlight', _this);\n\n      // Parameter index is required and should not be a disabled item\n      if (index === undefined || index === -1 || _this.lookupItems[index].disabled) {\n        return;\n      }\n      $filteredLi.eq(_this.state.highlightedIdx = index).addClass('highlighted');\n      _this.detectItemVisibility(index);\n      _this.utils.triggerCallback('Highlight', _this);\n    },\n    /**\r\n     * Select option\r\n     *\r\n     * @param {number} index - Index of the option that will be selected\r\n     */\n    select: function select(index) {\n      var _this = this;\n      var $filteredLi = _this.$li.filter('[data-index]');\n      _this.utils.triggerCallback('BeforeSelect', _this, index);\n\n      // Parameter index is required and should not be a disabled item\n      if (index === undefined || index === -1 || _this.lookupItems[index].disabled) {\n        return;\n      }\n      if (_this.state.multiple) {\n        // Make sure selectedIdx is an array\n        _this.state.selectedIdx = $.isArray(_this.state.selectedIdx) ? _this.state.selectedIdx : [_this.state.selectedIdx];\n        var hasSelectedIndex = $.inArray(index, _this.state.selectedIdx);\n        if (hasSelectedIndex !== -1) {\n          _this.state.selectedIdx.splice(hasSelectedIndex, 1);\n        } else {\n          _this.state.selectedIdx.push(index);\n        }\n        $filteredLi.removeClass('selected').filter(function (index) {\n          return $.inArray(index, _this.state.selectedIdx) !== -1;\n        }).addClass('selected');\n      } else {\n        $filteredLi.removeClass('selected').eq(_this.state.selectedIdx = index).addClass('selected');\n      }\n      if (!_this.state.multiple || !_this.options.multiple.keepMenuOpen) {\n        _this.close();\n      }\n      _this.change();\n      _this.utils.triggerCallback('Select', _this, index);\n    },\n    /**\r\n     * Unbind and remove\r\n     *\r\n     * @param {boolean} preserveData - Check if the data on the element should be removed too\r\n     */\n    destroy: function destroy(preserveData) {\n      var _this = this;\n      if (_this.state && _this.state.enabled) {\n        _this.elements.items.add(_this.elements.wrapper).add(_this.elements.input).remove();\n        if (!preserveData) {\n          _this.$element.removeData(pluginName).removeData('value');\n        }\n        _this.$element.prop('tabindex', _this.originalTabindex).off(eventNamespaceSuffix).off(_this.eventTriggers).unwrap().unwrap();\n        _this.state.enabled = false;\n      }\n    }\n  };\n\n  // A really lightweight plugin wrapper around the constructor,\n  // preventing against multiple instantiations\n  $.fn[pluginName] = function (args) {\n    return this.each(function () {\n      var data = $.data(this, pluginName);\n      if (data && !data.disableOnMobile) {\n        typeof args === 'string' && data[args] ? data[args]() : data.init(args);\n      } else {\n        $.data(this, pluginName, new Selectric(this, args));\n      }\n    });\n  };\n\n  /**\r\n   * Default plugin options\r\n   *\r\n   * @type {object}\r\n   */\n  $.fn[pluginName].defaults = {\n    onChange: function onChange(elm) {\n      $(elm).change();\n    },\n    maxHeight: 300,\n    keySearchTimeout: 500,\n    arrowButtonMarkup: '<b class=\"button\">&#x25be;</b>',\n    disableOnMobile: true,\n    nativeOnMobile: true,\n    openOnFocus: true,\n    openOnHover: false,\n    hoverIntentTimeout: 500,\n    expandToItemText: false,\n    responsive: false,\n    preventWindowScroll: true,\n    inheritOriginalWidth: false,\n    allowWrap: true,\n    forceRenderAbove: false,\n    forceRenderBelow: false,\n    stopPropagation: true,\n    optionsItemBuilder: '{text}',\n    // function(itemData, element, index)\n    labelBuilder: '{text}',\n    // function(currItem)\n    listBuilder: false,\n    // function(items)\n    keys: {\n      previous: [37, 38],\n      // Left / Up\n      next: [39, 40],\n      // Right / Down\n      select: [9, 13, 27],\n      // Tab / Enter / Escape\n      open: [13, 32, 37, 38, 39, 40],\n      // Enter / Space / Left / Up / Right / Down\n      close: [9, 27] // Tab / Escape\n    },\n    customClass: {\n      prefix: pluginName,\n      camelCase: false\n    },\n    multiple: {\n      separator: ', ',\n      keepMenuOpen: true,\n      maxLabelEntries: false\n    }\n  };\n});"],"names":["factory","__cw__define","amd","module","exports","root","jQuery","undefined","window","require","$","Selectric","element","opts","_this","this","$element","state","multiple","attr","enabled","opened","currValue","selectedIdx","highlightedIdx","eventTriggers","open","close","destroy","refresh","init","$doc","document","$win","pluginName","eventNamespaceSuffix","chars","diacritics","prototype","utils","isMobile","test","navigator","userAgent","escapeRegExp","str","replace","replaceDiacritics","k","length","toLowerCase","format","f","a","arguments","s","i","p","nextEnabledItem","selectItems","selected","disabled","previousEnabledItem","toDash","triggerCallback","fn","scope","elm","func","options","args","concat","slice","call","isFunction","apply","trigger","arrayToClassname","arr","newArr","grep","item","trim","join","items","itemsScroll","wrapper","label","outerWrapper","hideSelectWrapper","extend","defaults","disableOnMobile","classes","getClassNames","input","class","readonly","tabindex","scroll","prefix","html","arrowButtonMarkup","wrap","parent","append","prepend","hideselect","elements","nativeOnMobile","addClass","on","originalTabindex","prop","populate","activate","hiddenChildren","closest","children","tempshow","originalWidth","width","removeClass","responsive","inheritOriginalWidth","unbindEvents","$li","removeAttr","find","bindEvents","customClass","classesObj","each","split","currClass","c","camelCase","setLabel","labelMarkup","currItem","labelBuilder","currentValues","isArray","map","value","lookupItems","index","maxLabelEntries","push","text","separator","$options","$justOptions","$selected","filter","selectedIndex","currIndex","emptyValue","optionsGroup","$elm","is","groupDisabled","getItemData","getItemsMarkup","isDisabled","val","className","slug","alt","markup","listBuilder","group","grouplabel","getItemMarkup","itemData","itemBuilder","optionsItemBuilder","filteredItemData","add","off","e","toggleClass","hover","type","openOnHover","clearTimeout","closeTimer","setTimeout","proxy","hoverIntentTimeout","focus","handleKeys","one","blur","openOnFocus","searchRegExp","RegExp","resetStr","keySearchTimeout","highlight","altItems","ai","mousedown","preventDefault","stopPropagation","click","select","data","key","which","keys","isPrevKey","inArray","previous","isNextKey","next","isSelectKey","isOpenKey","idx","isFirstOrLastItem","goToItem","allowWrap","keepMenuOpen","setOptionsDimensions","maxHeight","itemsWidth","outerWidth","wrapperWidth","expandToItemText","finalWidth","css","height","isInViewport","fitsAbove","renderAbove","renderBelow","forceRenderAbove","above","forceRenderBelow","below","scrollTop","winHeight","fitsDown","uiPosX","offset","top","outerHeight","itemsHeight","detectItemVisibility","$filteredLi","liHeight","Math","min","eq","liTop","offsetTop","itemsScrollTop","scrollT","itemsInnerHeight","preventWindowScroll","orgEvent","originalEvent","deltaY","detail","wheelDelta","wheelDeltaY","scrollHeight","change","hasSelectedIndex","splice","preserveData","remove","removeData","unwrap","onChange"],"mappings":"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"}