{"version":3,"file":"selectize.mjs","sources":["../../src/contrib/microevent.js","../../src/contrib/highlight.js","../../src/defaults.js","../../src/consts.js","../../src/utils.js","../../src/selectize.js","../../src/index.js"],"sourcesContent":["/**\n * MicroEvent - to make any js object an event emitter\n *\n * - pure javascript - server compatible, browser compatible\n * - dont rely on the browser doms\n * - super simple - you get it immediatly, no mistery, no magic involved\n *\n * @author Jerome Etienne (https://github.com/jeromeetienne)\n */\n\nexport default function MicroEvent() {}\n\nMicroEvent.prototype = {\n\ton: function(event, fct){\n\t\tthis._events = this._events || {};\n\t\tthis._events[event] = this._events[event] || [];\n\t\tthis._events[event].push(fct);\n\t},\n\toff: function(event, fct){\n\t\tvar n = arguments.length;\n\t\tif (n === 0) return delete this._events;\n\t\tif (n === 1) return delete this._events[event];\n\n\t\tthis._events = this._events || {};\n\t\tif (event in this._events === false) return;\n\t\tthis._events[event].splice(this._events[event].indexOf(fct), 1);\n\t},\n\ttrigger: function(event /* , args... */){\n\t\tthis._events = this._events || {};\n\t\tif (event in this._events === false) return;\n\t\tfor (var i = 0; i < this._events[event].length; i++){\n\t\t\tthis._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t}\n\t}\n};\n\n/**\n * Mixin will delegate all MicroEvent.js function in the destination object.\n *\n * - MicroEvent.mixin(Foobar) will make Foobar able to use MicroEvent\n *\n * @param {object} the object which will support MicroEvent\n */\nMicroEvent.mixin = function(destObject){\n\tvar props = ['on', 'off', 'trigger'];\n\tfor (var i = 0; i < props.length; i++){\n\t\tdestObject.prototype[props[i]] = MicroEvent.prototype[props[i]];\n\t}\n};\n","/**\n * highlight v3 | MIT license | Johann Burkard <jb@eaio.com>\n * Highlights arbitrary terms in a node.\n *\n * - Modified by Marshal <beatgates@gmail.com> 2011-6-24 (added regex)\n * - Modified by Brian Reavis <brian@thirdroute.com> 2012-8-27 (cleanup)\n */\n\nexport default function highlight($element, pattern) {\n\tif (typeof pattern === 'string' && !pattern.length) return;\n\tvar regex = (typeof pattern === 'string') ? new RegExp(pattern, 'i') : pattern;\n\n\tvar highlight = function(node) {\n\t\tvar skip = 0;\n\t\tif (node.nodeType === 3) {\n\t\t\tvar pos = node.data.search(regex);\n\t\t\tif (pos >= 0 && node.data.length > 0) {\n\t\t\t\t// var match = node.data.match(regex);\n\t\t\t\tvar spannode = document.createElement('span');\n\t\t\t\tspannode.className = 'highlight';\n\t\t\t\tvar middlebit = node.splitText(pos);\n\t\t\t\t// var endbit = middlebit.splitText(match[0].length);\n\t\t\t\tvar middleclone = middlebit.cloneNode(true);\n\t\t\t\tspannode.appendChild(middleclone);\n\t\t\t\tmiddlebit.parentNode.replaceChild(spannode, middlebit);\n\t\t\t\tskip = 1;\n\t\t\t}\n\t\t} else if (node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {\n\t\t\tfor (var i = 0; i < node.childNodes.length; ++i) {\n\t\t\t\ti += highlight(node.childNodes[i]);\n\t\t\t}\n\t\t}\n\t\treturn skip;\n\t};\n\n\treturn $element.each(function() {\n\t\thighlight(this);\n\t});\n}\n\n/**\n * removeHighlight fn copied from highlight v5 and\n * edited to remove with() and pass js strict mode\n */\nexport function init() {\n    $.fn.removeHighlight = function() {\n        return this.find('span.highlight').each(function() {\n            // this.parentNode.firstChild.nodeName;\n            var parent = this.parentNode;\n            parent.replaceChild(this.firstChild, this);\n            parent.normalize();\n        }).end();\n    };\n}\n","export default {\n\toptions: [],\n\toptgroups: [],\n\n\tplugins: [],\n\tdelimiter: ',',\n\tsplitOn: null, // regexp or string for splitting up values from a paste command\n\tpersist: true,\n\tdiacritics: true,\n\tcreate: false,\n\tcreateOnBlur: false,\n\tcreateFilter: null,\n\thighlight: true,\n\topenOnFocus: true,\n\tmaxOptions: 1000,\n\tmaxItems: null,\n\thideSelected: null,\n\taddPrecedence: false,\n\tselectOnTab: false,\n\tpreload: false,\n\tallowEmptyOption: false,\n\tcloseAfterSelect: false,\n\n\tscrollDuration: 60,\n\tloadThrottle: 300,\n\tloadingClass: 'loading',\n\n\tdataAttr: 'data-data',\n\toptgroupField: 'optgroup',\n\tvalueField: 'value',\n\tlabelField: 'text',\n\toptgroupLabelField: 'label',\n\toptgroupValueField: 'value',\n\tlockOptgroupOrder: false,\n\n\tsortField: '$order',\n\tsearchField: ['text'],\n\tsearchConjunction: 'and',\n\n\tmode: null,\n\twrapperClass: 'selectize-control',\n\tinputClass: 'selectize-input',\n\tdropdownClass: 'selectize-dropdown',\n\tdropdownContentClass: 'selectize-dropdown-content',\n\n\tdropdownParent: null,\n\n\tcopyClassesToDropdown: true,\n\n\t/*\n\tload                 : null, // function(query, callback) { ... }\n\tscore                : null, // function(search) { ... }\n\tonInitialize         : null, // function() { ... }\n\tonChange             : null, // function(value) { ... }\n\tonItemAdd            : null, // function(value, $item) { ... }\n\tonItemRemove         : null, // function(value) { ... }\n\tonClear              : null, // function() { ... }\n\tonOptionAdd          : null, // function(value, data) { ... }\n\tonOptionRemove       : null, // function(value) { ... }\n\tonOptionClear        : null, // function() { ... }\n\tonOptionGroupAdd     : null, // function(id, data) { ... }\n\tonOptionGroupRemove  : null, // function(id) { ... }\n\tonOptionGroupClear   : null, // function() { ... }\n\tonDropdownOpen       : null, // function($dropdown) { ... }\n\tonDropdownClose      : null, // function($dropdown) { ... }\n\tonType               : null, // function(str) { ... }\n\tonDelete             : null, // function(values) { ... }\n\t*/\n\n\trender: {\n\t\t/*\n\t\titem: null,\n\t\toptgroup: null,\n\t\toptgroup_header: null,\n\t\toption: null,\n\t\toption_create: null\n\t\t*/\n\t}\n}\n","export var IS_MAC        = /Mac/.test(navigator.userAgent);\n\nexport var KEY_A         = 65;\nexport var KEY_COMMA     = 188;\nexport var KEY_RETURN    = 13;\nexport var KEY_ESC       = 27;\nexport var KEY_LEFT      = 37;\nexport var KEY_UP        = 38;\nexport var KEY_P         = 80;\nexport var KEY_RIGHT     = 39;\nexport var KEY_DOWN      = 40;\nexport var KEY_N         = 78;\nexport var KEY_BACKSPACE = 8;\nexport var KEY_DELETE    = 46;\nexport var KEY_SHIFT     = 16;\nexport var KEY_CMD       = IS_MAC ? 91 : 17;\nexport var KEY_CTRL      = IS_MAC ? 18 : 17;\nexport var KEY_TAB       = 9;\n\nexport var TAG_SELECT    = 1;\nexport var TAG_INPUT     = 2;\n\n// for now, android support in general is too spotty to support validity\nexport var SUPPORTS_VALIDITY_API = !/android/i.test(window.navigator.userAgent) && !!document.createElement('input').validity;\n","import {KEY_BACKSPACE, KEY_DELETE} from './consts'\n\n/**\n * Determines if the provided value has been defined.\n *\n * @param {mixed} object\n * @returns {boolean}\n */\nexport function isSet(object) {\n\treturn typeof object !== 'undefined';\n}\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n * @param {string} value\n * @returns {string|null}\n */\nexport function hashKey(value) {\n\tif (typeof value === 'undefined' || value === null) return null;\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n}\n\n/**\n * Escapes a string for use within HTML.\n *\n * @param {string} str\n * @returns {string}\n */\nexport function escapeHtml(str) {\n\treturn (str + '')\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;');\n}\n\n/**\n * Escapes \"$\" characters in replacement strings.\n *\n * @param {string} str\n * @returns {string}\n */\nexport function escapeReplace(str) {\n\treturn (str + '').replace(/\\$/g, '$$$$');\n}\n\nexport var hook = {};\n\n/**\n * Wraps `method` on `self` so that `fn`\n * is invoked before the original method.\n *\n * @param {object} self\n * @param {string} method\n * @param {function} fn\n */\nhook.before = function(self, method, fn) {\n\tvar original = self[method];\n\tself[method] = function() {\n\t\tfn.apply(self, arguments);\n\t\treturn original.apply(self, arguments);\n\t};\n};\n\n/**\n * Wraps `method` on `self` so that `fn`\n * is invoked after the original method.\n *\n * @param {object} self\n * @param {string} method\n * @param {function} fn\n */\nhook.after = function(self, method, fn) {\n\tvar original = self[method];\n\tself[method] = function() {\n\t\tvar result = original.apply(self, arguments);\n\t\tfn.apply(self, arguments);\n\t\treturn result;\n\t};\n};\n\n/**\n * Wraps `fn` so that it can only be invoked once.\n *\n * @param {function} fn\n * @returns {function}\n */\nexport function once(fn) {\n\tvar called = false;\n\treturn function() {\n\t\tif (called) return;\n\t\tcalled = true;\n\t\tfn.apply(this, arguments);\n\t};\n}\n\n/**\n * Wraps `fn` so that it can only be called once\n * every `delay` milliseconds (invoked on the falling edge).\n *\n * @param {function} fn\n * @param {int} delay\n * @returns {function}\n */\nexport function debounce(fn, delay) {\n\tvar timeout;\n\treturn function() {\n\t\tvar self = this;\n\t\tvar args = arguments;\n\t\twindow.clearTimeout(timeout);\n\t\ttimeout = window.setTimeout(function() {\n\t\t\tfn.apply(self, args);\n\t\t}, delay);\n\t};\n}\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n * @param {object} self\n * @param {array} types\n * @param {function} fn\n */\nexport function debounceEvents(self, types, fn) {\n\tvar type;\n\tvar trigger = self.trigger;\n\tvar eventArgs = {};\n\n\t// override trigger method\n\tself.trigger = function() {\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\teventArgs[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor (type in eventArgs) {\n\t\tif (eventArgs.hasOwnProperty(type)) {\n\t\t\ttrigger.apply(self, eventArgs[type]);\n\t\t}\n\t}\n}\n\n/**\n * A workaround for http://bugs.jquery.com/ticket/6696\n *\n * @param {object} $parent - Parent element to listen on.\n * @param {string} event - Event name.\n * @param {string} selector - Descendant selector to filter by.\n * @param {function} fn - Event handler.\n */\nexport function watchChildEvent($parent, event, selector, fn) {\n\t$parent.on(event, selector, function(e) {\n\t\tvar child = e.target;\n\t\twhile (child && child.parentNode !== $parent[0]) {\n\t\t\tchild = child.parentNode;\n\t\t}\n\t\te.currentTarget = child;\n\t\treturn fn.apply(this, [e]);\n\t});\n}\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n * @param {object} input\n * @returns {object}\n */\nexport function getSelection(input) {\n\tvar result = {};\n\tif ('selectionStart' in input) {\n\t\tresult.start = input.selectionStart;\n\t\tresult.length = input.selectionEnd - result.start;\n\t} else if (document.selection) {\n\t\tinput.focus();\n\t\tvar sel = document.selection.createRange();\n\t\tvar selLen = document.selection.createRange().text.length;\n\t\tsel.moveStart('character', -input.value.length);\n\t\tresult.start = sel.text.length - selLen;\n\t\tresult.length = selLen;\n\t}\n\treturn result;\n}\n\n/**\n * Copies CSS properties from one element to another.\n *\n * @param {object} $from\n * @param {object} $to\n * @param {array} properties\n */\nexport function transferStyles($from, $to, properties) {\n\tvar i, n, styles = {};\n\tif (properties) {\n\t\tfor (i = 0, n = properties.length; i < n; i++) {\n\t\t\tstyles[properties[i]] = $from.css(properties[i]);\n\t\t}\n\t} else {\n\t\tstyles = $from.css();\n\t}\n\t$to.css(styles);\n}\n\n/**\n * Measures the width of a string within a\n * parent element (in pixels).\n *\n * @param {string} str\n * @param {object} $parent\n * @returns {int}\n */\nexport function measureString(str, $parent) {\n\tif (!str) {\n\t\treturn 0;\n\t}\n\n\tvar $test = $('<test>').css({\n\t\tposition: 'absolute',\n\t\ttop: -99999,\n\t\tleft: -99999,\n\t\twidth: 'auto',\n\t\tpadding: 0,\n\t\twhiteSpace: 'pre'\n\t}).text(str).appendTo('body');\n\n\ttransferStyles($parent, $test, [\n\t\t'letterSpacing',\n\t\t'fontSize',\n\t\t'fontFamily',\n\t\t'fontWeight',\n\t\t'textTransform'\n\t]);\n\n\tvar width = $test.width();\n\t$test.remove();\n\n\treturn width;\n}\n\n/**\n * Sets up an input to grow horizontally as the user\n * types. If the value is changed manually, you can\n * trigger the \"update\" handler to resize:\n *\n * $input.trigger('update');\n *\n * @param {object} $input\n */\nexport function autoGrow($input) {\n\tvar currentWidth = null;\n\n\tvar update = function(e, options) {\n\t\tvar value, keyCode, printable, placeholder, width;\n\t\tvar shift, character, selection;\n\t\te = e || window.event || {};\n\t\toptions = options || {};\n\n\t\tif (e.metaKey || e.altKey) return;\n\t\tif (!options.force && $input.data('grow') === false) return;\n\n\t\tvalue = $input.val();\n\t\tif (e.type && e.type.toLowerCase() === 'keydown') {\n\t\t\tkeyCode = e.keyCode;\n\t\t\tprintable = (\n\t\t\t\t(keyCode >= 97 && keyCode <= 122) || // a-z\n\t\t\t\t(keyCode >= 65 && keyCode <= 90)  || // A-Z\n\t\t\t\t(keyCode >= 48 && keyCode <= 57)  || // 0-9\n\t\t\t\tkeyCode === 32 // space\n\t\t\t);\n\n\t\t\tif (keyCode === KEY_DELETE || keyCode === KEY_BACKSPACE) {\n\t\t\t\tselection = getSelection($input[0]);\n\t\t\t\tif (selection.length) {\n\t\t\t\t\tvalue = value.substring(0, selection.start) + value.substring(selection.start + selection.length);\n\t\t\t\t} else if (keyCode === KEY_BACKSPACE && selection.start) {\n\t\t\t\t\tvalue = value.substring(0, selection.start - 1) + value.substring(selection.start + 1);\n\t\t\t\t} else if (keyCode === KEY_DELETE && typeof selection.start !== 'undefined') {\n\t\t\t\t\tvalue = value.substring(0, selection.start) + value.substring(selection.start + 1);\n\t\t\t\t}\n\t\t\t} else if (printable) {\n\t\t\t\tshift = e.shiftKey;\n\t\t\t\tcharacter = String.fromCharCode(e.keyCode);\n\t\t\t\tif (shift) character = character.toUpperCase();\n\t\t\t\telse character = character.toLowerCase();\n\t\t\t\tvalue += character;\n\t\t\t}\n\t\t}\n\n\t\tplaceholder = $input.attr('placeholder');\n\t\tif (!value && placeholder) {\n\t\t\tvalue = placeholder;\n\t\t}\n\n\t\twidth = measureString(value, $input) + 4;\n\t\tif (width !== currentWidth) {\n\t\t\tcurrentWidth = width;\n\t\t\t$input.width(width);\n\t\t\t$input.triggerHandler('resize');\n\t\t}\n\t};\n\n\t$input.on('keydown keyup update blur', update);\n\tupdate();\n}\n\nexport function domToString(d) {\n\tvar tmp = document.createElement('div');\n\n\ttmp.appendChild(d.cloneNode(true));\n\n\treturn tmp.innerHTML;\n}\n\nexport function logError(message, options){\n\tif(!options) options = {};\n\tvar component = 'Selectize';\n\n\tconsole.error(component + ': ' + message)\n\n\tif(options.explanation){\n\t\t// console.group is undefined in <IE11\n\t\tif(console.group) console.group();\n\t\tconsole.error(options.explanation);\n\t\tif(console.group) console.groupEnd();\n\t}\n}\n","import Sifter      from 'es-sifter'\nimport MicroPlugin from 'es-microplugin'\n\nimport MicroEvent from './contrib/microevent'\nimport highlight  from './contrib/highlight'\nimport { init as highlightInit }  from './contrib/highlight'\nimport defaults   from './defaults'\n\nimport {\n    IS_MAC,\n\n    KEY_A, KEY_RETURN, KEY_ESC, KEY_LEFT, KEY_UP, KEY_P, KEY_RIGHT, KEY_DOWN,\n    KEY_N, KEY_BACKSPACE, KEY_DELETE, KEY_SHIFT, KEY_CMD, KEY_CTRL, KEY_TAB,\n\n    TAG_SELECT, TAG_INPUT,\n    SUPPORTS_VALIDITY_API\n} from './consts'\n\nimport {\n    autoGrow, debounce, debounceEvents, domToString, escapeHtml, getSelection,\n    hashKey, isSet, once, watchChildEvent\n} from './utils'\n\n\nvar inited = false\n\nexport default function Selectize($input, settings) {\n    if (!inited) {\n      init()\n      inited = true\n    }\n\n\tvar i, n, dir, input, self = this;\n\tinput = $input[0];\n\tinput.selectize = self;\n\n\t// detect rtl environment\n\tvar computedStyle = window.getComputedStyle && window.getComputedStyle(input, null);\n\tdir = computedStyle ? computedStyle.getPropertyValue('direction') : input.currentStyle && input.currentStyle.direction;\n\tdir = dir || $input.parents('[dir]:first').attr('dir') || '';\n\n\t// setup default state\n\t$.extend(self, {\n\t\torder            : 0,\n\t\tsettings         : settings,\n\t\t$input           : $input,\n\t\ttabIndex         : $input.attr('tabindex') || '',\n\t\ttagType          : input.tagName.toLowerCase() === 'select' ? TAG_SELECT : TAG_INPUT,\n\t\trtl              : /rtl/i.test(dir),\n\n\t\teventNS          : '.selectize' + (++Selectize.count),\n\t\thighlightedValue : null,\n\t\tisOpen           : false,\n\t\tisDisabled       : false,\n\t\tisRequired       : $input.is('[required]'),\n\t\tisInvalid        : false,\n\t\tisLocked         : false,\n\t\tisFocused        : false,\n\t\tisInputHidden    : false,\n\t\tisSetup          : false,\n\t\tisShiftDown      : false,\n\t\tisCmdDown        : false,\n\t\tisCtrlDown       : false,\n\t\tignoreFocus      : false,\n\t\tignoreBlur       : false,\n\t\tignoreHover      : false,\n\t\thasOptions       : false,\n\t\tcurrentResults   : null,\n\t\tlastValue        : '',\n\t\tcaretPos         : 0,\n\t\tloading          : 0,\n\t\tloadedSearches   : {},\n\n\t\t$activeOption    : null,\n\t\t$activeItems     : [],\n\n\t\toptgroups        : {},\n\t\toptions          : {},\n\t\tuserOptions      : {},\n\t\titems            : [],\n\t\trenderCache      : {},\n\t\tonSearchChange   : settings.loadThrottle === null ? self.onSearchChange : debounce(self.onSearchChange, settings.loadThrottle)\n\t});\n\n\t// search system\n\tself.sifter = new Sifter(this.options, {diacritics: settings.diacritics});\n\n\t// build options table\n\tif (self.settings.options) {\n\t\tfor (i = 0, n = self.settings.options.length; i < n; i++) {\n\t\t\tself.registerOption(self.settings.options[i]);\n\t\t}\n\t\tdelete self.settings.options;\n\t}\n\n\t// build optgroup table\n\tif (self.settings.optgroups) {\n\t\tfor (i = 0, n = self.settings.optgroups.length; i < n; i++) {\n\t\t\tself.registerOptionGroup(self.settings.optgroups[i]);\n\t\t}\n\t\tdelete self.settings.optgroups;\n\t}\n\n\t// option-dependent defaults\n\tself.settings.mode = self.settings.mode || (self.settings.maxItems === 1 ? 'single' : 'multi');\n\tif (typeof self.settings.hideSelected !== 'boolean') {\n\t\tself.settings.hideSelected = self.settings.mode === 'multi';\n\t}\n\n\tself.initializePlugins(self.settings.plugins);\n\tself.setupCallbacks();\n\tself.setupTemplates();\n\tself.setup();\n}\n\nfunction init() {\n    // initialize highlight\n    highlightInit()\n\n    // defaults\n    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n    Selectize.defaults = defaults\n    Selectize.count    = 0\n\n    // mixins\n    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n    MicroEvent.mixin(Selectize);\n    MicroPlugin.mixin(Selectize);\n\n    // methods\n    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n    $.extend(Selectize.prototype, {\n\n        /**\n         * Creates all elements and sets up event bindings.\n         */\n        setup: function() {\n            var self      = this;\n            var settings  = self.settings;\n            var eventNS   = self.eventNS;\n            var $window   = $(window);\n            var $document = $(document);\n            var $input    = self.$input;\n\n            var $wrapper;\n            var $control;\n            var $controlInput;\n            var $dropdown;\n            var $dropdownContent;\n            var $dropdownParent;\n            var inputMode;\n            var classes;\n            var classesPlugins;\n            var inputId;\n\n            inputMode         = self.settings.mode;\n            classes           = $input.attr('class') || '';\n\n            $wrapper          = $('<div>').addClass(settings.wrapperClass).addClass(classes).addClass(inputMode);\n            $control          = $('<div>').addClass(settings.inputClass).addClass('items').appendTo($wrapper);\n            $controlInput    = $('<input type=\"text\" autocomplete=\"off\" />').appendTo($control).attr('tabindex', $input.is(':disabled') ? '-1' : self.tabIndex);\n            $dropdownParent  = $(settings.dropdownParent || $wrapper);\n            $dropdown         = $('<div>').addClass(settings.dropdownClass).addClass(inputMode).hide().appendTo($dropdownParent);\n            $dropdownContent = $('<div>').addClass(settings.dropdownContentClass).appendTo($dropdown);\n\n            if(inputId = $input.attr('id')) {\n                $controlInput.attr('id', inputId + '-selectized');\n                $('label[for=\"'+inputId+'\"]').attr('for', inputId + '-selectized');\n            }\n\n            if(self.settings.copyClassesToDropdown) {\n                $dropdown.addClass(classes);\n            }\n\n            $wrapper.css({\n                width: $input[0].style.width\n            });\n\n            if (self.plugins.names.length) {\n                classesPlugins = 'plugin-' + self.plugins.names.join(' plugin-');\n                $wrapper.addClass(classesPlugins);\n                $dropdown.addClass(classesPlugins);\n            }\n\n            if ((settings.maxItems === null || settings.maxItems > 1) && self.tagType === TAG_SELECT) {\n                $input.attr('multiple', 'multiple');\n            }\n\n            if (self.settings.placeholder) {\n                $controlInput.attr('placeholder', settings.placeholder);\n            }\n\n            // if splitOn was not passed in, construct it from the delimiter to allow pasting universally\n            if (!self.settings.splitOn && self.settings.delimiter) {\n                var delimiterEscaped = self.settings.delimiter.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n                self.settings.splitOn = new RegExp('\\\\s*' + delimiterEscaped + '+\\\\s*');\n            }\n\n            if ($input.attr('autocorrect')) {\n                $controlInput.attr('autocorrect', $input.attr('autocorrect'));\n            }\n\n            if ($input.attr('autocapitalize')) {\n                $controlInput.attr('autocapitalize', $input.attr('autocapitalize'));\n            }\n\n            self.$wrapper          = $wrapper;\n            self.$control          = $control;\n            self.$controlInput    = $controlInput;\n            self.$dropdown         = $dropdown;\n            self.$dropdownContent = $dropdownContent;\n\n            $dropdown.on('mouseenter', '[data-selectable]', function() { return self.onOptionHover.apply(self, arguments); });\n            $dropdown.on('mousedown click', '[data-selectable]', function() { return self.onOptionSelect.apply(self, arguments); });\n            watchChildEvent($control, 'mousedown', '*:not(input)', function() { return self.onItemSelect.apply(self, arguments); });\n            autoGrow($controlInput);\n\n            $control.on({\n                mousedown : function() { return self.onMouseDown.apply(self, arguments); },\n                click     : function() { return self.onClick.apply(self, arguments); }\n            });\n\n            $controlInput.on({\n                mousedown : function(e) { e.stopPropagation(); },\n                keydown   : function() { return self.onKeyDown.apply(self, arguments); },\n                keyup     : function() { return self.onKeyUp.apply(self, arguments); },\n                keypress  : function() { return self.onKeyPress.apply(self, arguments); },\n                resize    : function() { self.positionDropdown.apply(self, []); },\n                blur      : function() { return self.onBlur.apply(self, arguments); },\n                focus     : function() { self.ignoreBlur = false; return self.onFocus.apply(self, arguments); },\n                paste     : function() { return self.onPaste.apply(self, arguments); }\n            });\n\n            $document.on('keydown' + eventNS, function(e) {\n                self.isCmdDown = e[IS_MAC ? 'metaKey' : 'ctrlKey'];\n                self.isCtrlDown = e[IS_MAC ? 'altKey' : 'ctrlKey'];\n                self.isShiftDown = e.shiftKey;\n            });\n\n            $document.on('keyup' + eventNS, function(e) {\n                if (e.keyCode === KEY_CTRL) self.isCtrlDown = false;\n                if (e.keyCode === KEY_SHIFT) self.isShiftDown = false;\n                if (e.keyCode === KEY_CMD) self.isCmdDown = false;\n            });\n\n            $document.on('mousedown' + eventNS, function(e) {\n                if (self.isFocused) {\n                    // prevent events on the dropdown scrollbar from causing the control to blur\n                    if (e.target === self.$dropdown[0] || e.target.parentNode === self.$dropdown[0]) {\n                        return false;\n                    }\n                    // blur on click outside\n                    if (!self.$control.has(e.target).length && e.target !== self.$control[0]) {\n                        self.blur(e.target);\n                    }\n                }\n            });\n\n            $window.on(['scroll' + eventNS, 'resize' + eventNS].join(' '), function() {\n                if (self.isOpen) {\n                    self.positionDropdown.apply(self, arguments);\n                }\n            });\n            $window.on('mousemove' + eventNS, function() {\n                self.ignoreHover = false;\n            });\n\n            // store original children and tab index so that they can be\n            // restored when the destroy() method is called.\n            this.revertSettings = {\n                $children : $input.children().detach(),\n                tabindex  : $input.attr('tabindex')\n            };\n\n            $input.attr('tabindex', -1).hide().after(self.$wrapper);\n\n            if ($.isArray(settings.items)) {\n                self.setValue(settings.items);\n                delete settings.items;\n            }\n\n            // feature detect for the validation API\n            if (SUPPORTS_VALIDITY_API) {\n                $input.on('invalid' + eventNS, function(e) {\n                    e.preventDefault();\n                    self.isInvalid = true;\n                    self.refreshState();\n                });\n            }\n\n            self.updateOriginalInput();\n            self.refreshItems();\n            self.refreshState();\n            self.updatePlaceholder();\n            self.isSetup = true;\n\n            if ($input.is(':disabled')) {\n                self.disable();\n            }\n\n            self.on('change', this.onChange);\n\n            $input.data('selectize', self);\n            $input.addClass('selectized');\n            self.trigger('initialize');\n\n            // preload options\n            if (settings.preload === true) {\n                self.onSearchChange('');\n            }\n\n        },\n\n        /**\n         * Sets up default rendering functions.\n         */\n        setupTemplates: function() {\n            var self = this;\n            var fieldLabel = self.settings.labelField;\n            var fieldOptgroup = self.settings.optgroupLabelField;\n\n            var templates = {\n                'optgroup': function(data) {\n                    return '<div class=\"optgroup\">' + data.html + '</div>';\n                },\n                'optgroupHeader': function(data, escape) {\n                    return '<div class=\"optgroup-header\">' + escape(data[fieldOptgroup]) + '</div>';\n                },\n                'option': function(data, escape) {\n                    return '<div class=\"option\">' + escape(data[fieldLabel]) + '</div>';\n                },\n                'item': function(data, escape) {\n                    return '<div class=\"item\">' + escape(data[fieldLabel]) + '</div>';\n                },\n                'optionCreate': function(data, escape) {\n                    return '<div class=\"create\">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>';\n                }\n            };\n\n            self.settings.render = $.extend({}, templates, self.settings.render);\n        },\n\n        /**\n         * Maps fired events to callbacks provided\n         * in the settings used when creating the control.\n         */\n        setupCallbacks: function() {\n            var key, fn, callbacks = {\n                'initialize'      : 'onInitialize',\n                'change'          : 'onChange',\n                'itemAdd'        : 'onItemAdd',\n                'itemRemove'     : 'onItemRemove',\n                'clear'           : 'onClear',\n                'optionAdd'      : 'onOptionAdd',\n                'optionRemove'   : 'onOptionRemove',\n                'optionClear'    : 'onOptionClear',\n                'optgroupAdd'    : 'onOptionGroupAdd',\n                'optgroupRemove' : 'onOptionGroupRemove',\n                'optgroupClear'  : 'onOptionGroupClear',\n                'dropdownOpen'   : 'onDropdownOpen',\n                'dropdownClose'  : 'onDropdownClose',\n                'type'            : 'onType',\n                'load'            : 'onLoad',\n                'focus'           : 'onFocus',\n                'blur'            : 'onBlur'\n            };\n\n            for (key in callbacks) {\n                if (callbacks.hasOwnProperty(key)) {\n                    fn = this.settings[callbacks[key]];\n                    if (fn) this.on(key, fn);\n                }\n            }\n        },\n\n        /**\n         * Triggered when the main control element\n         * has a click event.\n         *\n         * @param {object} e\n         * @return {boolean}\n         */\n        onClick: function(e) {\n            var self = this;\n\n            // necessary for mobile webkit devices (manual focus triggering\n            // is ignored unless invoked within a click event)\n            if (!self.isFocused) {\n                self.focus();\n                e.preventDefault();\n            }\n        },\n\n        /**\n         * Triggered when the main control element\n         * has a mouse down event.\n         *\n         * @param {object} e\n         * @return {boolean}\n         */\n        onMouseDown: function(e) {\n            var self = this;\n            var defaultPrevented = e.isDefaultPrevented();\n\n            if (self.isFocused) {\n                // retain focus by preventing native handling. if the\n                // event target is the input it should not be modified.\n                // otherwise, text selection within the input won't work.\n                if (e.target !== self.$controlInput[0]) {\n                    if (self.settings.mode === 'single') {\n                        // toggle dropdown\n                        if (self.isOpen)\n                          self.close()\n                        else\n                          self.open()\n                    } else if (!defaultPrevented) {\n                        self.setActiveItem(null)\n                    }\n                    return false\n                }\n            } else {\n                // give control focus\n                if (!defaultPrevented) {\n                    window.setTimeout(function() {\n                        self.focus()\n                    }, 0)\n                }\n            }\n        },\n\n        /**\n         * Triggered when the value of the control has been changed.\n         * This should propagate the event to the original DOM\n         * input / select element.\n         */\n        onChange: function() {\n            this.$input.trigger('change');\n        },\n\n        /**\n         * Triggered on <input> paste.\n         *\n         * @param {object} e\n         * @returns {boolean}\n         */\n        onPaste: function(e) {\n            var self = this;\n\n            if (self.isFull() || self.isInputHidden || self.isLocked) {\n                e.preventDefault();\n                return;\n            }\n\n            // If a regex or string is included, this will split the pasted\n            // input and create Items for each separate value\n            if (self.settings.splitOn) {\n\n                // Wait for pasted text to be recognized in value\n                setTimeout(function() {\n                    var pastedText = self.$controlInput.val();\n                    if(!pastedText.match(self.settings.splitOn)){ return }\n\n                    var splitInput = $.trim(pastedText).split(self.settings.splitOn);\n                    for (var i = 0, n = splitInput.length; i < n; i++) {\n                        self.createItem(splitInput[i]);\n                    }\n                }, 0);\n            }\n        },\n\n        /**\n         * Triggered on <input> keypress.\n         *\n         * @param {object} e\n         * @returns {boolean}\n         */\n        onKeyPress: function(e) {\n            if (this.isLocked) return e && e.preventDefault();\n            var character = String.fromCharCode(e.keyCode || e.which);\n            if (this.settings.create && this.settings.mode === 'multi' && character === this.settings.delimiter) {\n                this.createItem();\n                e.preventDefault();\n                return false;\n            }\n        },\n\n        /**\n         * Triggered on <input> keydown.\n         *\n         * @param {object} e\n         * @returns {boolean}\n         */\n        onKeyDown: function(e) {\n            var self = this;\n\n            if (self.isLocked) {\n                if (e.keyCode !== KEY_TAB) {\n                    e.preventDefault();\n                }\n                return;\n            }\n\n            switch (e.keyCode) {\n                case KEY_A:\n                    if (self.isCmdDown) {\n                        self.selectAll();\n                        return;\n                    }\n                    break;\n                case KEY_ESC:\n                    if (self.isOpen) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        self.close();\n                    }\n                    return;\n                case KEY_N:\n                    if (!e.ctrlKey || e.altKey) break;\n                case KEY_DOWN:\n                    if (!self.isOpen && self.hasOptions) {\n                        self.open();\n                    } else if (self.$activeOption) {\n                        self.ignoreHover = true;\n                        var $next = self.getAdjacentOption(self.$activeOption, 1);\n                        if ($next.length) self.setActiveOption($next, true, true);\n                    }\n                    e.preventDefault();\n                    return;\n                case KEY_P:\n                    if (!e.ctrlKey || e.altKey) break;\n                case KEY_UP:\n                    if (self.$activeOption) {\n                        self.ignoreHover = true;\n                        var $prev = self.getAdjacentOption(self.$activeOption, -1);\n                        if ($prev.length) self.setActiveOption($prev, true, true);\n                    }\n                    e.preventDefault();\n                    return;\n                case KEY_RETURN:\n                    if (self.isOpen && self.$activeOption) {\n                        self.onOptionSelect({currentTarget: self.$activeOption});\n                        e.preventDefault();\n                    }\n                    return;\n                case KEY_LEFT:\n                    self.advanceSelection(-1, e);\n                    return;\n                case KEY_RIGHT:\n                    self.advanceSelection(1, e);\n                    return;\n                case KEY_TAB:\n                    if (self.settings.selectOnTab && self.isOpen && self.$activeOption) {\n                        self.onOptionSelect({currentTarget: self.$activeOption});\n\n                        // Default behaviour is to jump to the next field, we only want this\n                        // if the current field doesn't accept any more entries\n                        if (!self.isFull()) {\n                            e.preventDefault();\n                        }\n                    }\n                    if (self.settings.create && self.createItem()) {\n                        e.preventDefault();\n                    }\n                    return;\n                case KEY_BACKSPACE:\n                case KEY_DELETE:\n                    self.deleteSelection(e);\n                    return;\n            }\n\n            if ((self.isFull() || self.isInputHidden) && !(IS_MAC ? e.metaKey : e.ctrlKey)) {\n                e.preventDefault();\n                return;\n            }\n        },\n\n        /**\n         * Triggered on <input> keyup.\n         *\n         * @param {object} e\n         * @returns {boolean}\n         */\n        onKeyUp: function(e) {\n            var self = this;\n\n            if (self.isLocked) return e && e.preventDefault();\n            var value = self.$controlInput.val() || '';\n            if (self.lastValue !== value) {\n                self.lastValue = value;\n                self.onSearchChange(value);\n                self.refreshOptions();\n                self.trigger('type', value);\n            }\n        },\n\n        /**\n         * Invokes the user-provide option provider / loader.\n         *\n         * Note: this function is debounced in the Selectize\n         * constructor (by `settings.loadThrottle` milliseconds)\n         *\n         * @param {string} value\n         */\n        onSearchChange: function(value) {\n            var self = this;\n            var fn = self.settings.load;\n            if (!fn) return;\n            if (self.loadedSearches.hasOwnProperty(value)) return;\n            self.loadedSearches[value] = true;\n            self.load(function(callback) {\n                fn.apply(self, [value, callback]);\n            });\n        },\n\n        /**\n         * Triggered on <input> focus.\n         *\n         * @param {object} e (optional)\n         * @returns {boolean}\n         */\n        onFocus: function(e) {\n            var self = this;\n            var wasFocused = self.isFocused;\n\n            if (self.isDisabled) {\n                self.blur();\n                if (e) e.preventDefault()\n                return false;\n            }\n\n            if (self.ignoreFocus) return;\n            self.isFocused = true;\n            if (self.settings.preload === 'focus') self.onSearchChange('');\n\n            if (!wasFocused) self.trigger('focus');\n\n            if (!self.$activeItems.length) {\n                self.showInput();\n                self.setActiveItem(null);\n                self.refreshOptions(!!self.settings.openOnFocus);\n            }\n\n            self.refreshState();\n        },\n\n        /**\n         * Triggered on <input> blur.\n         *\n         * @param {object} e\n         * @param {Element} dest\n         */\n        onBlur: function(e, dest) {\n            var self = this;\n            if (!self.isFocused) return;\n            self.isFocused = false;\n\n            if (self.ignoreFocus) {\n                return;\n            } else if (!self.ignoreBlur && document.activeElement === self.$dropdownContent[0]) {\n                // necessary to prevent IE closing the dropdown when the scrollbar is clicked\n                self.ignoreBlur = true;\n                self.onFocus(e);\n                return;\n            }\n\n            var deactivate = function() {\n                self.close();\n                self.setTextboxValue('');\n                self.setActiveItem(null);\n                self.setActiveOption(null);\n                self.setCaret(self.items.length);\n                self.refreshState();\n\n                // IE11 bug: element still marked as active\n                if (dest && dest.focus) dest.focus();\n\n                self.ignoreFocus = false;\n                self.trigger('blur');\n            };\n\n            self.ignoreFocus = true;\n            if (self.settings.create && self.settings.createOnBlur) {\n                self.createItem(null, false, deactivate);\n            } else {\n                deactivate();\n            }\n        },\n\n        /**\n         * Triggered when the user rolls over\n         * an option in the autocomplete dropdown menu.\n         *\n         * @param {object} e\n         * @returns {boolean}\n         */\n        onOptionHover: function(e) {\n            if (this.ignoreHover) return;\n            this.setActiveOption(e.currentTarget, false);\n        },\n\n        /**\n         * Triggered when the user clicks on an option\n         * in the autocomplete dropdown menu.\n         *\n         * @param {object} e\n         * @returns {boolean}\n         */\n        onOptionSelect: function(e) {\n            var value, $target, self = this;\n\n            if (e.preventDefault) {\n                e.preventDefault();\n                e.stopPropagation();\n            }\n\n            $target = $(e.currentTarget);\n            if ($target.hasClass('create')) {\n                self.createItem(null, function() {\n                    if (self.settings.closeAfterSelect) {\n                        self.close();\n                    }\n                });\n            } else {\n                value = $target.attr('data-value');\n                if (typeof value !== 'undefined') {\n                    self.lastQuery = null;\n                    self.setTextboxValue('');\n                    self.addItem(value);\n                    if (self.settings.closeAfterSelect) {\n                        self.close();\n                    } else if (!self.settings.hideSelected && e.type && /mouse/.test(e.type)) {\n                        self.setActiveOption(self.getOption(value));\n                    }\n                }\n            }\n        },\n\n        /**\n         * Triggered when the user clicks on an item\n         * that has been selected.\n         *\n         * @param {object} e\n         * @returns {boolean}\n         */\n        onItemSelect: function(e) {\n            var self = this;\n\n            if (self.isLocked) return;\n            if (self.settings.mode === 'multi') {\n                e.preventDefault();\n                self.setActiveItem(e.currentTarget, e);\n            }\n        },\n\n        /**\n         * Invokes the provided method that provides\n         * results to a callback---which are then added\n         * as options to the control.\n         *\n         * @param {function} fn\n         */\n        load: function(fn) {\n            var self = this;\n            var $wrapper = self.$wrapper.addClass(self.settings.loadingClass);\n\n            self.loading++;\n            fn.apply(self, [function(results) {\n                self.loading = Math.max(self.loading - 1, 0);\n                if (results && results.length) {\n                    self.addOption(results);\n                    self.refreshOptions(self.isFocused && !self.isInputHidden);\n                }\n                if (!self.loading) {\n                    $wrapper.removeClass(self.settings.loadingClass);\n                }\n                self.trigger('load', results);\n            }]);\n        },\n\n        /**\n         * Sets the input field of the control to the specified value.\n         *\n         * @param {string} value\n         */\n        setTextboxValue: function(value) {\n            var $input = this.$controlInput;\n            var changed = $input.val() !== value;\n            if (changed) {\n                $input.val(value).triggerHandler('update');\n                this.lastValue = value;\n            }\n        },\n\n        /**\n         * Returns the value of the control. If multiple items\n         * can be selected (e.g. <select multiple>), this returns\n         * an array. If only one item can be selected, this\n         * returns a string.\n         *\n         * @returns {mixed}\n         */\n        getValue: function() {\n            if (this.tagType === TAG_SELECT && this.$input.attr('multiple')) {\n                return this.items;\n            } else {\n                return this.items.join(this.settings.delimiter);\n            }\n        },\n\n        /**\n         * Resets the selected items to the given value.\n         *\n         * @param {mixed} value\n         */\n        setValue: function(value, silent) {\n            var events = silent ? [] : ['change'];\n\n            debounceEvents(this, events, function() {\n                this.clear(silent);\n                this.addItems(value, silent);\n            });\n        },\n\n        /**\n         * Sets the selected item.\n         *\n         * @param {object} $item\n         * @param {object} e (optional)\n         */\n        setActiveItem: function($item, e) {\n            var self = this;\n            var eventName;\n            var i, idx, begin, end, item, swap;\n            var $last;\n\n            if (self.settings.mode === 'single') return;\n            $item = $($item);\n\n            // clear the active selection\n            if (!$item.length) {\n                $(self.$activeItems).removeClass('active');\n                self.$activeItems = [];\n                if (self.isFocused) {\n                    self.showInput();\n                }\n                return;\n            }\n\n            // modify selection\n            eventName = e && e.type.toLowerCase();\n\n            if (eventName === 'mousedown' && self.isShiftDown && self.$activeItems.length) {\n                $last = self.$control.children('.active:last');\n                begin = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$last[0]]);\n                end   = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$item[0]]);\n                if (begin > end) {\n                    swap  = begin;\n                    begin = end;\n                    end   = swap;\n                }\n                for (i = begin; i <= end; i++) {\n                    item = self.$control[0].childNodes[i];\n                    if (self.$activeItems.indexOf(item) === -1) {\n                        $(item).addClass('active');\n                        self.$activeItems.push(item);\n                    }\n                }\n                e.preventDefault();\n            } else if ((eventName === 'mousedown' && self.isCtrlDown) || (eventName === 'keydown' && this.isShiftDown)) {\n                if ($item.hasClass('active')) {\n                    idx = self.$activeItems.indexOf($item[0]);\n                    self.$activeItems.splice(idx, 1);\n                    $item.removeClass('active');\n                } else {\n                    self.$activeItems.push($item.addClass('active')[0]);\n                }\n            } else {\n                $(self.$activeItems).removeClass('active');\n                self.$activeItems = [$item.addClass('active')[0]];\n            }\n\n            // ensure control has focus\n            self.hideInput();\n            if (!this.isFocused) {\n                self.focus();\n            }\n        },\n\n        /**\n         * Sets the selected item in the dropdown menu\n         * of available options.\n         *\n         * @param {object} $object\n         * @param {boolean} scroll\n         * @param {boolean} animate\n         */\n        setActiveOption: function($option, scroll, animate) {\n            var heightMenu, heightItem, y;\n            var scrollTop, scrollBottom;\n            var self = this;\n\n            if (self.$activeOption) self.$activeOption.removeClass('active');\n            self.$activeOption = null;\n\n            $option = $($option);\n            if (!$option.length) return;\n\n            self.$activeOption = $option.addClass('active');\n\n            if (scroll || !isSet(scroll)) {\n\n                heightMenu   = self.$dropdownContent.height();\n                heightItem   = self.$activeOption.outerHeight(true);\n                scroll        = self.$dropdownContent.scrollTop() || 0;\n                y             = self.$activeOption.offset().top - self.$dropdownContent.offset().top + scroll;\n                scrollTop    = y;\n                scrollBottom = y - heightMenu + heightItem;\n\n                if (y + heightItem > heightMenu + scroll) {\n                    self.$dropdownContent.stop().animate({scrollTop: scrollBottom}, animate ? self.settings.scrollDuration : 0);\n                } else if (y < scroll) {\n                    self.$dropdownContent.stop().animate({scrollTop: scrollTop}, animate ? self.settings.scrollDuration : 0);\n                }\n\n            }\n        },\n\n        /**\n         * Selects all items (CTRL + A).\n         */\n        selectAll: function() {\n            var self = this;\n            if (self.settings.mode === 'single') return;\n\n            self.$activeItems = Array.prototype.slice.apply(self.$control.children(':not(input)').addClass('active'));\n            if (self.$activeItems.length) {\n                self.hideInput();\n                self.close();\n            }\n            self.focus();\n        },\n\n        /**\n         * Hides the input element out of view, while\n         * retaining its focus.\n         */\n        hideInput: function() {\n            var self = this;\n\n            self.setTextboxValue('');\n            self.$controlInput.css({opacity: 0, position: 'absolute', left: self.rtl ? 10000 : -10000});\n            self.isInputHidden = true;\n        },\n\n        /**\n         * Restores input visibility.\n         */\n        showInput: function() {\n            this.$controlInput.css({opacity: 1, position: 'relative', left: 0});\n            this.isInputHidden = false;\n        },\n\n        /**\n         * Gives the control focus.\n         */\n        focus: function() {\n            var self = this;\n            if (self.isDisabled) return;\n\n            self.ignoreFocus = true;\n            self.$controlInput[0].focus();\n            window.setTimeout(function() {\n                self.ignoreFocus = false;\n                self.onFocus();\n            }, 0);\n        },\n\n        /**\n         * Forces the control out of focus.\n         *\n         * @param {Element} dest\n         */\n        blur: function(dest) {\n            this.$controlInput[0].blur();\n            this.onBlur(null, dest);\n        },\n\n        /**\n         * Returns a function that scores an object\n         * to show how good of a match it is to the\n         * provided query.\n         *\n         * @param {string} query\n         * @param {object} options\n         * @return {function}\n         */\n        getScoreFunction: function(query) {\n            return this.sifter.getScoreFunction(query, this.getSearchOptions());\n        },\n\n        /**\n         * Returns search options for sifter (the system\n         * for scoring and sorting results).\n         *\n         * @see https://github.com/brianreavis/sifter.js\n         * @return {object}\n         */\n        getSearchOptions: function() {\n            var settings = this.settings;\n            var sort = settings.sortField;\n            if (typeof sort === 'string') {\n                sort = [{field: sort}];\n            }\n\n            return {\n                fields      : settings.searchField,\n                conjunction : settings.searchConjunction,\n                sort        : sort\n            };\n        },\n\n        /**\n         * Searches through available options and returns\n         * a sorted array of matches.\n         *\n         * Returns an object containing:\n         *\n         *   - query {string}\n         *   - tokens {array}\n         *   - total {int}\n         *   - items {array}\n         *\n         * @param {string} query\n         * @returns {object}\n         */\n        search: function(query) {\n            var i, result, calculateScore;\n            var self     = this;\n            var settings = self.settings;\n            var options  = this.getSearchOptions();\n\n            // validate user-provided result scoring function\n            if (settings.score) {\n                calculateScore = self.settings.score.apply(this, [query]);\n                if (typeof calculateScore !== 'function') {\n                    throw new Error('Selectize \"score\" setting must be a function that returns a function');\n                }\n            }\n\n            // perform search\n            if (query !== self.lastQuery) {\n                self.lastQuery = query;\n                result = self.sifter.search(query, $.extend(options, {score: calculateScore}));\n                self.currentResults = result;\n            } else {\n                result = $.extend(true, {}, self.currentResults);\n            }\n\n            // filter out selected items\n            if (settings.hideSelected) {\n                for (i = result.items.length - 1; i >= 0; i--) {\n                    if (self.items.indexOf(hashKey(result.items[i].id)) !== -1) {\n                        result.items.splice(i, 1);\n                    }\n                }\n            }\n\n            return result;\n        },\n\n        /**\n         * Refreshes the list of available options shown\n         * in the autocomplete dropdown menu.\n         *\n         * @param {boolean} triggerDropdown\n         */\n        refreshOptions: function(triggerDropdown) {\n            var i, j, k, n, groups, groupsOrder, option, optionHtml, optgroup, optgroups, html, htmlChildren, hasCreateOption;\n            var $active, $activeBefore, $create;\n\n            if (typeof triggerDropdown === 'undefined') {\n                triggerDropdown = true;\n            }\n\n            var self              = this;\n            var query             = $.trim(self.$controlInput.val());\n            var results           = self.search(query);\n            var $dropdownContent = self.$dropdownContent;\n            var activeBefore     = self.$activeOption && hashKey(self.$activeOption.attr('data-value'));\n\n            // build markup\n            n = results.items.length;\n            if (typeof self.settings.maxOptions === 'number') {\n                n = Math.min(n, self.settings.maxOptions);\n            }\n\n            // render and group available options individually\n            groups = {};\n            groupsOrder = [];\n\n            for (i = 0; i < n; i++) {\n                option      = self.options[results.items[i].id];\n                optionHtml = self.render('option', option);\n                optgroup    = option[self.settings.optgroupField] || '';\n                optgroups   = $.isArray(optgroup) ? optgroup : [optgroup];\n\n                for (j = 0, k = optgroups && optgroups.length; j < k; j++) {\n                    optgroup = optgroups[j];\n                    if (!self.optgroups.hasOwnProperty(optgroup)) {\n                        optgroup = '';\n                    }\n                    if (!groups.hasOwnProperty(optgroup)) {\n                        groups[optgroup] = document.createDocumentFragment();\n                        groupsOrder.push(optgroup);\n                    }\n                    groups[optgroup].appendChild(optionHtml);\n                }\n            }\n\n            // sort optgroups\n            if (this.settings.lockOptgroupOrder) {\n                groupsOrder.sort(function(a, b) {\n                    var aOrder = self.optgroups[a].$order || 0;\n                    var bOrder = self.optgroups[b].$order || 0;\n                    return aOrder - bOrder;\n                });\n            }\n\n            // render optgroup headers & join groups\n            html = document.createDocumentFragment();\n            for (i = 0, n = groupsOrder.length; i < n; i++) {\n                optgroup = groupsOrder[i];\n                if (self.optgroups.hasOwnProperty(optgroup) && groups[optgroup].childNodes.length) {\n                    // render the optgroup header and options within it,\n                    // then pass it to the wrapper template\n                    htmlChildren = document.createDocumentFragment();\n                    htmlChildren.appendChild(self.render('optgroupHeader', self.optgroups[optgroup]));\n                    htmlChildren.appendChild(groups[optgroup]);\n\n                    html.appendChild(self.render('optgroup', $.extend({}, self.optgroups[optgroup], {\n                        html: domToString(htmlChildren),\n                        dom:  htmlChildren\n                    })));\n                } else {\n                    html.appendChild(groups[optgroup]);\n                }\n            }\n\n            $dropdownContent.html(html);\n\n            // highlight matching terms inline\n            if (self.settings.highlight && results.query.length && results.tokens.length) {\n                $dropdownContent.removeHighlight();\n                for (i = 0, n = results.tokens.length; i < n; i++) {\n                    highlight($dropdownContent, results.tokens[i].regex);\n                }\n            }\n\n            // add \"selected\" class to selected options\n            if (!self.settings.hideSelected) {\n                for (i = 0, n = self.items.length; i < n; i++) {\n                    self.getOption(self.items[i]).addClass('selected');\n                }\n            }\n\n            // add create option\n            hasCreateOption = self.canCreate(query);\n            if (hasCreateOption) {\n                $dropdownContent.prepend(self.render('optionCreate', {input: query}));\n                $create = $($dropdownContent[0].childNodes[0]);\n            }\n\n            // activate\n            self.hasOptions = results.items.length > 0 || hasCreateOption;\n            if (self.hasOptions) {\n                if (results.items.length > 0) {\n                    $activeBefore = activeBefore && self.getOption(activeBefore);\n                    if ($activeBefore && $activeBefore.length) {\n                        $active = $activeBefore;\n                    } else if (self.settings.mode === 'single' && self.items.length) {\n                        $active = self.getOption(self.items[0]);\n                    }\n                    if (!$active || !$active.length) {\n                        if ($create && !self.settings.addPrecedence) {\n                            $active = self.getAdjacentOption($create, 1);\n                        } else {\n                            $active = $dropdownContent.find('[data-selectable]:first');\n                        }\n                    }\n                } else {\n                    $active = $create;\n                }\n                self.setActiveOption($active);\n                if (triggerDropdown && !self.isOpen) { self.open(); }\n            } else {\n                self.setActiveOption(null);\n                if (triggerDropdown && self.isOpen) { self.close(); }\n            }\n        },\n\n        /**\n         * Adds an available option. If it already exists,\n         * nothing will happen. Note: this does not refresh\n         * the options list dropdown (use `refreshOptions`\n         * for that).\n         *\n         * Usage:\n         *\n         *   this.addOption(data)\n         *\n         * @param {object|array} data\n         */\n        addOption: function(data) {\n            var i, n, value, self = this;\n\n            if ($.isArray(data)) {\n                for (i = 0, n = data.length; i < n; i++) {\n                    self.addOption(data[i]);\n                }\n                return;\n            }\n\n            if (value = self.registerOption(data)) {\n                self.userOptions[value] = true;\n                self.lastQuery = null;\n                self.trigger('optionAdd', value, data);\n            }\n        },\n\n        /**\n         * Registers an option to the pool of options.\n         *\n         * @param {object} data\n         * @return {boolean|string}\n         */\n        registerOption: function(data) {\n            var key = hashKey(data[this.settings.valueField]);\n            if (typeof key === 'undefined' || key === null || this.options.hasOwnProperty(key)) return false;\n            data.$order = data.$order || ++this.order;\n            this.options[key] = data;\n            return key;\n        },\n\n        /**\n         * Registers an option group to the pool of option groups.\n         *\n         * @param {object} data\n         * @return {boolean|string}\n         */\n        registerOptionGroup: function(data) {\n            var key = hashKey(data[this.settings.optgroupValueField]);\n            if (!key) return false;\n\n            data.$order = data.$order || ++this.order;\n            this.optgroups[key] = data;\n            return key;\n        },\n\n        /**\n         * Registers a new optgroup for options\n         * to be bucketed into.\n         *\n         * @param {string} id\n         * @param {object} data\n         */\n        addOptionGroup: function(id, data) {\n            data[this.settings.optgroupValueField] = id;\n            if (id = this.registerOptionGroup(data)) {\n                this.trigger('optgroupAdd', id, data);\n            }\n        },\n\n        /**\n         * Removes an existing option group.\n         *\n         * @param {string} id\n         */\n        removeOptionGroup: function(id) {\n            if (this.optgroups.hasOwnProperty(id)) {\n                delete this.optgroups[id];\n                this.renderCache = {};\n                this.trigger('optgroupRemove', id);\n            }\n        },\n\n        /**\n         * Clears all existing option groups.\n         */\n        clearOptionGroups: function() {\n            this.optgroups = {};\n            this.renderCache = {};\n            this.trigger('optgroupClear');\n        },\n\n        /**\n         * Updates an option available for selection. If\n         * it is visible in the selected items or options\n         * dropdown, it will be re-rendered automatically.\n         *\n         * @param {string} value\n         * @param {object} data\n         */\n        updateOption: function(value, data) {\n            var self = this;\n            var $item, $itemNew;\n            var valueNew, indexItem, cacheItems, cacheOptions, orderOld;\n\n            value     = hashKey(value);\n            valueNew = hashKey(data[self.settings.valueField]);\n\n            // sanity checks\n            if (value === null) return;\n            if (!self.options.hasOwnProperty(value)) return;\n            if (typeof valueNew !== 'string') throw new Error('Value must be set in option data');\n\n            orderOld = self.options[value].$order;\n\n            // update references\n            if (valueNew !== value) {\n                delete self.options[value];\n                indexItem = self.items.indexOf(value);\n                if (indexItem !== -1) {\n                    self.items.splice(indexItem, 1, valueNew);\n                }\n            }\n            data.$order = data.$order || orderOld;\n            self.options[valueNew] = data;\n\n            // invalidate render cache\n            cacheItems = self.renderCache.item;\n            cacheOptions = self.renderCache.option;\n\n            if (cacheItems) {\n                delete cacheItems[value];\n                delete cacheItems[valueNew];\n            }\n            if (cacheOptions) {\n                delete cacheOptions[value];\n                delete cacheOptions[valueNew];\n            }\n\n            // update the item if it's selected\n            if (self.items.indexOf(valueNew) !== -1) {\n                $item = self.getItem(value);\n                $itemNew = $(self.render('item', data));\n                if ($item.hasClass('active')) $itemNew.addClass('active');\n                $item.replaceWith($itemNew);\n            }\n\n            // invalidate last query because we might have updated the sortField\n            self.lastQuery = null;\n\n            // update dropdown contents\n            if (self.isOpen) {\n                self.refreshOptions(false);\n            }\n        },\n\n        /**\n         * Removes a single option.\n         *\n         * @param {string} value\n         * @param {boolean} silent\n         */\n        removeOption: function(value, silent) {\n            var self = this;\n            value = hashKey(value);\n\n            var cacheItems = self.renderCache.item;\n            var cacheOptions = self.renderCache.option;\n            if (cacheItems) delete cacheItems[value];\n            if (cacheOptions) delete cacheOptions[value];\n\n            delete self.userOptions[value];\n            delete self.options[value];\n            self.lastQuery = null;\n            self.trigger('optionRemove', value);\n            self.removeItem(value, silent);\n        },\n\n        /**\n         * Clears all options.\n         */\n        clearOptions: function() {\n            var self = this;\n\n            self.loadedSearches = {};\n            self.userOptions = {};\n            self.renderCache = {};\n            self.options = self.sifter.items = {};\n            self.lastQuery = null;\n            self.trigger('optionClear');\n            self.clear();\n        },\n\n        /**\n         * Returns the jQuery element of the option\n         * matching the given value.\n         *\n         * @param {string} value\n         * @returns {object}\n         */\n        getOption: function(value) {\n            return this.getElementWithValue(value, this.$dropdownContent.find('[data-selectable]'));\n        },\n\n        /**\n         * Returns the jQuery element of the next or\n         * previous selectable option.\n         *\n         * @param {object} $option\n         * @param {int} direction  can be 1 for next or -1 for previous\n         * @return {object}\n         */\n        getAdjacentOption: function($option, direction) {\n            var $options = this.$dropdown.find('[data-selectable]');\n            var index    = $options.index($option) + direction;\n\n            return index >= 0 && index < $options.length ? $options.eq(index) : $();\n        },\n\n        /**\n         * Finds the first element with a \"data-value\" attribute\n         * that matches the given value.\n         *\n         * @param {mixed} value\n         * @param {object} $els\n         * @return {object}\n         */\n        getElementWithValue: function(value, $els) {\n            value = hashKey(value);\n\n            if (typeof value !== 'undefined' && value !== null) {\n                for (var i = 0, n = $els.length; i < n; i++) {\n                    if ($els[i].getAttribute('data-value') === value) {\n                        return $($els[i]);\n                    }\n                }\n            }\n\n            return $();\n        },\n\n        /**\n         * Returns the jQuery element of the item\n         * matching the given value.\n         *\n         * @param {string} value\n         * @returns {object}\n         */\n        getItem: function(value) {\n            return this.getElementWithValue(value, this.$control.children());\n        },\n\n        /**\n         * \"Selects\" multiple items at once. Adds them to the list\n         * at the current caret position.\n         *\n         * @param {string} value\n         * @param {boolean} silent\n         */\n        addItems: function(values, silent) {\n            var items = $.isArray(values) ? values : [values];\n            for (var i = 0, n = items.length; i < n; i++) {\n                this.isPending = (i < n - 1);\n                this.addItem(items[i], silent);\n            }\n        },\n\n        /**\n         * \"Selects\" an item. Adds it to the list\n         * at the current caret position.\n         *\n         * @param {string} value\n         * @param {boolean} silent\n         */\n        addItem: function(value, silent) {\n            var events = silent ? [] : ['change'];\n\n            debounceEvents(this, events, function() {\n                var $item, $option, $options;\n                var self = this;\n                var inputMode = self.settings.mode;\n                var valueNext, wasFull;\n                value = hashKey(value);\n\n                if (self.items.indexOf(value) !== -1) {\n                    if (inputMode === 'single') self.close();\n                    return;\n                }\n\n                if (!self.options.hasOwnProperty(value)) return;\n                if (inputMode === 'single') self.clear(silent);\n                if (inputMode === 'multi' && self.isFull()) return;\n\n                $item = $(self.render('item', self.options[value]));\n                wasFull = self.isFull();\n                self.items.splice(self.caretPos, 0, value);\n                self.insertAtCaret($item);\n                if (!self.isPending || (!wasFull && self.isFull())) {\n                    self.refreshState();\n                }\n\n                if (self.isSetup) {\n                    $options = self.$dropdownContent.find('[data-selectable]');\n\n                    // update menu / remove the option (if this is not one item being added as part of series)\n                    if (!self.isPending) {\n                        $option = self.getOption(value);\n                        valueNext = self.getAdjacentOption($option, 1).attr('data-value');\n                        self.refreshOptions(self.isFocused && inputMode !== 'single');\n                        if (valueNext) {\n                            self.setActiveOption(self.getOption(valueNext));\n                        }\n                    }\n\n                    // hide the menu if the maximum number of items have been selected or no options are left\n                    if (!$options.length || self.isFull()) {\n                        self.close();\n                    } else {\n                        self.positionDropdown();\n                    }\n\n                    self.updatePlaceholder();\n                    self.trigger('itemAdd', value, $item);\n                    self.updateOriginalInput({silent: silent});\n                }\n            });\n        },\n\n        /**\n         * Removes the selected item matching\n         * the provided value.\n         *\n         * @param {string} value\n         */\n        removeItem: function(value, silent) {\n            var self = this;\n            var $item, i, idx;\n\n            $item = (value instanceof $) ? value : self.getItem(value);\n            value = hashKey($item.attr('data-value'));\n            i = self.items.indexOf(value);\n\n            if (i !== -1) {\n                $item.remove();\n                if ($item.hasClass('active')) {\n                    idx = self.$activeItems.indexOf($item[0]);\n                    self.$activeItems.splice(idx, 1);\n                }\n\n                self.items.splice(i, 1);\n                self.lastQuery = null;\n                if (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {\n                    self.removeOption(value, silent);\n                }\n\n                if (i < self.caretPos) {\n                    self.setCaret(self.caretPos - 1);\n                }\n\n                self.refreshState();\n                self.updatePlaceholder();\n                self.updateOriginalInput({silent: silent});\n                self.positionDropdown();\n                self.trigger('itemRemove', value, $item);\n            }\n        },\n\n        /**\n         * Invokes the `create` method provided in the\n         * selectize options that should provide the data\n         * for the new item, given the user input.\n         *\n         * Once this completes, it will be added\n         * to the item list.\n         *\n         * @param {string} value\n         * @param {boolean} [triggerDropdown]\n         * @param {function} [callback]\n         * @return {boolean}\n         */\n        createItem: function(input, triggerDropdown) {\n            var self  = this;\n            var caret = self.caretPos;\n            input = input || $.trim(self.$controlInput.val() || '');\n\n            var callback = arguments[arguments.length - 1];\n            if (typeof callback !== 'function') callback = function() {};\n\n            if (typeof triggerDropdown !== 'boolean') {\n                triggerDropdown = true;\n            }\n\n            if (!self.canCreate(input)) {\n                callback();\n                return false;\n            }\n\n            self.lock();\n\n            var setup = (typeof self.settings.create === 'function') ? this.settings.create : function(input) {\n                var data = {};\n                data[self.settings.labelField] = input;\n                data[self.settings.valueField] = input;\n                return data;\n            };\n\n            var create = once(function(data) {\n                self.unlock();\n\n                if (!data || typeof data !== 'object') return callback();\n                var value = hashKey(data[self.settings.valueField]);\n                if (typeof value !== 'string') return callback();\n\n                self.setTextboxValue('');\n                self.addOption(data);\n                self.setCaret(caret);\n                self.addItem(value);\n                self.refreshOptions(triggerDropdown && self.settings.mode !== 'single');\n                callback(data);\n            });\n\n            var output = setup.apply(this, [input, create]);\n            if (typeof output !== 'undefined') {\n                create(output);\n            }\n\n            return true;\n        },\n\n        /**\n         * Re-renders the selected item lists.\n         */\n        refreshItems: function() {\n            this.lastQuery = null;\n\n            if (this.isSetup) {\n                this.addItem(this.items);\n            }\n\n            this.refreshState();\n            this.updateOriginalInput();\n        },\n\n        /**\n         * Updates all state-dependent attributes\n         * and CSS classes.\n         */\n        refreshState: function() {\n            this.refreshValidityState();\n            this.refreshClasses();\n        },\n\n        /**\n         * Update the `required` attribute of both input and control input.\n         *\n         * The `required` property needs to be activated on the control input\n         * for the error to be displayed at the right place. `required` also\n         * needs to be temporarily deactivated on the input since the input is\n         * hidden and can't show errors.\n         */\n        refreshValidityState: function() {\n            if (!this.isRequired) return false;\n\n            var invalid = !this.items.length;\n\n            this.isInvalid = invalid;\n            this.$controlInput.prop('required', invalid);\n            this.$input.prop('required', !invalid);\n        },\n\n        /**\n         * Updates all state-dependent CSS classes.\n         */\n        refreshClasses: function() {\n            var self     = this;\n            var isFull   = self.isFull();\n            var isLocked = self.isLocked;\n\n            self.$wrapper\n                .toggleClass('rtl', self.rtl);\n\n            self.$control\n                .toggleClass('focus', self.isFocused)\n                .toggleClass('disabled', self.isDisabled)\n                .toggleClass('required', self.isRequired)\n                .toggleClass('invalid', self.isInvalid)\n                .toggleClass('locked', isLocked)\n                .toggleClass('full', isFull).toggleClass('not-full', !isFull)\n                .toggleClass('input-active', self.isFocused && !self.isInputHidden)\n                .toggleClass('dropdown-active', self.isOpen)\n                .toggleClass('has-options', !$.isEmptyObject(self.options))\n                .toggleClass('has-items', self.items.length > 0);\n\n            self.$controlInput.data('grow', !isFull && !isLocked);\n        },\n\n        /**\n         * Determines whether or not more items can be added\n         * to the control without exceeding the user-defined maximum.\n         *\n         * @returns {boolean}\n         */\n        isFull: function() {\n            return this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;\n        },\n\n        /**\n         * Refreshes the original <select> or <input>\n         * element to reflect the current state.\n         */\n        updateOriginalInput: function(opts) {\n            var i, n, options, label, self = this;\n            opts = opts || {};\n\n            if (self.tagType === TAG_SELECT) {\n                options = [];\n                for (i = 0, n = self.items.length; i < n; i++) {\n                    label = self.options[self.items[i]][self.settings.labelField] || '';\n                    options.push('<option value=\"' + escapeHtml(self.items[i]) + '\" selected=\"selected\">' + escapeHtml(label) + '</option>');\n                }\n                if (!options.length && !this.$input.attr('multiple')) {\n                    options.push('<option value=\"\" selected=\"selected\"></option>');\n                }\n                self.$input.html(options.join(''));\n            } else {\n                self.$input.val(self.getValue());\n                self.$input.attr('value',self.$input.val());\n            }\n\n            if (self.isSetup) {\n                if (!opts.silent) {\n                    self.trigger('change', self.$input.val());\n                }\n            }\n        },\n\n        /**\n         * Shows/hide the input placeholder depending\n         * on if there items in the list already.\n         */\n        updatePlaceholder: function() {\n            if (!this.settings.placeholder) return;\n            var $input = this.$controlInput;\n\n            if (this.items.length) {\n                $input.removeAttr('placeholder');\n            } else {\n                $input.attr('placeholder', this.settings.placeholder);\n            }\n            $input.triggerHandler('update', {force: true});\n        },\n\n        /**\n         * Shows the autocomplete dropdown containing\n         * the available options.\n         */\n        open: function() {\n            var self = this;\n\n            if (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull())) return;\n            self.focus();\n            self.isOpen = true;\n            self.refreshState();\n            self.$dropdown.css({visibility: 'hidden', display: 'block'});\n            self.positionDropdown();\n            self.$dropdown.css({visibility: 'visible'});\n            self.trigger('dropdownOpen', self.$dropdown);\n        },\n\n        /**\n         * Closes the autocomplete dropdown menu.\n         */\n        close: function() {\n            var self = this;\n            var trigger = self.isOpen;\n\n            if (self.settings.mode === 'single' && self.items.length) {\n                self.hideInput();\n                self.$controlInput.blur(); // close keyboard on iOS\n            }\n\n            self.isOpen = false;\n            self.$dropdown.hide();\n            self.setActiveOption(null);\n            self.refreshState();\n\n            if (trigger) self.trigger('dropdownClose', self.$dropdown);\n        },\n\n        /**\n         * Calculates and applies the appropriate\n         * position of the dropdown.\n         */\n        positionDropdown: function() {\n            var $control = this.$control;\n            var offset = this.settings.dropdownParent === 'body' ? $control.offset() : $control.position();\n            offset.top += $control.outerHeight(true);\n\n            this.$dropdown.css({\n                width : $control.outerWidth(),\n                top   : offset.top,\n                left  : offset.left\n            });\n        },\n\n        /**\n         * Resets / clears all selected items\n         * from the control.\n         *\n         * @param {boolean} silent\n         */\n        clear: function(silent) {\n            var self = this;\n\n            if (!self.items.length) return;\n            self.$control.children(':not(input)').remove();\n            self.items = [];\n            self.lastQuery = null;\n            self.setCaret(0);\n            self.setActiveItem(null);\n            self.updatePlaceholder();\n            self.updateOriginalInput({silent: silent});\n            self.refreshState();\n            self.showInput();\n            self.trigger('clear');\n        },\n\n        /**\n         * A helper method for inserting an element\n         * at the current caret position.\n         *\n         * @param {object} $el\n         */\n        insertAtCaret: function($el) {\n            var caret = Math.min(this.caretPos, this.items.length);\n            if (caret === 0) {\n                this.$control.prepend($el);\n            } else {\n                $(this.$control[0].childNodes[caret]).before($el);\n            }\n            this.setCaret(caret + 1);\n        },\n\n        /**\n         * Removes the current selected item(s).\n         *\n         * @param {object} e (optional)\n         * @returns {boolean}\n         */\n        deleteSelection: function(e) {\n            var i, n, direction, selection, values, caret, optionSelect, $optionSelect, $tail;\n            var self = this;\n\n            direction = (e && e.keyCode === KEY_BACKSPACE) ? -1 : 1;\n            selection = getSelection(self.$controlInput[0]);\n\n            if (self.$activeOption && !self.settings.hideSelected) {\n                optionSelect = self.getAdjacentOption(self.$activeOption, -1).attr('data-value');\n            }\n\n            // determine items that will be removed\n            values = [];\n\n            if (self.$activeItems.length) {\n                $tail = self.$control.children('.active:' + (direction > 0 ? 'last' : 'first'));\n                caret = self.$control.children(':not(input)').index($tail);\n                if (direction > 0) { caret++; }\n\n                for (i = 0, n = self.$activeItems.length; i < n; i++) {\n                    values.push($(self.$activeItems[i]).attr('data-value'));\n                }\n                if (e) {\n                    e.preventDefault();\n                    e.stopPropagation();\n                }\n            } else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {\n                if (direction < 0 && selection.start === 0 && selection.length === 0) {\n                    values.push(self.items[self.caretPos - 1]);\n                } else if (direction > 0 && selection.start === self.$controlInput.val().length) {\n                    values.push(self.items[self.caretPos]);\n                }\n            }\n\n            // allow the callback to abort\n            if (!values.length || (typeof self.settings.onDelete === 'function' && self.settings.onDelete.apply(self, [values]) === false)) {\n                return false;\n            }\n\n            // perform removal\n            if (typeof caret !== 'undefined') {\n                self.setCaret(caret);\n            }\n            while (values.length) {\n                self.removeItem(values.pop());\n            }\n\n            self.showInput();\n            self.positionDropdown();\n            self.refreshOptions(true);\n\n            // select previous option\n            if (optionSelect) {\n                $optionSelect = self.getOption(optionSelect);\n                if ($optionSelect.length) {\n                    self.setActiveOption($optionSelect);\n                }\n            }\n\n            return true;\n        },\n\n        /**\n         * Selects the previous / next item (depending\n         * on the `direction` argument).\n         *\n         * > 0 - right\n         * < 0 - left\n         *\n         * @param {int} direction\n         * @param {object} e (optional)\n         */\n        advanceSelection: function(direction, e) {\n            var tail, selection, idx, valueLength, cursorAtEdge, $tail;\n            var self = this;\n\n            if (direction === 0) return;\n            if (self.rtl) direction *= -1;\n\n            tail = direction > 0 ? 'last' : 'first';\n            selection = getSelection(self.$controlInput[0]);\n\n            if (self.isFocused && !self.isInputHidden) {\n                valueLength = self.$controlInput.val().length;\n                cursorAtEdge = direction < 0 ? selection.start === 0 &&\n                  selection.length === 0 : selection.start === valueLength;\n\n                if (cursorAtEdge && !valueLength) {\n                    self.advanceCaret(direction, e);\n                }\n            } else {\n                $tail = self.$control.children('.active:' + tail);\n                if ($tail.length) {\n                    idx = self.$control.children(':not(input)').index($tail);\n                    self.setActiveItem(null);\n                    self.setCaret(direction > 0 ? idx + 1 : idx);\n                }\n            }\n        },\n\n        /**\n         * Moves the caret left / right.\n         *\n         * @param {int} direction\n         * @param {object} e (optional)\n         */\n        advanceCaret: function(direction, e) {\n            var self = this, fn, $adj;\n\n            if (direction === 0) return;\n\n            fn = direction > 0 ? 'next' : 'prev';\n            if (self.isShiftDown) {\n                $adj = self.$controlInput[fn]();\n                if ($adj.length) {\n                    self.hideInput();\n                    self.setActiveItem($adj);\n                    if(e) e.preventDefault();\n                }\n            } else {\n                self.setCaret(self.caretPos + direction);\n            }\n        },\n\n        /**\n         * Moves the caret to the specified index.\n         *\n         * @param {int} i\n         */\n        setCaret: function(i) {\n            var self = this;\n\n            if (self.settings.mode === 'single') {\n                i = self.items.length;\n            } else {\n                i = Math.max(0, Math.min(self.items.length, i));\n            }\n\n            if(!self.isPending) {\n                // the input must be moved by leaving it in place and moving the\n                // siblings, due to the fact that focus cannot be restored once lost\n                // on mobile webkit devices\n                var j, n, $children, $child;\n                $children = self.$control.children(':not(input)');\n                for (j = 0, n = $children.length; j < n; j++) {\n                    $child = $($children[j]).detach();\n                    if (j <  i) {\n                        self.$controlInput.before($child);\n                    } else {\n                        self.$control.append($child);\n                    }\n                }\n            }\n\n            self.caretPos = i;\n        },\n\n        /**\n         * Disables user input on the control. Used while\n         * items are being asynchronously created.\n         */\n        lock: function() {\n            this.close();\n            this.isLocked = true;\n            this.refreshState();\n        },\n\n        /**\n         * Re-enables user input on the control.\n         */\n        unlock: function() {\n            this.isLocked = false;\n            this.refreshState();\n        },\n\n        /**\n         * Disables user input on the control completely.\n         * While disabled, it cannot receive focus.\n         */\n        disable: function() {\n            var self = this;\n            self.$input.prop('disabled', true);\n            self.$controlInput.prop('disabled', true).prop('tabindex', -1);\n            self.isDisabled = true;\n            self.lock();\n        },\n\n        /**\n         * Enables the control so that it can respond\n         * to focus and user input.\n         */\n        enable: function() {\n            var self = this;\n            self.$input.prop('disabled', false);\n            self.$controlInput.prop('disabled', false).prop('tabindex', self.tabIndex);\n            self.isDisabled = false;\n            self.unlock();\n        },\n\n        /**\n         * Completely destroys the control and\n         * unbinds all event listeners so that it can\n         * be garbage collected.\n         */\n        destroy: function() {\n            var self = this;\n            var eventNS = self.eventNS;\n            var revertSettings = self.revertSettings;\n\n            self.trigger('destroy');\n            self.off();\n            self.$wrapper.remove();\n            self.$dropdown.remove();\n\n            self.$input\n                .html('')\n                .append(revertSettings.$children)\n                .removeAttr('tabindex')\n                .removeClass('selectized')\n                .attr({tabindex: revertSettings.tabindex})\n                .show();\n\n            self.$controlInput.removeData('grow');\n            self.$input.removeData('selectize');\n\n            $(window).off(eventNS);\n            $(document).off(eventNS);\n            $(document.body).off(eventNS);\n\n            delete self.$input[0].selectize;\n        },\n\n        /**\n         * A helper method for rendering \"item\" and\n         * \"option\" templates, given the data.\n         *\n         * @param {string} templateName\n         * @param {object} data\n         * @returns {string}\n         */\n        render: function(templateName, data) {\n            var value, id;\n            var html = '';\n            var cache = false;\n            var self = this;\n            // var regexTag = /^[\\t \\r\\n]*<([a-z][a-z0-9\\-]*(?:\\:[a-z][a-z0-9\\-]*)?)/i;\n\n            if (templateName === 'option' || templateName === 'item') {\n                value = hashKey(data[self.settings.valueField]);\n                cache = !!value;\n            }\n\n            // pull markup from cache if it exists\n            if (cache) {\n                if (!isSet(self.renderCache[templateName])) {\n                    self.renderCache[templateName] = {};\n                }\n                if (self.renderCache[templateName].hasOwnProperty(value)) {\n                    return self.renderCache[templateName][value];\n                }\n            }\n\n            // render markup\n            html = $(self.settings.render[templateName].apply(this, [data, escapeHtml]));\n\n            // add mandatory attributes\n            if (templateName === 'option' || templateName === 'optionCreate') {\n                html.attr('data-selectable', '');\n            }\n            else if (templateName === 'optgroup') {\n                id = data[self.settings.optgroupValueField] || '';\n                html.attr('data-group', id);\n            }\n            if (templateName === 'option' || templateName === 'item') {\n                html.attr('data-value', value || '');\n            }\n\n            // update cache\n            if (cache) {\n                self.renderCache[templateName][value] = html[0];\n            }\n\n            return html[0];\n        },\n\n        /**\n         * Clears the render cache for a template. If\n         * no template is given, clears all render\n         * caches.\n         *\n         * @param {string} templateName\n         */\n        clearCache: function(templateName) {\n            var self = this;\n            if (typeof templateName === 'undefined') {\n                self.renderCache = {};\n            } else {\n                delete self.renderCache[templateName];\n            }\n        },\n\n        /**\n         * Determines whether or not to display the\n         * create item prompt, given a user input.\n         *\n         * @param {string} input\n         * @return {boolean}\n         */\n        canCreate: function(input) {\n            var self = this;\n            if (!self.settings.create) return false;\n            var filter = self.settings.createFilter;\n            return input.length\n                && (typeof filter !== 'function' || filter.apply(self, [input]))\n                && (typeof filter !== 'string' || new RegExp(filter).test(input))\n                && (!(filter instanceof RegExp) || filter.test(input));\n        }\n\n    });\n}\n","import Selectize from './selectize';\nimport defaults  from './defaults'\nimport {hashKey} from './utils';\n\nexport default function selectize($select, optsUser) {\n    var opts               = $.extend({}, defaults, optsUser);\n    var attrData           = opts.dataAttr;\n    var fieldLabel         = opts.labelField;\n    var fieldValue         = opts.valueField;\n    var fieldOptgroup      = opts.optgroupField;\n    var fieldOptgroupLabel = opts.optgroupLabelField;\n    var fieldOptgroupValue = opts.optgroupValueField;\n\n    /**\n     * Initializes selectize from a <input type=\"text\"> element.\n     *\n     * @param {object} $input\n     * @param {object} optsElement\n     */\n    var initTextbox = function($input, optsElement) {\n        var i, n, values, option;\n\n        var dataRaw = $input.attr(attrData);\n\n        if (!dataRaw) {\n            var value = $.trim($input.val() || '');\n            if (!opts.allowEmptyOption && !value.length) return;\n            values = value.split(opts.delimiter);\n            for (i = 0, n = values.length; i < n; i++) {\n                option = {};\n                option[fieldLabel] = values[i];\n                option[fieldValue] = values[i];\n                optsElement.options.push(option);\n            }\n            optsElement.items = values;\n        } else {\n            optsElement.options = JSON.parse(dataRaw);\n            for (i = 0, n = optsElement.options.length; i < n; i++) {\n                optsElement.items.push(optsElement.options[i][fieldValue]);\n            }\n        }\n    };\n\n    /**\n     * Initializes selectize from a <select> element.\n     *\n     * @param {object} $input\n     * @param {object} optsElement\n     */\n    var initSelect = function($input, optsElement) {\n        var i, n, tagName, $children;\n        var options = optsElement.options;\n        var optionsMap = {};\n\n        var readData = function($el) {\n            var data = attrData && $el.attr(attrData);\n            if (typeof data === 'string' && data.length) {\n                return JSON.parse(data);\n            }\n            return null;\n        };\n\n        var addOption = function($option, group) {\n            $option = $($option);\n\n            var value = hashKey($option.val());\n            if (!value && !opts.allowEmptyOption) return;\n\n            // if the option already exists, it's probably been\n            // duplicated in another optgroup. in this case, push\n            // the current group to the \"optgroup\" property on the\n            // existing option so that it's rendered in both places.\n            if (optionsMap.hasOwnProperty(value)) {\n                if (group) {\n                    var arr = optionsMap[value][fieldOptgroup];\n                    if (!arr) {\n                        optionsMap[value][fieldOptgroup] = group;\n                    } else if (!$.isArray(arr)) {\n                        optionsMap[value][fieldOptgroup] = [arr, group];\n                    } else {\n                        arr.push(group);\n                    }\n                }\n                return;\n            }\n\n            var option            = readData($option) || {};\n            option[fieldLabel]    = option[fieldLabel] || $option.text();\n            option[fieldValue]    = option[fieldValue] || value;\n            option[fieldOptgroup] = option[fieldOptgroup] || group;\n\n            optionsMap[value] = option;\n            options.push(option);\n\n            if ($option.is(':selected')) {\n                optsElement.items.push(value);\n            }\n        };\n\n        var addGroup = function($optgroup) {\n            var i, n, id, optgroup, $options;\n\n            $optgroup = $($optgroup);\n            id = $optgroup.attr('label');\n\n            if (id) {\n                optgroup = readData($optgroup) || {};\n                optgroup[fieldOptgroupLabel] = id;\n                optgroup[fieldOptgroupValue] = id;\n                optsElement.optgroups.push(optgroup);\n            }\n\n            $options = $('option', $optgroup);\n            for (i = 0, n = $options.length; i < n; i++) {\n                addOption($options[i], id);\n            }\n        };\n\n        optsElement.maxItems = $input.attr('multiple') ? null : 1;\n\n        $children = $input.children();\n        for (i = 0, n = $children.length; i < n; i++) {\n            tagName = $children[i].tagName.toLowerCase();\n            if (tagName === 'optgroup') {\n                addGroup($children[i]);\n            } else if (tagName === 'option') {\n                addOption($children[i]);\n            }\n        }\n    };\n\n    return $select.each(function() {\n        if (this.selectize) return;\n\n        var instance;\n        var $input = $(this);\n        var tagName = this.tagName.toLowerCase();\n        var placeholder = $input.attr('placeholder') || $input.attr('data-placeholder');\n        if (!placeholder && !opts.allowEmptyOption) {\n            placeholder = $input.children('option[value=\"\"]').text();\n        }\n\n        var optsElement = {\n            'placeholder' : placeholder,\n            'options'     : [],\n            'optgroups'   : [],\n            'items'       : []\n        };\n\n        if (tagName === 'select') {\n            initSelect($input, optsElement);\n        } else {\n            initTextbox($input, optsElement);\n        }\n\n        instance = new Selectize($input, $.extend(true, {}, defaults, optsElement, optsUser));\n    });\n}\n"],"names":["init","highlightInit"],"mappings":"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"}