{"version":3,"file":"tom-select.complete.min.js","sources":["../../src/contrib/microevent.ts","../../node_modules/@orchidjs/unicode-variants/dist/esm/regex.js","../../node_modules/@orchidjs/unicode-variants/dist/esm/strings.js","../../node_modules/@orchidjs/unicode-variants/dist/esm/index.js","../../node_modules/@orchidjs/sifter/dist/esm/utils.js","../../node_modules/@orchidjs/sifter/dist/esm/sifter.js","../../node_modules/@orchidjs/sifter/lib/utils.ts","../../src/vanilla.ts","../../src/contrib/highlight.ts","../../src/constants.ts","../../src/defaults.ts","../../src/utils.ts","../../src/getSettings.ts","../../src/tom-select.ts","../../src/contrib/microplugin.ts","../../src/tom-select.complete.ts","../../src/plugins/change_listener/plugin.ts","../../src/plugins/checkbox_options/plugin.ts","../../src/plugins/clear_button/plugin.ts","../../src/plugins/drag_drop/plugin.ts","../../src/plugins/dropdown_header/plugin.ts","../../src/plugins/caret_position/plugin.ts","../../src/plugins/dropdown_input/plugin.ts","../../src/plugins/input_autogrow/plugin.ts","../../src/plugins/no_backspace_delete/plugin.ts","../../src/plugins/no_active_items/plugin.ts","../../src/plugins/optgroup_columns/plugin.ts","../../src/plugins/remove_button/plugin.ts","../../src/plugins/restore_on_backspace/plugin.ts","../../src/plugins/virtual_scroll/plugin.ts"],"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\ntype TCallback = (...args:any) => any;\n\n/**\n * Execute callback for each event in space separated list of event names\n *\n */\nfunction forEvents(events:string,callback:(event:string)=>any){\n\tevents.split(/\\s+/).forEach((event) =>{\n\t\tcallback(event);\n\t});\n}\n\nexport default class MicroEvent{\n\n\tpublic _events: {[key:string]:TCallback[]};\n\n\tconstructor(){\n\t\tthis._events = {};\n\t}\n\n\ton(events:string, fct:TCallback){\n\t\tforEvents(events,(event) => {\n\t\t\tconst event_array = this._events[event] || [];\n\t\t\tevent_array.push(fct);\n\t\t\tthis._events[event] = event_array;\n\t\t});\n\t}\n\n\toff(events:string, fct:TCallback){\n\t\tvar n = arguments.length;\n\t\tif( n === 0 ){\n\t\t\tthis._events = {};\n\t\t\treturn;\n\t\t}\n\n\t\tforEvents(events,(event) => {\n\n\t\t\tif (n === 1){\n\t\t\t\tdelete this._events[event];\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst event_array = this._events[event];\n\t\t\tif( event_array === undefined ) return;\n\n\t\t\tevent_array.splice(event_array.indexOf(fct), 1);\n\t\t\tthis._events[event] = event_array;\n\t\t});\n\t}\n\n\ttrigger(events:string, ...args:any){\n\t\tvar self = this;\n\n\t\tforEvents(events,(event) => {\n\t\t\tconst event_array = self._events[event];\n\t\t\tif( event_array === undefined ) return;\n\t\t\tevent_array.forEach(fct => {\n\t\t\t\tfct.apply(self, args );\n\t\t\t});\n\n\t\t});\n\t}\n};\n","/*! @orchidjs/unicode-variants | https://github.com/orchidjs/unicode-variants | Apache License (v2) */\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n * @param {string[]} chars\n * @return {string}\n */\nconst arrayToPattern = chars => {\n  chars = chars.filter(Boolean);\n\n  if (chars.length < 2) {\n    return chars[0] || '';\n  }\n\n  return maxValueLength(chars) == 1 ? '[' + chars.join('') + ']' : '(?:' + chars.join('|') + ')';\n};\n/**\n * @param {string[]} array\n * @return {string}\n */\n\nconst sequencePattern = array => {\n  if (!hasDuplicates(array)) {\n    return array.join('');\n  }\n\n  let pattern = '';\n  let prev_char_count = 0;\n\n  const prev_pattern = () => {\n    if (prev_char_count > 1) {\n      pattern += '{' + prev_char_count + '}';\n    }\n  };\n\n  array.forEach((char, i) => {\n    if (char === array[i - 1]) {\n      prev_char_count++;\n      return;\n    }\n\n    prev_pattern();\n    pattern += char;\n    prev_char_count = 1;\n  });\n  prev_pattern();\n  return pattern;\n};\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n * @param {Set<string>} chars\n * @return {string}\n */\n\nconst setToPattern = chars => {\n  let array = toArray(chars);\n  return arrayToPattern(array);\n};\n/**\n *\n * https://stackoverflow.com/questions/7376598/in-javascript-how-do-i-check-if-an-array-has-duplicate-values\n * @param {any[]} array\n */\n\nconst hasDuplicates = array => {\n  return new Set(array).size !== array.length;\n};\n/**\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n * @param {string} str\n * @return {string}\n */\n\nconst escape_regex = str => {\n  return (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n/**\n * Return the max length of array values\n * @param {string[]} array\n *\n */\n\nconst maxValueLength = array => {\n  return array.reduce((longest, value) => Math.max(longest, unicodeLength(value)), 0);\n};\n/**\n * @param {string} str\n */\n\nconst unicodeLength = str => {\n  return toArray(str).length;\n};\n/**\n * @param {any} p\n * @return {any[]}\n */\n\nconst toArray = p => Array.from(p);\n\nexport { arrayToPattern, escape_regex, hasDuplicates, maxValueLength, sequencePattern, setToPattern, toArray, unicodeLength };\n//# sourceMappingURL=regex.js.map\n","/*! @orchidjs/unicode-variants | https://github.com/orchidjs/unicode-variants | Apache License (v2) */\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n * @param {string} input\n * @return {string[][]}\n */\nconst allSubstrings = input => {\n  if (input.length === 1) return [[input]];\n  /** @type {string[][]} */\n\n  let result = [];\n  const start = input.substring(1);\n  const suba = allSubstrings(start);\n  suba.forEach(function (subresult) {\n    let tmp = subresult.slice(0);\n    tmp[0] = input.charAt(0) + tmp[0];\n    result.push(tmp);\n    tmp = subresult.slice(0);\n    tmp.unshift(input.charAt(0));\n    result.push(tmp);\n  });\n  return result;\n};\n\nexport { allSubstrings };\n//# sourceMappingURL=strings.js.map\n","/*! @orchidjs/unicode-variants | https://github.com/orchidjs/unicode-variants | Apache License (v2) */\nimport { toArray, setToPattern, escape_regex, arrayToPattern, sequencePattern } from './regex.js';\nexport { escape_regex } from './regex.js';\nimport { allSubstrings } from './strings.js';\n\n/**\n * @typedef {{[key:string]:string}} TUnicodeMap\n * @typedef {{[key:string]:Set<string>}} TUnicodeSets\n * @typedef {[[number,number]]} TCodePoints\n * @typedef {{folded:string,composed:string,code_point:number}} TCodePointObj\n * @typedef {{start:number,end:number,length:number,substr:string}} TSequencePart\n */\n/** @type {TCodePoints} */\n\nconst code_points = [[0, 65535]];\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}\\u{2bc}]';\n/** @type {TUnicodeMap} */\n\nlet unicode_map;\n/** @type {RegExp} */\n\nlet multi_char_reg;\nconst max_char_length = 3;\n/** @type {TUnicodeMap} */\n\nconst latin_convert = {};\n/** @type {TUnicodeMap} */\n\nconst latin_condensed = {\n  '/': '⁄∕',\n  '0': '߀',\n  \"a\": \"ⱥɐɑ\",\n  \"aa\": \"ꜳ\",\n  \"ae\": \"æǽǣ\",\n  \"ao\": \"ꜵ\",\n  \"au\": \"ꜷ\",\n  \"av\": \"ꜹꜻ\",\n  \"ay\": \"ꜽ\",\n  \"b\": \"ƀɓƃ\",\n  \"c\": \"ꜿƈȼↄ\",\n  \"d\": \"đɗɖᴅƌꮷԁɦ\",\n  \"e\": \"ɛǝᴇɇ\",\n  \"f\": \"ꝼƒ\",\n  \"g\": \"ǥɠꞡᵹꝿɢ\",\n  \"h\": \"ħⱨⱶɥ\",\n  \"i\": \"ɨı\",\n  \"j\": \"ɉȷ\",\n  \"k\": \"ƙⱪꝁꝃꝅꞣ\",\n  \"l\": \"łƚɫⱡꝉꝇꞁɭ\",\n  \"m\": \"ɱɯϻ\",\n  \"n\": \"ꞥƞɲꞑᴎлԉ\",\n  \"o\": \"øǿɔɵꝋꝍᴑ\",\n  \"oe\": \"œ\",\n  \"oi\": \"ƣ\",\n  \"oo\": \"ꝏ\",\n  \"ou\": \"ȣ\",\n  \"p\": \"ƥᵽꝑꝓꝕρ\",\n  \"q\": \"ꝗꝙɋ\",\n  \"r\": \"ɍɽꝛꞧꞃ\",\n  \"s\": \"ßȿꞩꞅʂ\",\n  \"t\": \"ŧƭʈⱦꞇ\",\n  \"th\": \"þ\",\n  \"tz\": \"ꜩ\",\n  \"u\": \"ʉ\",\n  \"v\": \"ʋꝟʌ\",\n  \"vy\": \"ꝡ\",\n  \"w\": \"ⱳ\",\n  \"y\": \"ƴɏỿ\",\n  \"z\": \"ƶȥɀⱬꝣ\",\n  \"hv\": \"ƕ\"\n};\n\nfor (let latin in latin_condensed) {\n  let unicode = latin_condensed[latin] || '';\n\n  for (let i = 0; i < unicode.length; i++) {\n    let char = unicode.substring(i, i + 1);\n    latin_convert[char] = latin;\n  }\n}\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|') + '|' + accent_pat, 'gu');\n/**\n * Initialize the unicode_map from the give code point ranges\n *\n * @param {TCodePoints=} _code_points\n */\n\nconst initialize = _code_points => {\n  if (unicode_map !== undefined) return;\n  unicode_map = generateMap(_code_points || code_points);\n};\n/**\n * Helper method for normalize a string\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n * @param {string} str\n * @param {string} form\n */\n\nconst normalize = (str, form = 'NFKD') => str.normalize(form);\n/**\n * Remove accents without reordering string\n * calling str.normalize('NFKD') on \\u{594}\\u{595}\\u{596} becomes \\u{596}\\u{594}\\u{595}\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n * @param {string} str\n * @return {string}\n */\n\nconst asciifold = str => {\n  return toArray(str).reduce(\n  /**\n   * @param {string} result\n   * @param {string} char\n   */\n  (result, char) => {\n    return result + _asciifold(char);\n  }, '');\n};\n/**\n * @param {string} str\n * @return {string}\n */\n\nconst _asciifold = str => {\n  str = normalize(str).toLowerCase().replace(convert_pat, (\n  /** @type {string} */\n  char) => {\n    return latin_convert[char] || '';\n  }); //return str;\n\n  return normalize(str, 'NFC');\n};\n/**\n * Generate a list of unicode variants from the list of code points\n * @param {TCodePoints} code_points\n * @yield {TCodePointObj}\n */\n\nfunction* generator(code_points) {\n  for (const [code_point_min, code_point_max] of code_points) {\n    for (let i = code_point_min; i <= code_point_max; i++) {\n      let composed = String.fromCharCode(i);\n      let folded = asciifold(composed);\n\n      if (folded == composed.toLowerCase()) {\n        continue;\n      } // skip when folded is a string longer than 3 characters long\n      // bc the resulting regex patterns will be long\n      // eg:\n      // folded صلى الله عليه وسلم length 18 code point 65018\n      // folded جل جلاله length 8 code point 65019\n\n\n      if (folded.length > max_char_length) {\n        continue;\n      }\n\n      if (folded.length == 0) {\n        continue;\n      }\n\n      yield {\n        folded: folded,\n        composed: composed,\n        code_point: i\n      };\n    }\n  }\n}\n/**\n * Generate a unicode map from the list of code points\n * @param {TCodePoints} code_points\n * @return {TUnicodeSets}\n */\n\nconst generateSets = code_points => {\n  /** @type {{[key:string]:Set<string>}} */\n  const unicode_sets = {};\n  /**\n   * @param {string} folded\n   * @param {string} to_add\n   */\n\n  const addMatching = (folded, to_add) => {\n    /** @type {Set<string>} */\n    const folded_set = unicode_sets[folded] || new Set();\n    const patt = new RegExp('^' + setToPattern(folded_set) + '$', 'iu');\n\n    if (to_add.match(patt)) {\n      return;\n    }\n\n    folded_set.add(escape_regex(to_add));\n    unicode_sets[folded] = folded_set;\n  };\n\n  for (let value of generator(code_points)) {\n    addMatching(value.folded, value.folded);\n    addMatching(value.folded, value.composed);\n  }\n\n  return unicode_sets;\n};\n/**\n * Generate a unicode map from the list of code points\n * ae => (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n *\n * @param {TCodePoints} code_points\n * @return {TUnicodeMap}\n */\n\nconst generateMap = code_points => {\n  /** @type {TUnicodeSets} */\n  const unicode_sets = generateSets(code_points);\n  /** @type {TUnicodeMap} */\n\n  const unicode_map = {};\n  /** @type {string[]} */\n\n  let multi_char = [];\n\n  for (let folded in unicode_sets) {\n    let set = unicode_sets[folded];\n\n    if (set) {\n      unicode_map[folded] = setToPattern(set);\n    }\n\n    if (folded.length > 1) {\n      multi_char.push(escape_regex(folded));\n    }\n  }\n\n  multi_char.sort((a, b) => b.length - a.length);\n  const multi_char_patt = arrayToPattern(multi_char);\n  multi_char_reg = new RegExp('^' + multi_char_patt, 'u');\n  return unicode_map;\n};\n/**\n * Map each element of an array from it's folded value to all possible unicode matches\n * @param {string[]} strings\n * @param {number} min_replacement\n * @return {string}\n */\n\nconst mapSequence = (strings, min_replacement = 1) => {\n  let chars_replaced = 0;\n  strings = strings.map(str => {\n    if (unicode_map[str]) {\n      chars_replaced += str.length;\n    }\n\n    return unicode_map[str] || str;\n  });\n\n  if (chars_replaced >= min_replacement) {\n    return sequencePattern(strings);\n  }\n\n  return '';\n};\n/**\n * Convert a short string and split it into all possible patterns\n * Keep a pattern only if min_replacement is met\n *\n * 'abc'\n * \t\t=> [['abc'],['ab','c'],['a','bc'],['a','b','c']]\n *\t\t=> ['abc-pattern','ab-c-pattern'...]\n *\n *\n * @param {string} str\n * @param {number} min_replacement\n * @return {string}\n */\n\nconst substringsToPattern = (str, min_replacement = 1) => {\n  min_replacement = Math.max(min_replacement, str.length - 1);\n  return arrayToPattern(allSubstrings(str).map(sub_pat => {\n    return mapSequence(sub_pat, min_replacement);\n  }));\n};\n/**\n * Convert an array of sequences into a pattern\n * [{start:0,end:3,length:3,substr:'iii'}...] => (?:iii...)\n *\n * @param {Sequence[]} sequences\n * @param {boolean} all\n */\n\nconst sequencesToPattern = (sequences, all = true) => {\n  let min_replacement = sequences.length > 1 ? 1 : 0;\n  return arrayToPattern(sequences.map(sequence => {\n    let seq = [];\n    const len = all ? sequence.length() : sequence.length() - 1;\n\n    for (let j = 0; j < len; j++) {\n      seq.push(substringsToPattern(sequence.substrs[j] || '', min_replacement));\n    }\n\n    return sequencePattern(seq);\n  }));\n};\n/**\n * Return true if the sequence is already in the sequences\n * @param {Sequence} needle_seq\n * @param {Sequence[]} sequences\n */\n\n\nconst inSequences = (needle_seq, sequences) => {\n  for (const seq of sequences) {\n    if (seq.start != needle_seq.start || seq.end != needle_seq.end) {\n      continue;\n    }\n\n    if (seq.substrs.join('') !== needle_seq.substrs.join('')) {\n      continue;\n    }\n\n    let needle_parts = needle_seq.parts;\n    /**\n     * @param {TSequencePart} part\n     */\n\n    const filter = part => {\n      for (const needle_part of needle_parts) {\n        if (needle_part.start === part.start && needle_part.substr === part.substr) {\n          return false;\n        }\n\n        if (part.length == 1 || needle_part.length == 1) {\n          continue;\n        } // check for overlapping parts\n        // a = ['::=','==']\n        // b = ['::','===']\n        // a = ['r','sm']\n        // b = ['rs','m']\n\n\n        if (part.start < needle_part.start && part.end > needle_part.start) {\n          return true;\n        }\n\n        if (needle_part.start < part.start && needle_part.end > part.start) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    let filtered = seq.parts.filter(filter);\n\n    if (filtered.length > 0) {\n      continue;\n    }\n\n    return true;\n  }\n\n  return false;\n};\n\nclass Sequence {\n  constructor() {\n    /** @type {TSequencePart[]} */\n    this.parts = [];\n    /** @type {string[]} */\n\n    this.substrs = [];\n    this.start = 0;\n    this.end = 0;\n  }\n  /**\n   * @param {TSequencePart|undefined} part\n   */\n\n\n  add(part) {\n    if (part) {\n      this.parts.push(part);\n      this.substrs.push(part.substr);\n      this.start = Math.min(part.start, this.start);\n      this.end = Math.max(part.end, this.end);\n    }\n  }\n\n  last() {\n    return this.parts[this.parts.length - 1];\n  }\n\n  length() {\n    return this.parts.length;\n  }\n  /**\n   * @param {number} position\n   * @param {TSequencePart} last_piece\n   */\n\n\n  clone(position, last_piece) {\n    let clone = new Sequence();\n    let parts = JSON.parse(JSON.stringify(this.parts));\n    let last_part = parts.pop();\n\n    for (const part of parts) {\n      clone.add(part);\n    }\n\n    let last_substr = last_piece.substr.substring(0, position - last_part.start);\n    let clone_last_len = last_substr.length;\n    clone.add({\n      start: last_part.start,\n      end: last_part.start + clone_last_len,\n      length: clone_last_len,\n      substr: last_substr\n    });\n    return clone;\n  }\n\n}\n/**\n * Expand a regular expression pattern to include unicode variants\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * Issue:\n *  ﺊﺋ [ 'ﺊ = \\\\u{fe8a}', 'ﺋ = \\\\u{fe8b}' ]\n *\tbecomes:\tئئ [ 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}', 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}' ]\n *\n *\tİIJ = IIJ = ⅡJ\n *\n * \t1/2/4\n *\n * @param {string} str\n * @return {string|undefined}\n */\n\n\nconst getPattern = str => {\n  initialize();\n  str = asciifold(str);\n  let pattern = '';\n  let sequences = [new Sequence()];\n\n  for (let i = 0; i < str.length; i++) {\n    let substr = str.substring(i);\n    let match = substr.match(multi_char_reg);\n    const char = str.substring(i, i + 1);\n    const match_str = match ? match[0] : null; // loop through sequences\n    // add either the char or multi_match\n\n    let overlapping = [];\n    let added_types = new Set();\n\n    for (const sequence of sequences) {\n      const last_piece = sequence.last();\n\n      if (!last_piece || last_piece.length == 1 || last_piece.end <= i) {\n        // if we have a multi match\n        if (match_str) {\n          const len = match_str.length;\n          sequence.add({\n            start: i,\n            end: i + len,\n            length: len,\n            substr: match_str\n          });\n          added_types.add('1');\n        } else {\n          sequence.add({\n            start: i,\n            end: i + 1,\n            length: 1,\n            substr: char\n          });\n          added_types.add('2');\n        }\n      } else if (match_str) {\n        let clone = sequence.clone(i, last_piece);\n        const len = match_str.length;\n        clone.add({\n          start: i,\n          end: i + len,\n          length: len,\n          substr: match_str\n        });\n        overlapping.push(clone);\n      } else {\n        // don't add char\n        // adding would create invalid patterns: 234 => [2,34,4]\n        added_types.add('3');\n      }\n    } // if we have overlapping\n\n\n    if (overlapping.length > 0) {\n      // ['ii','iii'] before ['i','i','iii']\n      overlapping = overlapping.sort((a, b) => {\n        return a.length() - b.length();\n      });\n\n      for (let clone of overlapping) {\n        // don't add if we already have an equivalent sequence\n        if (inSequences(clone, sequences)) {\n          continue;\n        }\n\n        sequences.push(clone);\n      }\n\n      continue;\n    } // if we haven't done anything unique\n    // clean up the patterns\n    // helps keep patterns smaller\n    // if str = 'r₨㎧aarss', pattern will be 446 instead of 655\n\n\n    if (i > 0 && added_types.size == 1 && !added_types.has('3')) {\n      pattern += sequencesToPattern(sequences, false);\n      let new_seq = new Sequence();\n      const old_seq = sequences[0];\n\n      if (old_seq) {\n        new_seq.add(old_seq.last());\n      }\n\n      sequences = [new_seq];\n    }\n  }\n\n  pattern += sequencesToPattern(sequences, true);\n  return pattern;\n};\n\nexport { _asciifold, asciifold, code_points, generateMap, generateSets, generator, getPattern, initialize, mapSequence, normalize, substringsToPattern, unicode_map };\n//# sourceMappingURL=index.js.map\n","/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */\nimport { asciifold } from '@orchidjs/unicode-variants';\n\n/**\n * A property getter resolving dot-notation\n * @param  {Object}  obj     The root object to fetch property on\n * @param  {String}  name    The optionally dotted property name to fetch\n * @return {Object}          The resolved property value\n */\nconst getAttr = (obj, name) => {\n  if (!obj) return;\n  return obj[name];\n};\n/**\n * A property getter resolving dot-notation\n * @param  {Object}  obj     The root object to fetch property on\n * @param  {String}  name    The optionally dotted property name to fetch\n * @return {Object}          The resolved property value\n */\n\nconst getAttrNesting = (obj, name) => {\n  if (!obj) return;\n  var part,\n      names = name.split(\".\");\n\n  while ((part = names.shift()) && (obj = obj[part]));\n\n  return obj;\n};\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\n\nconst scoreValue = (value, token, weight) => {\n  var score, pos;\n  if (!value) return 0;\n  value = value + '';\n  if (token.regex == null) return 0;\n  pos = value.search(token.regex);\n  if (pos === -1) return 0;\n  score = token.string.length / value.length;\n  if (pos === 0) score += 0.5;\n  return score * weight;\n};\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\n\nconst propToArray = (obj, key) => {\n  var value = obj[key];\n  if (typeof value == 'function') return value;\n\n  if (value && !Array.isArray(value)) {\n    obj[key] = [value];\n  }\n};\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\n\nconst iterate = (object, callback) => {\n  if (Array.isArray(object)) {\n    object.forEach(callback);\n  } else {\n    for (var key in object) {\n      if (object.hasOwnProperty(key)) {\n        callback(object[key], key);\n      }\n    }\n  }\n};\nconst cmp = (a, b) => {\n  if (typeof a === 'number' && typeof b === 'number') {\n    return a > b ? 1 : a < b ? -1 : 0;\n  }\n\n  a = asciifold(a + '').toLowerCase();\n  b = asciifold(b + '').toLowerCase();\n  if (a > b) return 1;\n  if (b > a) return -1;\n  return 0;\n};\n\nexport { cmp, getAttr, getAttrNesting, iterate, propToArray, scoreValue };\n//# sourceMappingURL=utils.js.map\n","/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */\nimport { iterate, cmp, propToArray, getAttrNesting, getAttr, scoreValue } from './utils.js';\nexport { cmp, getAttr, getAttrNesting, iterate, propToArray, scoreValue } from './utils.js';\nimport { escape_regex, getPattern } from '@orchidjs/unicode-variants';\nexport { getPattern } from '@orchidjs/unicode-variants';\n\n/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\nclass Sifter {\n  // []|{};\n\n  /**\n   * Textually searches arrays and hashes of objects\n   * by property (or multiple properties). Designed\n   * specifically for autocomplete.\n   *\n   */\n  constructor(items, settings) {\n    this.items = void 0;\n    this.settings = void 0;\n    this.items = items;\n    this.settings = settings || {\n      diacritics: true\n    };\n  }\n\n  /**\n   * Splits a search string into an array of individual\n   * regexps to be used to match results.\n   *\n   */\n  tokenize(query, respect_word_boundaries, weights) {\n    if (!query || !query.length) return [];\n    const tokens = [];\n    const words = query.split(/\\s+/);\n    var field_regex;\n\n    if (weights) {\n      field_regex = new RegExp('^(' + Object.keys(weights).map(escape_regex).join('|') + ')\\:(.*)$');\n    }\n\n    words.forEach(word => {\n      let field_match;\n      let field = null;\n      let regex = null; // look for \"field:query\" tokens\n\n      if (field_regex && (field_match = word.match(field_regex))) {\n        field = field_match[1];\n        word = field_match[2];\n      }\n\n      if (word.length > 0) {\n        if (this.settings.diacritics) {\n          regex = getPattern(word) || null;\n        } else {\n          regex = escape_regex(word);\n        }\n\n        if (regex && respect_word_boundaries) regex = \"\\\\b\" + regex;\n      }\n\n      tokens.push({\n        string: word,\n        regex: regex ? new RegExp(regex, 'iu') : null,\n        field: field\n      });\n    });\n    return tokens;\n  }\n\n  /**\n   * Returns a function to be used to score individual results.\n   *\n   * Good matches will have a higher score than poor matches.\n   * If an item is not a match, 0 will be returned by the function.\n   *\n   * @returns {T.ScoreFn}\n   */\n  getScoreFunction(query, options) {\n    var search = this.prepareSearch(query, options);\n    return this._getScoreFunction(search);\n  }\n  /**\n   * @returns {T.ScoreFn}\n   *\n   */\n\n\n  _getScoreFunction(search) {\n    const tokens = search.tokens,\n          token_count = tokens.length;\n\n    if (!token_count) {\n      return function () {\n        return 0;\n      };\n    }\n\n    const fields = search.options.fields,\n          weights = search.weights,\n          field_count = fields.length,\n          getAttrFn = search.getAttrFn;\n\n    if (!field_count) {\n      return function () {\n        return 1;\n      };\n    }\n    /**\n     * Calculates the score of an object\n     * against the search query.\n     *\n     */\n\n\n    const scoreObject = function () {\n      if (field_count === 1) {\n        return function (token, data) {\n          const field = fields[0].field;\n          return scoreValue(getAttrFn(data, field), token, weights[field] || 1);\n        };\n      }\n\n      return function (token, data) {\n        var sum = 0; // is the token specific to a field?\n\n        if (token.field) {\n          const value = getAttrFn(data, token.field);\n\n          if (!token.regex && value) {\n            sum += 1 / field_count;\n          } else {\n            sum += scoreValue(value, token, 1);\n          }\n        } else {\n          iterate(weights, (weight, field) => {\n            sum += scoreValue(getAttrFn(data, field), token, weight);\n          });\n        }\n\n        return sum / field_count;\n      };\n    }();\n\n    if (token_count === 1) {\n      return function (data) {\n        return scoreObject(tokens[0], data);\n      };\n    }\n\n    if (search.options.conjunction === 'and') {\n      return function (data) {\n        var score,\n            sum = 0;\n\n        for (let token of tokens) {\n          score = scoreObject(token, data);\n          if (score <= 0) return 0;\n          sum += score;\n        }\n\n        return sum / token_count;\n      };\n    } else {\n      return function (data) {\n        var sum = 0;\n        iterate(tokens, token => {\n          sum += scoreObject(token, data);\n        });\n        return sum / token_count;\n      };\n    }\n  }\n\n  /**\n   * Returns a function that can be used to compare two\n   * results, for sorting purposes. If no sorting should\n   * be performed, `null` will be returned.\n   *\n   * @return function(a,b)\n   */\n  getSortFunction(query, options) {\n    var search = this.prepareSearch(query, options);\n    return this._getSortFunction(search);\n  }\n\n  _getSortFunction(search) {\n    var implicit_score,\n        sort_flds = [];\n    const self = this,\n          options = search.options,\n          sort = !search.query && options.sort_empty ? options.sort_empty : options.sort;\n\n    if (typeof sort == 'function') {\n      return sort.bind(this);\n    }\n    /**\n     * Fetches the specified sort field value\n     * from a search result item.\n     *\n     */\n\n\n    const get_field = function get_field(name, result) {\n      if (name === '$score') return result.score;\n      return search.getAttrFn(self.items[result.id], name);\n    }; // parse options\n\n\n    if (sort) {\n      for (let s of sort) {\n        if (search.query || s.field !== '$score') {\n          sort_flds.push(s);\n        }\n      }\n    } // the \"$score\" field is implied to be the primary\n    // sort field, unless it's manually specified\n\n\n    if (search.query) {\n      implicit_score = true;\n\n      for (let fld of sort_flds) {\n        if (fld.field === '$score') {\n          implicit_score = false;\n          break;\n        }\n      }\n\n      if (implicit_score) {\n        sort_flds.unshift({\n          field: '$score',\n          direction: 'desc'\n        });\n      } // without a search.query, all items will have the same score\n\n    } else {\n      sort_flds = sort_flds.filter(fld => fld.field !== '$score');\n    } // build function\n\n\n    const sort_flds_count = sort_flds.length;\n\n    if (!sort_flds_count) {\n      return null;\n    }\n\n    return function (a, b) {\n      var result, field;\n\n      for (let sort_fld of sort_flds) {\n        field = sort_fld.field;\n        let multiplier = sort_fld.direction === 'desc' ? -1 : 1;\n        result = multiplier * cmp(get_field(field, a), get_field(field, b));\n        if (result) return result;\n      }\n\n      return 0;\n    };\n  }\n\n  /**\n   * Parses a search query and returns an object\n   * with tokens and fields ready to be populated\n   * with results.\n   *\n   */\n  prepareSearch(query, optsUser) {\n    const weights = {};\n    var options = Object.assign({}, optsUser);\n    propToArray(options, 'sort');\n    propToArray(options, 'sort_empty'); // convert fields to new format\n\n    if (options.fields) {\n      propToArray(options, 'fields');\n      const fields = [];\n      options.fields.forEach(field => {\n        if (typeof field == 'string') {\n          field = {\n            field: field,\n            weight: 1\n          };\n        }\n\n        fields.push(field);\n        weights[field.field] = 'weight' in field ? field.weight : 1;\n      });\n      options.fields = fields;\n    }\n\n    return {\n      options: options,\n      query: query.toLowerCase().trim(),\n      tokens: this.tokenize(query, options.respect_word_boundaries, weights),\n      total: 0,\n      items: [],\n      weights: weights,\n      getAttrFn: options.nesting ? getAttrNesting : getAttr\n    };\n  }\n\n  /**\n   * Searches through all items and returns a sorted array of matches.\n   *\n   */\n  search(query, options) {\n    var self = this,\n        score,\n        search;\n    search = this.prepareSearch(query, options);\n    options = search.options;\n    query = search.query; // generate result scoring function\n\n    const fn_score = options.score || self._getScoreFunction(search); // perform search and sort\n\n\n    if (query.length) {\n      iterate(self.items, (item, id) => {\n        score = fn_score(item);\n\n        if (options.filter === false || score > 0) {\n          search.items.push({\n            'score': score,\n            'id': id\n          });\n        }\n      });\n    } else {\n      iterate(self.items, (_, id) => {\n        search.items.push({\n          'score': 1,\n          'id': id\n        });\n      });\n    }\n\n    const fn_sort = self._getSortFunction(search);\n\n    if (fn_sort) search.items.sort(fn_sort); // apply limits\n\n    search.total = search.items.length;\n\n    if (typeof options.limit === 'number') {\n      search.items = search.items.slice(0, options.limit);\n    }\n\n    return search;\n  }\n\n}\n\nexport { Sifter };\n//# sourceMappingURL=sifter.js.map\n","\nimport { asciifold } from '@orchidjs/unicode-variants';\nimport * as T from './types';\n\n\n/**\n * A property getter resolving dot-notation\n * @param  {Object}  obj     The root object to fetch property on\n * @param  {String}  name    The optionally dotted property name to fetch\n * @return {Object}          The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n    if (!obj ) return;\n    return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param  {Object}  obj     The root object to fetch property on\n * @param  {String}  name    The optionally dotted property name to fetch\n * @return {Object}          The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n    if (!obj ) return;\n    var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n    return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tif( token.regex == null ) return 0;\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\n\tif( typeof value == 'function' ) return value;\n\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","\nimport { iterate } from '@orchidjs/sifter/lib/utils';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\11\\12\\14\\15\\40]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\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\nimport {replaceNode} from '../vanilla';\n\n\nexport const highlight = (element:HTMLElement, regex:string|RegExp) => {\n\n\tif( regex === null ) return;\n\n\t// convet string to regex\n\tif( typeof regex === 'string' ){\n\n\t\tif( !regex.length ) return;\n\t\tregex = new RegExp(regex, 'i');\n\t}\n\n\n\t// Wrap matching part of text node with highlighting <span>, e.g.\n\t// Soccer  ->  <span class=\"highlight\">Soc</span>cer  for regex = /soc/i\n\tconst highlightText = ( node:Text ):number => {\n\n\t\tvar match = node.data.match(regex);\n\t\tif( match && node.data.length > 0 ){\n\t\t\tvar spannode\t\t= document.createElement('span');\n\t\t\tspannode.className\t= 'highlight';\n\t\t\tvar middlebit\t\t= node.splitText(match.index as number);\n\n\t\t\tmiddlebit.splitText(match[0]!.length);\n\t\t\tvar middleclone\t\t= middlebit.cloneNode(true);\n\n\t\t\tspannode.appendChild(middleclone);\n\t\t\treplaceNode(middlebit, spannode);\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\t// Recurse element node, looking for child text nodes to highlight, unless element\n\t// is childless, <script>, <style>, or already highlighted: <span class=\"hightlight\">\n\tconst highlightChildren = ( node:Element ):void => {\n\t\tif( node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && ( node.className !== 'highlight' || node.tagName !== 'SPAN' ) ){\n\t\t\tArray.from(node.childNodes).forEach(element => {\n\t\t\t\thighlightRecursive(element);\n\t\t\t});\n\t\t}\n\t};\n\n\n\tconst highlightRecursive = ( node:Node|Element ):number => {\n\n\t\tif( node.nodeType === 3 ){\n\t\t\treturn highlightText(node as Text);\n\t\t}\n\n\t\thighlightChildren(node as Element);\n\n\t\treturn 0;\n\t};\n\n\thighlightRecursive( element );\n};\n\n/**\n * removeHighlight fn copied from highlight v5 and\n * edited to remove with(), pass js strict mode, and use without jquery\n */\nexport const removeHighlight = (el:HTMLElement) => {\n\tvar elements = el.querySelectorAll(\"span.highlight\");\n\tArray.prototype.forEach.call(elements, function(el:HTMLElement){\n\t\tvar parent = el.parentNode as Node;\n\t\tparent.replaceChild(el.firstChild as Node, el);\n\t\tparent.normalize();\n\t});\n};\n","export const KEY_A\t\t\t\t= 65;\nexport const KEY_RETURN\t\t\t= 13;\nexport const KEY_ESC\t\t\t= 27;\nexport const KEY_LEFT\t\t\t= 37;\nexport const KEY_UP\t\t\t\t= 38;\nexport const KEY_RIGHT\t\t\t= 39;\nexport const KEY_DOWN\t\t\t= 40;\nexport const KEY_BACKSPACE\t\t= 8;\nexport const KEY_DELETE\t\t\t= 46;\nexport const KEY_TAB\t\t\t= 9;\n\nexport const IS_MAC      \t\t= typeof navigator === 'undefined' ? false : /Mac/.test(navigator.userAgent);\nexport const KEY_SHORTCUT\t\t= IS_MAC ? 'metaKey' : 'ctrlKey'; // ctrl key or apple key for ma\n","\nexport 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: null,\n\tcreateOnBlur: false,\n\tcreateFilter: null,\n\thighlight: true,\n\topenOnFocus: true,\n\tshouldOpen: null,\n\tmaxOptions: 50,\n\tmaxItems: null,\n\thideSelected: null,\n\tduplicates: false,\n\taddPrecedence: false,\n\tselectOnTab: false,\n\tpreload: null,\n\tallowEmptyOption: false,\n\t//closeAfterSelect: false,\n\trefreshThrottle: 300,\n\n\n\tloadThrottle: 300,\n\tloadingClass: 'loading',\n\n\tdataAttr: null, //'data-data',\n\toptgroupField: 'optgroup',\n\tvalueField: 'value',\n\tlabelField: 'text',\n\tdisabledField: 'disabled',\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: 'ts-wrapper',\n\tcontrolClass: 'ts-control',\n\tdropdownClass: 'ts-dropdown',\n\tdropdownContentClass: 'ts-dropdown-content',\n\titemClass: 'item',\n\toptionClass: 'option',\n\n\tdropdownParent: null,\n\tcontrolInput: '<input type=\"text\" autocomplete=\"off\" size=\"1\" />',\n\n\tcopyClassesToDropdown: false,\n\n\tplaceholder: null,\n\thidePlaceholder: null,\n\n\tshouldLoad: function(query:string):boolean{\n\t\treturn query.length > 0;\n\t},\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","\nimport TomSelect from './tom-select';\nimport { TomLoadCallback } from './types/index';\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 */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\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 */\nexport const escape_html = (str:string):string => {\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/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number) => {\n\tif( timeout > 0 ){\n\t\treturn setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\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\tevent_args[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 of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n","import defaults from './defaults';\nimport { hash_key } from './utils';\nimport { TomOption, TomSettings, RecursivePartial } from './types/index';\nimport { iterate } from '@orchidjs/sifter/lib/utils';\nimport { TomInput } from './types/index';\n\n\nexport default function getSettings( input:TomInput, settings_user:RecursivePartial<TomSettings>):TomSettings{\n\tvar settings:TomSettings\t= Object.assign({}, defaults, settings_user);\n\n\tvar attr_data\t\t\t\t= settings.dataAttr;\n\tvar field_label\t\t\t\t= settings.labelField;\n\tvar field_value\t\t\t\t= settings.valueField;\n\tvar field_disabled\t\t\t= settings.disabledField;\n\tvar field_optgroup\t\t\t= settings.optgroupField;\n\tvar field_optgroup_label\t= settings.optgroupLabelField;\n\tvar field_optgroup_value\t= settings.optgroupValueField;\n\n\tvar tag_name\t\t\t\t= input.tagName.toLowerCase();\n\tvar placeholder\t\t\t\t= input.getAttribute('placeholder') || input.getAttribute('data-placeholder');\n\n\tif (!placeholder && !settings.allowEmptyOption) {\n\t\tlet option\t\t= input.querySelector('option[value=\"\"]');\n\t\tif( option ){\n\t\t\tplaceholder = option.textContent;\n\t\t}\n\n\t}\n\n\tvar settings_element:{\n\t\tplaceholder\t: null|string,\n\t\toptions\t\t: TomOption[],\n\t\toptgroups\t: TomOption[],\n\t\titems\t\t: string[],\n\t\tmaxItems\t: null|number,\n\t} = {\n\t\tplaceholder\t: placeholder,\n\t\toptions\t\t: [],\n\t\toptgroups\t: [],\n\t\titems\t\t: [],\n\t\tmaxItems\t: null,\n\t};\n\n\n\t/**\n\t * Initialize from a <select> element.\n\t *\n\t */\n\tvar init_select = () => {\n\t\tvar tagName;\n\t\tvar options = settings_element.options;\n\t\tvar optionsMap:{[key:string]:any} = {};\n\t\tvar group_count = 1;\n\t\tlet $order = 0;\n\n\t\tvar readData = (el:HTMLElement):TomOption => {\n\n\t\t\tvar data\t= Object.assign({},el.dataset); // get plain object from DOMStringMap\n\t\t\tvar json\t= attr_data && data[attr_data];\n\n\t\t\tif( typeof json === 'string' && json.length ){\n\t\t\t\tdata = Object.assign(data,JSON.parse(json));\n\t\t\t}\n\n\t\t\treturn data;\n\t\t};\n\n\t\tvar addOption = (option:HTMLOptionElement, group?:string) => {\n\n\t\t\tvar value = hash_key(option.value);\n\t\t\tif ( value == null ) return;\n\t\t\tif ( !value && !settings.allowEmptyOption) return;\n\n\t\t\t// if the option already exists, it's probably been\n\t\t\t// duplicated in another optgroup. in this case, push\n\t\t\t// the current group to the \"optgroup\" property on the\n\t\t\t// existing option so that it's rendered in both places.\n\t\t\tif (optionsMap.hasOwnProperty(value)) {\n\t\t\t\tif (group) {\n\t\t\t\t\tvar arr = optionsMap[value][field_optgroup];\n\t\t\t\t\tif (!arr) {\n\t\t\t\t\t\toptionsMap[value][field_optgroup] = group;\n\t\t\t\t\t} else if (!Array.isArray(arr)) {\n\t\t\t\t\t\toptionsMap[value][field_optgroup] = [arr, group];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tarr.push(group);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}else{\n\n\t\t\t\tvar option_data             = readData(option);\n\t\t\t\toption_data[field_label]    = option_data[field_label] || option.textContent;\n\t\t\t\toption_data[field_value]    = option_data[field_value] || value;\n\t\t\t\toption_data[field_disabled] = option_data[field_disabled] || option.disabled;\n\t\t\t\toption_data[field_optgroup] = option_data[field_optgroup] || group;\n\t\t\t\toption_data.$option\t\t\t= option;\n\t\t\t\toption_data.$order\t\t\t= option_data.$order || ++$order;\n\n\t\t\t\toptionsMap[value] = option_data;\n\t\t\t\toptions.push(option_data);\n\t\t\t}\n\n\t\t\tif( option.selected ){\n\t\t\t\tsettings_element.items.push(value);\n\t\t\t}\n\t\t};\n\n\t\tvar addGroup = ( optgroup:HTMLOptGroupElement ) => {\n\t\t\tvar id:string, optgroup_data\n\n\t\t\toptgroup_data\t\t\t\t\t\t\t= readData(optgroup);\n\t\t\toptgroup_data[field_optgroup_label]\t\t= optgroup_data[field_optgroup_label] || optgroup.getAttribute('label') || '';\n\t\t\toptgroup_data[field_optgroup_value]\t\t= optgroup_data[field_optgroup_value] || group_count++;\n\t\t\toptgroup_data[field_disabled]\t\t\t= optgroup_data[field_disabled] || optgroup.disabled;\n\t\t\toptgroup_data.$order\t\t\t\t\t= optgroup_data.$order || ++$order;\n\n\t\t\tsettings_element.optgroups.push(optgroup_data);\n\n\t\t\tid = optgroup_data[field_optgroup_value];\n\n\t\t\titerate(optgroup.children, (option)=>{\n\t\t\t\taddOption(option as HTMLOptionElement, id);\n\t\t\t});\n\n\t\t};\n\n\t\tsettings_element.maxItems = input.hasAttribute('multiple') ? null : 1;\n\n\t\titerate(input.children,(child)=>{\n\t\t\ttagName = child.tagName.toLowerCase();\n\t\t\tif (tagName === 'optgroup') {\n\t\t\t\taddGroup(child as HTMLOptGroupElement);\n\t\t\t} else if (tagName === 'option') {\n\t\t\t\taddOption(child as HTMLOptionElement);\n\t\t\t}\n\t\t});\n\n\t};\n\n\n\t/**\n\t * Initialize from a <input type=\"text\"> element.\n\t *\n\t */\n\tvar init_textbox = () => {\n\t\tconst data_raw = input.getAttribute(attr_data);\n\n\t\tif (!data_raw) {\n\t\t\tvar value = input.value.trim() || '';\n\t\t\tif (!settings.allowEmptyOption && !value.length) return;\n\t\t\tconst values = value.split(settings.delimiter);\n\n\t\t\titerate( values, (value) => {\n\t\t\t\tconst option:TomOption = {};\n\t\t\t\toption[field_label] = value;\n\t\t\t\toption[field_value] = value;\n\t\t\t\tsettings_element.options.push(option);\n\t\t\t});\n\t\t\tsettings_element.items = values;\n\t\t} else {\n\t\t\tsettings_element.options = JSON.parse(data_raw);\n\t\t\titerate( settings_element.options, (opt) => {\n\t\t\t\tsettings_element.items.push(opt[field_value]);\n\t\t\t});\n\t\t}\n\t};\n\n\n\tif (tag_name === 'select') {\n\t\tinit_select();\n\t} else {\n\t\tinit_textbox();\n\t}\n\n\treturn Object.assign( {}, defaults, settings_element, settings_user) as TomSettings;\n};\n","\nimport MicroEvent from './contrib/microevent';\nimport MicroPlugin from './contrib/microplugin';\nimport { Sifter, iterate } from '@orchidjs/sifter';\nimport { escape_regex } from '@orchidjs/unicode-variants';\nimport { TomInput, TomArgObject, TomOption, TomOptions, TomCreateFilter, TomCreateCallback, TomItem, TomSettings, TomTemplateNames, TomClearFilter, RecursivePartial } from './types/index';\nimport {highlight, removeHighlight} from './contrib/highlight';\nimport * as constants from './constants';\nimport getSettings from './getSettings';\nimport {\n\thash_key,\n\tget_hash,\n\tescape_html,\n\tdebounce_events,\n\tgetSelection,\n\tpreventDefault,\n\taddEvent,\n\tloadDebounce,\n\ttimeout,\n\tisKeyDown,\n\tgetId,\n\taddSlashes,\n\tappend\n} from './utils';\n\nimport {\n\tgetDom,\n\tisHtmlString,\n\tescapeQuery,\n\ttriggerEvent,\n\tapplyCSS,\n\taddClasses,\n\tremoveClasses,\n\tparentMatch,\n\tgetTail,\n\tisEmptyObject,\n\tnodeIndex,\n\tsetAttr,\n\treplaceNode\n} from './vanilla';\n\nvar instance_i = 0;\n\nexport default class TomSelect extends MicroPlugin(MicroEvent){\n\n\tpublic control_input\t\t\t: HTMLInputElement;\n\tpublic wrapper\t\t\t\t\t: HTMLElement;\n\tpublic dropdown\t\t\t\t\t: HTMLElement;\n\tpublic control\t\t\t\t\t: HTMLElement;\n\tpublic dropdown_content\t\t\t: HTMLElement;\n\tpublic focus_node\t\t\t\t: HTMLElement;\n\n\tpublic order\t\t\t\t\t: number = 0;\n\tpublic settings\t\t\t\t\t: TomSettings;\n\tpublic input\t\t\t\t\t: TomInput;\n\tpublic tabIndex\t\t\t\t\t: number;\n\tpublic is_select_tag\t\t\t: boolean;\n\tpublic rtl\t\t\t\t\t\t: boolean;\n\tprivate inputId\t\t\t\t\t: string;\n\n\tprivate _destroy\t\t\t\t!: () => void;\n\tpublic sifter\t\t\t\t\t: Sifter;\n\n\n\tpublic isOpen\t\t\t\t\t: boolean = false;\n\tpublic isDisabled\t\t\t\t: boolean = false;\n\tpublic isReadOnly\t\t\t\t: boolean = false;\n\tpublic isRequired\t\t\t\t: boolean;\n\tpublic isInvalid\t\t\t\t: boolean = false; // @deprecated 1.8\n\tpublic isValid\t\t\t\t\t: boolean = true;\n\tpublic isLocked\t\t\t\t\t: boolean = false;\n\tpublic isFocused\t\t\t\t: boolean = false;\n\tpublic isInputHidden\t\t\t: boolean = false;\n\tpublic isSetup\t\t\t\t\t: boolean = false;\n\tpublic ignoreFocus\t\t\t\t: boolean = false;\n\tpublic ignoreHover\t\t\t\t: boolean = false;\n\tpublic hasOptions\t\t\t\t: boolean = false;\n\tpublic currentResults\t\t\t?: ReturnType<Sifter['search']>;\n\tpublic lastValue\t\t\t\t: string = '';\n\tpublic caretPos\t\t\t\t\t: number = 0;\n\tpublic loading\t\t\t\t\t: number = 0;\n\tpublic loadedSearches\t\t\t: { [key: string]: boolean } = {};\n\n\tpublic activeOption\t\t\t\t: null|HTMLElement = null;\n\tpublic activeItems\t\t\t\t: TomItem[] = [];\n\n\tpublic optgroups\t\t\t\t: TomOptions = {};\n\tpublic options\t\t\t\t\t: TomOptions = {};\n\tpublic userOptions\t\t\t\t: {[key:string]:boolean} = {};\n\tpublic items\t\t\t\t\t: string[] = [];\n\n\tprivate refreshTimeout\t\t\t: null|ReturnType<typeof setTimeout> = null;\n\n\n\tconstructor( input_arg: string|TomInput, user_settings:RecursivePartial<TomSettings> ){\n\t\tsuper();\n\n\t\tinstance_i++;\n\n\t\tvar dir;\n\t\tvar input\t\t\t\t= getDom( input_arg ) as TomInput;\n\n\t\tif( input.tomselect ){\n\t\t\tthrow new Error('Tom Select already initialized on this element');\n\t\t}\n\n\n\t\tinput.tomselect\t\t\t= this;\n\n\n\t\t// detect rtl environment\n\t\tvar computedStyle\t\t= window.getComputedStyle && window.getComputedStyle(input, null);\n\t\tdir\t\t\t\t\t\t= computedStyle.getPropertyValue('direction');\n\n\t\t// setup default state\n\t\tconst settings\t\t\t= getSettings( input, user_settings );\n\t\tthis.settings\t\t\t= settings;\n\t\tthis.input\t\t\t\t= input;\n\t\tthis.tabIndex\t\t\t= input.tabIndex || 0;\n\t\tthis.is_select_tag\t\t= input.tagName.toLowerCase() === 'select';\n\t\tthis.rtl\t\t\t\t= /rtl/i.test(dir);\n\t\tthis.inputId\t\t\t= getId(input, 'tomselect-'+instance_i);\n\t\tthis.isRequired\t\t\t= input.required;\n\n\n\t\t// search system\n\t\tthis.sifter = new Sifter(this.options, {diacritics: settings.diacritics});\n\n\t\t// option-dependent defaults\n\t\tsettings.mode = settings.mode || (settings.maxItems === 1 ? 'single' : 'multi');\n\t\tif (typeof settings.hideSelected !== 'boolean') {\n\t\t\tsettings.hideSelected = settings.mode === 'multi';\n\t\t}\n\n\t\tif( typeof settings.hidePlaceholder !== 'boolean' ){\n\t\t\tsettings.hidePlaceholder = settings.mode !== 'multi';\n\t\t}\n\n\t\t// set up createFilter callback\n\t\tvar filter = settings.createFilter;\n\t\tif( typeof filter !== 'function' ){\n\n\t\t\tif( typeof filter === 'string' ){\n\t\t\t\tfilter = new RegExp(filter);\n\t\t\t}\n\n\t\t\tif( filter instanceof RegExp ){\n\t\t\t\tsettings.createFilter = (input) => (filter as RegExp).test(input);\n\t\t\t}else{\n\t\t\t\tsettings.createFilter = (value) => {\n\t\t\t\t\treturn this.settings.duplicates || !this.options[value];\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\n\t\tthis.initializePlugins(settings.plugins);\n\t\tthis.setupCallbacks();\n\t\tthis.setupTemplates();\n\n\n\t\t// Create all elements\n\t\tconst wrapper\t\t\t= getDom('<div>');\n\t\tconst control\t\t\t= getDom('<div>');\n\t\tconst dropdown\t\t\t= this._render('dropdown');\n\t\tconst dropdown_content\t= getDom(`<div role=\"listbox\" tabindex=\"-1\">`);\n\n\t\tconst classes\t\t\t= this.input.getAttribute('class') || '';\n\t\tconst inputMode\t\t\t= settings.mode;\n\n\t\tvar control_input: HTMLInputElement;\n\n\n\t\taddClasses( wrapper, settings.wrapperClass, classes, inputMode);\n\n\n\t\taddClasses(control,settings.controlClass);\n\t\tappend( wrapper, control );\n\n\n\t\taddClasses(dropdown, settings.dropdownClass, inputMode);\n\t\tif( settings.copyClassesToDropdown ){\n\t\t\taddClasses( dropdown, classes);\n\t\t}\n\n\n\t\taddClasses(dropdown_content, settings.dropdownContentClass);\n\t\tappend( dropdown, dropdown_content );\n\n\t\tgetDom( settings.dropdownParent || wrapper ).appendChild( dropdown );\n\n\n\t\t// default controlInput\n\t\tif( isHtmlString(settings.controlInput) ){\n\t\t\tcontrol_input\t\t= getDom(settings.controlInput ) as HTMLInputElement;\n\n\t\t\t// set attributes\n\t\t\tvar attrs = ['autocorrect','autocapitalize','autocomplete','spellcheck'];\n\t\t\titerate(attrs,(attr:string) => {\n\t\t\t\tif( input.getAttribute(attr) ){\n\t\t\t\t\tsetAttr(control_input,{[attr]:input.getAttribute(attr)});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontrol_input.tabIndex = -1;\n\t\t\tcontrol.appendChild( control_input );\n\t\t\tthis.focus_node\t\t= control_input;\n\n\t\t// dom element\n\t\t}else if( settings.controlInput ){\n\t\t\tcontrol_input\t\t= getDom( settings.controlInput ) as HTMLInputElement;\n\t\t\tthis.focus_node\t\t= control_input;\n\n\t\t}else{\n\t\t\tcontrol_input\t\t= getDom('<input/>') as HTMLInputElement;\n\t\t\tthis.focus_node\t\t= control;\n\t\t}\n\n\t\tthis.wrapper\t\t\t= wrapper;\n\t\tthis.dropdown\t\t\t= dropdown;\n\t\tthis.dropdown_content\t= dropdown_content;\n\t\tthis.control \t\t\t= control;\n\t\tthis.control_input\t\t= control_input;\n\n\t\tthis.setup();\n\t}\n\n\t/**\n\t * set up event bindings.\n\t *\n\t */\n\tsetup(){\n\n\t\tconst self = this;\n\t\tconst settings\t\t\t\t= self.settings;\n\t\tconst control_input\t\t\t= self.control_input;\n\t\tconst dropdown\t\t\t\t= self.dropdown;\n\t\tconst dropdown_content\t\t= self.dropdown_content;\n\t\tconst wrapper\t\t\t\t= self.wrapper;\n\t\tconst control\t\t\t\t= self.control;\n\t\tconst input\t\t\t\t\t= self.input;\n\t\tconst focus_node\t\t\t= self.focus_node;\n\t\tconst passive_event\t\t\t= { passive: true };\n\t\tconst listboxId\t\t\t\t= self.inputId +'-ts-dropdown';\n\n\n\t\tsetAttr(dropdown_content,{\n\t\t\tid: listboxId\n\t\t});\n\n\t\tsetAttr(focus_node,{\n\t\t\trole:'combobox',\n\t\t\t'aria-haspopup':'listbox',\n\t\t\t'aria-expanded':'false',\n\t\t\t'aria-controls':listboxId\n\t\t});\n\n\t\tconst control_id\t= getId(focus_node,self.inputId + '-ts-control');\n\t\tconst query\t\t\t= \"label[for='\"+escapeQuery(self.inputId)+\"']\";\n\t\tconst label\t\t\t= document.querySelector(query);\n\t\tconst label_click\t= self.focus.bind(self);\n\t\tif( label ){\n\t\t\taddEvent(label,'click', label_click );\n\t\t\tsetAttr(label,{for:control_id});\n\t\t\tconst label_id = getId(label,self.inputId+'-ts-label');\n\t\t\tsetAttr(focus_node,{'aria-labelledby':label_id});\n\t\t\tsetAttr(dropdown_content,{'aria-labelledby':label_id});\n\t\t}\n\n\t\twrapper.style.width = input.style.width;\n\n\t\tif (self.plugins.names.length) {\n\t\t\tconst classes_plugins = 'plugin-' + self.plugins.names.join(' plugin-');\n\t\t\taddClasses( [wrapper,dropdown], classes_plugins);\n\t\t}\n\n\t\tif ((settings.maxItems === null || settings.maxItems > 1) && self.is_select_tag ){\n\t\t\tsetAttr(input,{multiple:'multiple'});\n\t\t}\n\n\t\tif (settings.placeholder) {\n\t\t\tsetAttr(control_input,{placeholder:settings.placeholder});\n\t\t}\n\n\t\t// if splitOn was not passed in, construct it from the delimiter to allow pasting universally\n\t\tif (!settings.splitOn && settings.delimiter) {\n\t\t\tsettings.splitOn = new RegExp('\\\\s*' + escape_regex(settings.delimiter) + '+\\\\s*');\n\t\t}\n\n\t\t// debounce user defined load() if loadThrottle > 0\n\t\t// after initializePlugins() so plugins can create/modify user defined loaders\n\t\tif( settings.load && settings.loadThrottle ){\n\t\t\tsettings.load = loadDebounce(settings.load,settings.loadThrottle)\n\t\t}\n\n\t\taddEvent(dropdown,'mousemove', () => {\n\t\t\tself.ignoreHover = false;\n\t\t});\n\n\t\taddEvent(dropdown,'mouseenter', (e) => {\n\n\t\t\tvar target_match = parentMatch(e.target as HTMLElement, '[data-selectable]', dropdown);\n\t\t\tif( target_match ) self.onOptionHover( e as MouseEvent, target_match );\n\n\t\t}, {capture:true});\n\n\t\t// clicking on an option should select it\n\t\taddEvent(dropdown,'click',(evt) => {\n\t\t\tconst option = parentMatch(evt.target as HTMLElement, '[data-selectable]');\n\t\t\tif( option ){\n\t\t\t\tself.onOptionSelect( evt as MouseEvent, option );\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t}\n\t\t});\n\n\t\taddEvent(control,'click', (evt) => {\n\n\t\t\tvar target_match = parentMatch( evt.target as HTMLElement, '[data-ts-item]', control);\n\t\t\tif( target_match && self.onItemSelect(evt as MouseEvent, target_match as TomItem) ){\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// retain focus (see control_input mousedown)\n\t\t\tif( control_input.value != '' ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tself.onClick();\n\t\t\tpreventDefault(evt,true);\n\t\t});\n\n\n\t\t// keydown on focus_node for arrow_down/arrow_up\n\t\taddEvent(focus_node,'keydown',\t\t(e) => self.onKeyDown(e as KeyboardEvent) );\n\n\t\t// keypress and input/keyup\n\t\taddEvent(control_input,'keypress',\t(e) => self.onKeyPress(e as KeyboardEvent) );\n\t\taddEvent(control_input,'input',\t\t(e) => self.onInput(e as KeyboardEvent) );\n\t\taddEvent(focus_node,'blur', \t\t(e) => self.onBlur(e as FocusEvent) );\n\t\taddEvent(focus_node,'focus',\t\t(e) => self.onFocus(e as MouseEvent) );\n\t\taddEvent(control_input,'paste',\t\t(e) => self.onPaste(e as MouseEvent) );\n\n\n\t\tconst doc_mousedown = (evt:Event) => {\n\n\t\t\t// blur if target is outside of this instance\n\t\t\t// dropdown is not always inside wrapper\n\t\t\tconst target = evt.composedPath()[0];\n\t\t\tif( !wrapper.contains(target as HTMLElement) && !dropdown.contains(target as HTMLElement) ){\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\tself.blur();\n\t\t\t\t}\n\t\t\t\tself.inputState();\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\t// retain focus by preventing native handling. if the\n\t\t\t// event target is the input it should not be modified.\n\t\t\t// otherwise, text selection within the input won't work.\n\t\t\t// Fixes bug #212 which is no covered by tests\n\t\t\tif( target == control_input && self.isOpen ){\n\t\t\t\tevt.stopPropagation();\n\n\t\t\t// clicking anywhere in the control should not blur the control_input (which would close the dropdown)\n\t\t\t}else{\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t}\n\n\t\t};\n\n\t\tconst win_scroll = () => {\n\t\t\tif (self.isOpen) {\n\t\t\t\tself.positionDropdown();\n\t\t\t}\n\t\t};\n\n\n\t\taddEvent(document,'mousedown', doc_mousedown);\n\t\taddEvent(window,'scroll', win_scroll, passive_event);\n\t\taddEvent(window,'resize', win_scroll, passive_event);\n\n\t\tthis._destroy = () => {\n\t\t\tdocument.removeEventListener('mousedown',doc_mousedown);\n\t\t\twindow.removeEventListener('scroll',win_scroll);\n\t\t\twindow.removeEventListener('resize',win_scroll);\n\t\t\tif( label ) label.removeEventListener('click',label_click);\n\t\t};\n\n\t\t// store original html and tab index so that they can be\n\t\t// restored when the destroy() method is called.\n\t\tthis.revertSettings = {\n\t\t\tinnerHTML : input.innerHTML,\n\t\t\ttabIndex : input.tabIndex\n\t\t};\n\n\n\t\tinput.tabIndex = -1;\n\t\tinput.insertAdjacentElement('afterend', self.wrapper);\n\n\t\tself.sync(false);\n\t\tsettings.items = [];\n\t\tdelete settings.optgroups;\n\t\tdelete settings.options;\n\n\t\taddEvent(input,'invalid', () => {\n\t\t\tif( self.isValid ){\n\t\t\t\tself.isValid = false;\n\t\t\t\tself.isInvalid = true;\n\t\t\t\tself.refreshState();\n\t\t\t}\n\t\t});\n\n\t\tself.updateOriginalInput();\n\t\tself.refreshItems();\n\t\tself.close(false);\n\t\tself.inputState();\n\t\tself.isSetup = true;\n\n\t\tif( input.disabled ){\n\t\t\tself.disable();\n\t\t}else if( input.readOnly ){\n\t\t\tself.setReadOnly(true);\n\t\t}else{\n\t\t\tself.enable(); //sets tabIndex\n\t\t}\n\n\t\tself.on('change', this.onChange);\n\n\t\taddClasses(input,'tomselected','ts-hidden-accessible');\n\t\tself.trigger('initialize');\n\n\t\t// preload options\n\t\tif (settings.preload === true) {\n\t\t\tself.preload();\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Register options and optgroups\n\t *\n\t */\n\tsetupOptions(options:TomOption[] = [], optgroups:TomOption[] = []){\n\n\t\t// build options table\n\t\tthis.addOptions(options);\n\n\n\t\t// build optgroup table\n\t\titerate( optgroups, (optgroup:TomOption) => {\n\t\t\tthis.registerOptionGroup(optgroup);\n\t\t});\n\t}\n\n\t/**\n\t * Sets up default rendering functions.\n\t */\n\tsetupTemplates() {\n\t\tvar self = this;\n\t\tvar field_label = self.settings.labelField;\n\t\tvar field_optgroup = self.settings.optgroupLabelField;\n\n\t\tvar templates = {\n\t\t\t'optgroup': (data:TomOption) => {\n\t\t\t\tlet optgroup = document.createElement('div');\n\t\t\t\toptgroup.className = 'optgroup';\n\t\t\t\toptgroup.appendChild(data.options);\n\t\t\t\treturn optgroup;\n\n\t\t\t},\n\t\t\t'optgroup_header': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div class=\"optgroup-header\">' + escape(data[field_optgroup]) + '</div>';\n\t\t\t},\n\t\t\t'option': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div>' + escape(data[field_label]) + '</div>';\n\t\t\t},\n\t\t\t'item': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div>' + escape(data[field_label]) + '</div>';\n\t\t\t},\n\t\t\t'option_create': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div class=\"create\">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>';\n\t\t\t},\n\t\t\t'no_results':() => {\n\t\t\t\treturn '<div class=\"no-results\">No results found</div>';\n\t\t\t},\n\t\t\t'loading':() => {\n\t\t\t\treturn '<div class=\"spinner\"></div>';\n\t\t\t},\n\t\t\t'not_loading':() => {},\n\t\t\t'dropdown':() => {\n\t\t\t\treturn '<div></div>';\n\t\t\t}\n\t\t};\n\n\n\t\tself.settings.render = Object.assign({}, templates, self.settings.render);\n\t}\n\n\t/**\n\t * Maps fired events to callbacks provided\n\t * in the settings used when creating the control.\n\t */\n\tsetupCallbacks() {\n\t\tvar key, fn;\n\t\tvar callbacks:{[key:string]:string} = {\n\t\t\t'initialize'      : 'onInitialize',\n\t\t\t'change'          : 'onChange',\n\t\t\t'item_add'        : 'onItemAdd',\n\t\t\t'item_remove'     : 'onItemRemove',\n\t\t\t'item_select'     : 'onItemSelect',\n\t\t\t'clear'           : 'onClear',\n\t\t\t'option_add'      : 'onOptionAdd',\n\t\t\t'option_remove'   : 'onOptionRemove',\n\t\t\t'option_clear'    : 'onOptionClear',\n\t\t\t'optgroup_add'    : 'onOptionGroupAdd',\n\t\t\t'optgroup_remove' : 'onOptionGroupRemove',\n\t\t\t'optgroup_clear'  : 'onOptionGroupClear',\n\t\t\t'dropdown_open'   : 'onDropdownOpen',\n\t\t\t'dropdown_close'  : 'onDropdownClose',\n\t\t\t'type'            : 'onType',\n\t\t\t'load'            : 'onLoad',\n\t\t\t'focus'           : 'onFocus',\n\t\t\t'blur'            : 'onBlur'\n\t\t};\n\n\t\tfor (key in callbacks) {\n\n\t\t\tfn = this.settings[callbacks[key] as (keyof TomSettings)];\n\t\t\tif (fn) this.on(key, fn);\n\n\t\t}\n\t}\n\n\t/**\n\t * Sync the Tom Select instance with the original input or select\n\t *\n\t */\n\tsync(get_settings:boolean=true):void{\n\t\tconst self\t\t= this;\n\t\tconst settings\t= get_settings ? getSettings( self.input, {delimiter:self.settings.delimiter} as RecursivePartial<TomSettings> ) : self.settings;\n\n\t\tself.setupOptions(settings.options,settings.optgroups);\n\n\t\tself.setValue(settings.items||[],true); // silent prevents recursion\n\n\t\tself.lastQuery = null; // so updated options will be displayed in dropdown\n\t}\n\n\t/**\n\t * Triggered when the main control element\n\t * has a click event.\n\t *\n\t */\n\tonClick():void {\n\t\tvar self = this;\n\n\t\tif( self.activeItems.length > 0 ){\n\t\t\tself.clearActiveItems();\n\t\t\tself.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tif( self.isFocused && self.isOpen ){\n\t\t\tself.blur();\n\t\t} else {\n\t\t\tself.focus();\n\t\t}\n\t}\n\n\t/**\n\t * @deprecated v1.7\n\t *\n\t */\n\tonMouseDown():void {}\n\n\t/**\n\t * Triggered when the value of the control has been changed.\n\t * This should propagate the event to the original DOM\n\t * input / select element.\n\t */\n\tonChange() {\n\t\ttriggerEvent(this.input, 'input');\n\t\ttriggerEvent(this.input, 'change');\n\t}\n\n\t/**\n\t * Triggered on <input> paste.\n\t *\n\t */\n\tonPaste(e:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tif( self.isInputHidden || self.isLocked ){\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\n\t\t// If a regex or string is included, this will split the pasted\n\t\t// input and create Items for each separate value\n\t\tif( !self.settings.splitOn ){\n\t\t\treturn;\n\t\t}\n\n\t\t// Wait for pasted text to be recognized in value\n\t\tsetTimeout(() => {\n\t\t\tvar pastedText = self.inputValue();\n\t\t\tif( !pastedText.match(self.settings.splitOn)){\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar splitInput = pastedText.trim().split(self.settings.splitOn);\n\t\t\titerate( splitInput, (piece:string) => {\n\n\t\t\t\tconst hash = hash_key(piece);\n\t\t\t\tif( hash ){\n\t\t\t\t\tif( this.options[piece] ){\n\t\t\t\t\t\tself.addItem(piece);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tself.createItem(piece);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, 0);\n\n\t}\n\n\t/**\n\t * Triggered on <input> keypress.\n\t *\n\t */\n\tonKeyPress(e:KeyboardEvent):void {\n\t\tvar self = this;\n\t\tif(self.isLocked){\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\t\tvar character = String.fromCharCode(e.keyCode || e.which);\n\t\tif (self.settings.create && self.settings.mode === 'multi' && character === self.settings.delimiter) {\n\t\t\tself.createItem();\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/**\n\t * Triggered on <input> keydown.\n\t *\n\t */\n\tonKeyDown(e:KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tself.ignoreHover = true;\n\n\t\tif (self.isLocked) {\n\t\t\tif (e.keyCode !== constants.KEY_TAB) {\n\t\t\t\tpreventDefault(e);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (e.keyCode) {\n\n\t\t\t// ctrl+A: select all\n\t\t\tcase constants.KEY_A:\n\t\t\t\tif( isKeyDown(constants.KEY_SHORTCUT,e) ){\n\t\t\t\t\tif( self.control_input.value == '' ){\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t\tself.selectAll();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t// esc: close dropdown\n\t\t\tcase constants.KEY_ESC:\n\t\t\t\tif (self.isOpen) {\n\t\t\t\t\tpreventDefault(e,true);\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t\tself.clearActiveItems();\n\t\t\t\treturn;\n\n\t\t\t// down: open dropdown or move selection down\n\t\t\tcase constants.KEY_DOWN:\n\t\t\t\tif (!self.isOpen && self.hasOptions) {\n\t\t\t\t\tself.open();\n\t\t\t\t} else if (self.activeOption) {\n\t\t\t\t\tlet next = self.getAdjacent(self.activeOption, 1);\n\t\t\t\t\tif (next) self.setActiveOption(next);\n\t\t\t\t}\n\t\t\t\tpreventDefault(e);\n\t\t\t\treturn;\n\n\t\t\t// up: move selection up\n\t\t\tcase constants.KEY_UP:\n\t\t\t\tif (self.activeOption) {\n\t\t\t\t\tlet prev = self.getAdjacent(self.activeOption, -1);\n\t\t\t\t\tif (prev) self.setActiveOption(prev);\n\t\t\t\t}\n\t\t\t\tpreventDefault(e);\n\t\t\t\treturn;\n\n\t\t\t// return: select active option\n\t\t\tcase constants.KEY_RETURN:\n\t\t\t\tif( self.canSelect(self.activeOption) ){\n\t\t\t\t\tself.onOptionSelect(e,self.activeOption!);\n\t\t\t\t\tpreventDefault(e);\n\n\t\t\t\t// if the option_create=null, the dropdown might be closed\n\t\t\t\t}else if (self.settings.create && self.createItem()) {\n\t\t\t\t\tpreventDefault(e);\n\n\t\t\t\t// don't submit form when searching for a value\n\t\t\t\t}else if( document.activeElement == self.control_input && self.isOpen ){\n\t\t\t\t\tpreventDefault(e);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\n\t\t\t// left: modifiy item selection to the left\n\t\t\tcase constants.KEY_LEFT:\n\t\t\t\tself.advanceSelection(-1, e);\n\t\t\t\treturn;\n\n\t\t\t// right: modifiy item selection to the right\n\t\t\tcase constants.KEY_RIGHT:\n\t\t\t\tself.advanceSelection(1, e);\n\t\t\t\treturn;\n\n\t\t\t// tab: select active option and/or create item\n\t\t\tcase constants.KEY_TAB:\n\n\t\t\t\tif( self.settings.selectOnTab ){\n\t\t\t\t\tif( self.canSelect(self.activeOption) ){\n\t\t\t\t\t\tself.onOptionSelect(e,self.activeOption!);\n\n\t\t\t\t\t\t// prevent default [tab] behaviour of jump to the next field\n\t\t\t\t\t\t// if select isFull, then the dropdown won't be open and [tab] will work normally\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t}\n\t\t\t\t\tif (self.settings.create && self.createItem()) {\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\n\t\t\t// delete|backspace: delete items\n\t\t\tcase constants.KEY_BACKSPACE:\n\t\t\tcase constants.KEY_DELETE:\n\t\t\t\tself.deleteSelection(e);\n\t\t\t\treturn;\n\t\t}\n\n\t\t// don't enter text in the control_input when active items are selected\n\t\tif( self.isInputHidden && !isKeyDown(constants.KEY_SHORTCUT,e) ){\n\t\t\tpreventDefault(e);\n\t\t}\n\t}\n\n\t/**\n\t * Triggered on <input> keyup.\n\t *\n\t */\n\tonInput(e:MouseEvent|KeyboardEvent):void {\n\t\t\n\t\tif( this.isLocked ){\n\t\t\treturn;\n\t\t}\n\n\t\tconst value = this.inputValue();\n\t\tif( this.lastValue === value ) return;\n\t\tthis.lastValue = value;\n\t\t\n\t\tif( value == '' ){\n\t\t\tthis._onInput();\n\t\t\treturn;\n\t\t}\n\n\t\tif( this.refreshTimeout ){\n\t\t\tclearTimeout(this.refreshTimeout);\n\t\t}\n\n\t\tthis.refreshTimeout = timeout(()=> {\n\t\t\tthis.refreshTimeout = null;\n\t\t\tthis._onInput();\n\t\t}, this.settings.refreshThrottle);\n\t}\n\n\t_onInput():void {\n\t\tconst value = this.lastValue;\n\n\t\tif( this.settings.shouldLoad.call(this,value) ){\n\t\t\tthis.load(value);\n\t\t}\n\n\t\tthis.refreshOptions();\n\t\tthis.trigger('type', value);\n\t}\n\n\t/**\n\t * Triggered when the user rolls over\n\t * an option in the autocomplete dropdown menu.\n\t *\n\t */\n\tonOptionHover( evt:MouseEvent|KeyboardEvent, option:HTMLElement ):void{\n\t\tif( this.ignoreHover ) return;\n\t\tthis.setActiveOption(option, false);\n\t}\n\n\t/**\n\t * Triggered on <input> focus.\n\t *\n\t */\n\tonFocus(e?:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\t\tvar wasFocused = self.isFocused;\n\n\t\tif( self.isDisabled || self.isReadOnly ){\n\t\t\tself.blur();\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\n\t\tif (self.ignoreFocus) return;\n\t\tself.isFocused = true;\n\t\tif( self.settings.preload === 'focus' ) self.preload();\n\n\t\tif (!wasFocused) self.trigger('focus');\n\n\t\tif (!self.activeItems.length) {\n\t\t\tself.inputState();\n\t\t\tself.refreshOptions(!!self.settings.openOnFocus);\n\t\t}\n\n\t\tself.refreshState();\n\t}\n\n\t/**\n\t * Triggered on <input> blur.\n\t *\n\t */\n\tonBlur(e?:FocusEvent):void {\n\n\t\tif( document.hasFocus() === false ) return;\n\n\t\tvar self = this;\n\t\tif (!self.isFocused) return;\n\t\tself.isFocused = false;\n\t\tself.ignoreFocus = false;\n\n\t\tvar deactivate = () => {\n\t\t\tself.close();\n\t\t\tself.setActiveItem();\n\t\t\tself.setCaret(self.items.length);\n\t\t\tself.trigger('blur');\n\t\t};\n\n\t\tif (self.settings.create && self.settings.createOnBlur) {\n\t\t\tself.createItem(null, deactivate);\n\t\t} else {\n\t\t\tdeactivate();\n\t\t}\n\t}\n\n\n\t/**\n\t * Triggered when the user clicks on an option\n\t * in the autocomplete dropdown menu.\n\t *\n\t */\n\tonOptionSelect( evt:MouseEvent|KeyboardEvent, option:HTMLElement ){\n\t\tvar value, self = this;\n\n\n\t\t// should not be possible to trigger a option under a disabled optgroup\n\t\tif( option.parentElement && option.parentElement.matches('[data-disabled]') ){\n\t\t\treturn;\n\t\t}\n\n\n\t\tif( option.classList.contains('create') ){\n\t\t\tself.createItem(null, () => {\n\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tvalue = option.dataset.value;\n\t\t\tif (typeof value !== 'undefined') {\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tself.addItem(value);\n\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\n\t\t\t\tif( !self.settings.hideSelected && evt.type && /click/.test(evt.type) ){\n\t\t\t\t\tself.setActiveOption(option);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return true if the given option can be selected\n\t *\n\t */\n\tcanSelect(option:HTMLElement|null):boolean{\n\n\t\tif( this.isOpen && option && this.dropdown_content.contains(option) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Triggered when the user clicks on an item\n\t * that has been selected.\n\t *\n\t */\n\tonItemSelect( evt?:MouseEvent, item?:TomItem ):boolean{\n\t\tvar self = this;\n\n\t\tif( !self.isLocked && self.settings.mode === 'multi' ){\n\t\t\tpreventDefault(evt);\n\t\t\tself.setActiveItem(item, evt);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Determines whether or not to invoke\n\t * the user-provided option provider / loader\n\t *\n\t * Note, there is a subtle difference between\n\t * this.canLoad() and this.settings.shouldLoad();\n\t *\n\t *\t- settings.shouldLoad() is a user-input validator.\n\t *\tWhen false is returned, the not_loading template\n\t *\twill be added to the dropdown\n\t *\n\t *\t- canLoad() is lower level validator that checks\n\t * \tthe Tom Select instance. There is no inherent user\n\t *\tfeedback when canLoad returns false\n\t *\n\t */\n\tcanLoad(value:string):boolean{\n\n\t\tif( !this.settings.load ) return false;\n\t\tif( this.loadedSearches.hasOwnProperty(value) ) return false;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Invokes the user-provided option provider / loader.\n\t *\n\t */\n\tload(value:string):void {\n\t\tconst self = this;\n\n\t\tif( !self.canLoad(value) ) return;\n\n\t\taddClasses(self.wrapper,self.settings.loadingClass);\n\t\tself.loading++;\n\n\t\tconst callback = self.loadCallback.bind(self);\n\t\tself.settings.load.call(self, value, callback);\n\t}\n\n\t/**\n\t * Invoked by the user-provided option provider\n\t *\n\t */\n\tloadCallback( options:TomOption[], optgroups:TomOption[] ):void{\n\t\tconst self = this;\n\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\tself.lastQuery = null;\n\n\t\tself.clearActiveOption(); // when new results load, focus should be on first option\n\t\tself.setupOptions(options,optgroups);\n\n\t\tself.refreshOptions(self.isFocused && !self.isInputHidden);\n\n\t\tif (!self.loading) {\n\t\t\tremoveClasses(self.wrapper,self.settings.loadingClass);\n\t\t}\n\n\t\tself.trigger('load', options, optgroups);\n\t}\n\n\tpreload():void{\n\t\tvar classList = this.wrapper.classList;\n\t\tif( classList.contains('preloaded') ) return;\n\t\tclassList.add('preloaded');\n\t\tthis.load('');\n\t}\n\n\n\t/**\n\t * Sets the input field of the control to the specified value.\n\t *\n\t */\n\tsetTextboxValue(value:string = '') {\n\t\tvar input = this.control_input;\n\t\tvar changed = input.value !== value;\n\t\tif (changed) {\n\t\t\tinput.value = value;\n\t\t\ttriggerEvent(input,'update');\n\t\t\tthis.lastValue = value;\n\t\t}\n\t}\n\n\t/**\n\t * Returns the value of the control. If multiple items\n\t * can be selected (e.g. <select multiple>), this returns\n\t * an array. If only one item can be selected, this\n\t * returns a string.\n\t *\n\t */\n\tgetValue():string|string[] {\n\n\t\tif( this.is_select_tag && this.input.hasAttribute('multiple')) {\n\t\t\treturn this.items;\n\t\t}\n\n\t\treturn this.items.join(this.settings.delimiter);\n\t}\n\n\t/**\n\t * Resets the selected items to the given value.\n\t *\n\t */\n\tsetValue( value:string|string[], silent?:boolean ):void{\n\t\tvar events = silent ? [] : ['change'];\n\n\t\tdebounce_events(this, events,() => {\n\t\t\tthis.clear(silent);\n\t\t\tthis.addItems(value, silent);\n\t\t});\n\t}\n\n\n\t/**\n\t * Resets the number of max items to the given value\n\t *\n\t */\n\tsetMaxItems(value:null|number){\n\t\tif(value === 0) value = null; //reset to unlimited items.\n\t\tthis.settings.maxItems = value;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Sets the selected item.\n\t *\n\t */\n\tsetActiveItem( item?:TomItem, e?:MouseEvent|KeyboardEvent ){\n\t\tvar self = this;\n\t\tvar eventName;\n\t\tvar i, begin, end, swap;\n\t\tvar last;\n\n\t\tif (self.settings.mode === 'single') return;\n\n\t\t// clear the active selection\n\t\tif( !item ){\n\t\t\tself.clearActiveItems();\n\t\t\tif (self.isFocused) {\n\t\t\t\tself.inputState();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// modify selection\n\t\teventName = e && e.type.toLowerCase();\n\n\t\tif (eventName === 'click' && isKeyDown('shiftKey',e) && self.activeItems.length) {\n\t\t\tlast\t= self.getLastActive();\n\t\t\tbegin\t= Array.prototype.indexOf.call(self.control.children, last);\n\t\t\tend\t\t= Array.prototype.indexOf.call(self.control.children, item);\n\n\t\t\tif (begin > end) {\n\t\t\t\tswap  = begin;\n\t\t\t\tbegin = end;\n\t\t\t\tend   = swap;\n\t\t\t}\n\t\t\tfor (i = begin; i <= end; i++) {\n\t\t\t\titem = self.control.children[i] as TomItem;\n\t\t\t\tif (self.activeItems.indexOf(item) === -1) {\n\t\t\t\t\tself.setActiveItemClass(item);\n\t\t\t\t}\n\t\t\t}\n\t\t\tpreventDefault(e);\n\t\t} else if ((eventName === 'click' && isKeyDown(constants.KEY_SHORTCUT,e) ) || (eventName === 'keydown' && isKeyDown('shiftKey',e))) {\n\t\t\tif( item.classList.contains('active') ){\n\t\t\t\tself.removeActiveItem( item );\n\t\t\t} else {\n\t\t\t\tself.setActiveItemClass(item);\n\t\t\t}\n\t\t} else {\n\t\t\tself.clearActiveItems();\n\t\t\tself.setActiveItemClass(item);\n\t\t}\n\n\t\t// ensure control has focus\n\t\tself.inputState();\n\t\tif (!self.isFocused) {\n\t\t\tself.focus();\n\t\t}\n\t}\n\n\t/**\n\t * Set the active and last-active classes\n\t *\n\t */\n\tsetActiveItemClass( item:TomItem ){\n\t\tconst self = this;\n\t\tconst last_active = self.control.querySelector('.last-active');\n\t\tif( last_active ) removeClasses(last_active as HTMLElement,'last-active');\n\n\t\taddClasses(item,'active last-active');\n\t\tself.trigger('item_select', item);\n\t\tif( self.activeItems.indexOf(item) == -1 ){\n\t\t\tself.activeItems.push( item );\n\t\t}\n\t}\n\n\t/**\n\t * Remove active item\n\t *\n\t */\n\tremoveActiveItem( item:TomItem ){\n\t\tvar idx = this.activeItems.indexOf(item);\n\t\tthis.activeItems.splice(idx, 1);\n\t\tremoveClasses(item,'active');\n\t}\n\n\t/**\n\t * Clears all the active items\n\t *\n\t */\n\tclearActiveItems(){\n\t\tremoveClasses(this.activeItems,'active');\n\t\tthis.activeItems = [];\n\t}\n\n\t/**\n\t * Sets the selected item in the dropdown menu\n\t * of available options.\n\t *\n\t */\n\tsetActiveOption( option:null|HTMLElement,scroll:boolean=true ):void{\n\n\t\tif( option === this.activeOption ){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clearActiveOption();\n\t\tif( !option ) return;\n\n\t\tthis.activeOption = option;\n\t\tsetAttr(this.focus_node,{'aria-activedescendant':option.getAttribute('id')});\n\t\tsetAttr(option,{'aria-selected':'true'});\n\t\taddClasses(option,'active');\n\t\tif( scroll ) this.scrollToOption(option);\n\t}\n\n\t/**\n\t * Sets the dropdown_content scrollTop to display the option\n\t *\n\t */\n\tscrollToOption( option:null|HTMLElement, behavior?:string ):void{\n\n\t\tif( !option ) return;\n\n\t\tconst content\t\t= this.dropdown_content;\n\t\tconst height_menu\t= content.clientHeight;\n\t\tconst scrollTop\t\t= content.scrollTop || 0;\n\t\tconst height_item\t= option.offsetHeight;\n\t\tconst y\t\t\t\t= option.getBoundingClientRect().top - content.getBoundingClientRect().top + scrollTop;\n\n\t\tif (y + height_item > height_menu + scrollTop) {\n\t\t\tthis.scroll(y - height_menu + height_item, behavior);\n\n\t\t} else if (y < scrollTop) {\n\t\t\tthis.scroll(y, behavior);\n\t\t}\n\t}\n\n\t/**\n\t * Scroll the dropdown to the given position\n\t *\n\t */\n\tscroll( scrollTop:number, behavior?:string ):void{\n\t\tconst content = this.dropdown_content;\n\t\tif( behavior ){\n\t\t\tcontent.style.scrollBehavior = behavior;\n\t\t}\n\t\tcontent.scrollTop = scrollTop;\n\t\tcontent.style.scrollBehavior = '';\n\t}\n\n\t/**\n\t * Clears the active option\n\t *\n\t */\n\tclearActiveOption(){\n\t\tif( this.activeOption ){\n\t\t\tremoveClasses(this.activeOption,'active');\n\t\t\tsetAttr(this.activeOption,{'aria-selected':null});\n\t\t}\n\t\tthis.activeOption = null;\n\t\tsetAttr(this.focus_node,{'aria-activedescendant':null});\n\t}\n\n\n\t/**\n\t * Selects all items (CTRL + A).\n\t */\n\tselectAll() {\n\t\tconst self = this;\n\n\t\tif (self.settings.mode === 'single') return;\n\n\t\tconst activeItems = self.controlChildren();\n\n\t\tif( !activeItems.length ) return;\n\n\t\tself.inputState();\n\t\tself.close();\n\n\t\tself.activeItems = activeItems;\n\t\titerate( activeItems, (item:TomItem) => {\n\t\t\tself.setActiveItemClass(item);\n\t\t});\n\n\t}\n\n\t/**\n\t * Determines if the control_input should be in a hidden or visible state\n\t *\n\t */\n\tinputState(){\n\t\tvar self = this;\n\n\t\tif( !self.control.contains(self.control_input) ) return;\n\n\t\tsetAttr(self.control_input,{placeholder:self.settings.placeholder});\n\n\t\tif( self.activeItems.length > 0 || (!self.isFocused && self.settings.hidePlaceholder && self.items.length > 0) ){\n\t\t\tself.setTextboxValue();\n\t\t\tself.isInputHidden = true;\n\n\t\t}else{\n\n\t\t\tif( self.settings.hidePlaceholder && self.items.length > 0 ){\n\t\t\t\tsetAttr(self.control_input,{placeholder:''});\n\t\t\t}\n\t\t\tself.isInputHidden = false;\n\t\t}\n\n\t\tself.wrapper.classList.toggle('input-hidden', self.isInputHidden );\n\t}\n\n\t/**\n\t * Get the input value\n\t */\n\tinputValue(){\n\t\treturn this.control_input.value.trim();\n\t}\n\n\t/**\n\t * Gives the control focus.\n\t */\n\tfocus() {\n\t\tvar self = this;\n\t\tif( self.isDisabled || self.isReadOnly) return;\n\n\t\tself.ignoreFocus = true;\n\n\t\tif( self.control_input.offsetWidth ){\n\t\t\tself.control_input.focus();\n\t\t}else{\n\t\t\tself.focus_node.focus();\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tself.ignoreFocus = false;\n\t\t\tself.onFocus();\n\t\t}, 0);\n\t}\n\n\t/**\n\t * Forces the control out of focus.\n\t *\n\t */\n\tblur():void {\n\t\tthis.focus_node.blur();\n\t\tthis.onBlur();\n\t}\n\n\t/**\n\t * Returns a function that scores an object\n\t * to show how good of a match it is to the\n\t * provided query.\n\t *\n\t * @return {function}\n\t */\n\tgetScoreFunction(query:string) {\n\t\treturn this.sifter.getScoreFunction(query, this.getSearchOptions());\n\t}\n\n\t/**\n\t * Returns search options for sifter (the system\n\t * for scoring and sorting results).\n\t *\n\t * @see https://github.com/orchidjs/sifter.js\n\t * @return {object}\n\t */\n\tgetSearchOptions() {\n\t\tvar settings = this.settings;\n\t\tvar sort = settings.sortField;\n\t\tif (typeof settings.sortField === 'string') {\n\t\t\tsort = [{field: settings.sortField}];\n\t\t}\n\n\t\treturn {\n\t\t\tfields      : settings.searchField,\n\t\t\tconjunction : settings.searchConjunction,\n\t\t\tsort        : sort,\n\t\t\tnesting     : settings.nesting\n\t\t};\n\t}\n\n\t/**\n\t * Searches through available options and returns\n\t * a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string) : ReturnType<Sifter['search']>{\n\t\tvar result, calculateScore;\n\t\tvar self     = this;\n\t\tvar options  = this.getSearchOptions();\n\n\t\t// validate user-provided result scoring function\n\t\tif ( self.settings.score ){\n\t\t\tcalculateScore = self.settings.score.call(self,query);\n\t\t\tif (typeof calculateScore !== 'function') {\n\t\t\t\tthrow new Error('Tom Select \"score\" setting must be a function that returns a function');\n\t\t\t}\n\t\t}\n\n\t\t// perform search\n\t\tif (query !== self.lastQuery) {\n\t\t\tself.lastQuery\t\t\t= query;\n\t\t\tresult\t\t\t\t\t= self.sifter.search(query, Object.assign(options, {score: calculateScore}));\n\t\t\tself.currentResults\t\t= result;\n\t\t} else {\n\t\t\tresult\t\t\t\t\t= Object.assign( {}, self.currentResults);\n\t\t}\n\n\t\t// filter out selected items\n\t\tif( self.settings.hideSelected ){\n\t\t\tresult.items = result.items.filter((item) => {\n\t\t\t\tlet hashed = hash_key(item.id);\n\t\t\t\treturn !(hashed && self.items.indexOf(hashed) !== -1 );\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Refreshes the list of available options shown\n\t * in the autocomplete dropdown menu.\n\t *\n\t */\n\trefreshOptions( triggerDropdown:boolean = true ){\n\t\tvar i, j, k, n, optgroup, optgroups, html:DocumentFragment, has_create_option, active_group;\n\t\tvar create;\n\n\t\ttype Group = {fragment:DocumentFragment,order:number,optgroup:string}\n\t\tconst groups: {[key:string]:number} = {};\n\t\tconst groups_order:Group[]\t= [];\n\n\t\tvar self\t\t\t\t\t= this;\n\t\tvar query\t\t\t\t\t= self.inputValue();\n\t\tconst same_query\t\t\t= query === self.lastQuery || (query == '' && self.lastQuery == null);\n\t\tvar results\t\t\t\t\t= self.search(query);\n\t\tvar active_option:HTMLElement|null = null;\n\t\tvar show_dropdown\t\t\t= self.settings.shouldOpen || false;\n\t\tvar dropdown_content\t\t= self.dropdown_content;\n\n\n\t\tif( same_query ){\n\t\t\tactive_option\t\t\t= self.activeOption;\n\n\t\t\tif( active_option ){\n\t\t\t\tactive_group = active_option.closest('[data-group]') as HTMLElement;\n\t\t\t}\n\t\t}\n\n\t\t// build markup\n\t\tn = results.items.length;\n\t\tif (typeof self.settings.maxOptions === 'number') {\n\t\t\tn = Math.min(n, self.settings.maxOptions);\n\t\t}\n\n\t\tif( n > 0 ){\n\t\t\tshow_dropdown = true;\n\t\t}\n\n\t\t// get fragment for group and the position of the group in group_order\n\t\tconst getGroupFragment = (optgroup:string,order:number):[number,DocumentFragment] => {\n\n\t\t\tlet group_order_i = groups[optgroup];\n\n\t\t\tif( group_order_i !== undefined ){\n\t\t\t\tlet order_group = groups_order[group_order_i];\n\t\t\t\tif( order_group !== undefined ){\n\t\t\t\t\treturn [group_order_i,order_group.fragment];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet group_fragment = document.createDocumentFragment();\n\t\t\tgroup_order_i = groups_order.length;\n\t\t\tgroups_order.push({fragment:group_fragment,order,optgroup});\n\n\t\t\treturn [group_order_i,group_fragment]\n\t\t}\n\n\t\t// render and group available options individually\n\t\tfor (i = 0; i < n; i++) {\n\n\t\t\t// get option dom element\n\t\t\tlet item\t\t\t= results.items[i];\n\t\t\tif( !item ) continue;\n\n\t\t\tlet opt_value\t\t= item.id;\n\t\t\tlet option\t\t\t= self.options[opt_value];\n\n\t\t\tif( option === undefined ) continue;\n\n\t\t\tlet opt_hash\t\t= get_hash(opt_value);\n\t\t\tlet option_el\t\t= self.getOption(opt_hash,true) as HTMLElement;\n\n\t\t\t// toggle 'selected' class\n\t\t\tif( !self.settings.hideSelected ){\n\t\t\t\toption_el.classList.toggle('selected', self.items.includes(opt_hash) );\n\t\t\t}\n\n\t\t\toptgroup    = option[self.settings.optgroupField] || '';\n\t\t\toptgroups   = Array.isArray(optgroup) ? optgroup : [optgroup];\n\t\t\t\n\n\t\t\tfor (j = 0, k = optgroups && optgroups.length; j < k; j++) {\n\t\t\t\toptgroup = optgroups[j];\n\n\t\t\t\tlet order = option.$order;\n\t\t\t\tlet self_optgroup = self.optgroups[optgroup];\n\t\t\t\tif( self_optgroup === undefined ){\t\t\t\t\t\n\t\t\t\t\toptgroup = '';\n\t\t\t\t}else{\n\t\t\t\t\torder = self_optgroup.$order;\n\t\t\t\t}\n\n\t\t\t\tconst [group_order_i,group_fragment] = getGroupFragment(optgroup,order);\n\n\n\t\t\t\t// nodes can only have one parent, so if the option is in mutple groups, we need a clone\n\t\t\t\tif( j > 0 ){\n\t\t\t\t\toption_el = option_el.cloneNode(true) as HTMLElement;\n\t\t\t\t\tsetAttr(option_el,{id: option.$id+'-clone-'+j,'aria-selected':null});\n\t\t\t\t\toption_el.classList.add('ts-cloned');\n\t\t\t\t\tremoveClasses(option_el,'active');\n\n\n\t\t\t\t\t// make sure we keep the activeOption in the same group\n\t\t\t\t\tif( self.activeOption && self.activeOption.dataset.value == opt_value ){\n\t\t\t\t\t\tif( active_group && active_group.dataset.group === optgroup.toString() ){\n\t\t\t\t\t\t\tactive_option = option_el;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\t\n\t\t\t\t\n\t\t\t\tgroup_fragment.appendChild(option_el);\n\t\t\t\tif( optgroup != '' ){\n\t\t\t\t\tgroups[optgroup] = group_order_i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// sort optgroups\n\t\tif( self.settings.lockOptgroupOrder ){\n\t\t\tgroups_order.sort((a, b) => {\n\t\t\t\treturn a.order - b.order;\n\t\t\t});\n\t\t}\n\n\t\t// render optgroup headers & join groups\n\t\thtml = document.createDocumentFragment();\n\t\titerate( groups_order, (group_order:Group) => {\n\n\t\t\tlet group_fragment = group_order.fragment;\n\t\t\tlet optgroup = group_order.optgroup\n\n\t\t\tif( !group_fragment || !group_fragment.children.length ) return;\n\n\t\t\tlet group_heading = self.optgroups[optgroup];\n\n\t\t\tif( group_heading !== undefined ){\n\n\t\t\t\tlet group_options = document.createDocumentFragment();\n\t\t\t\tlet header = self.render('optgroup_header', group_heading);\n\t\t\t\tappend( group_options, header );\n\t\t\t\tappend( group_options, group_fragment );\n\n\t\t\t\tlet group_html = self.render('optgroup', {group:group_heading,options:group_options} );\n\n\t\t\t\tappend( html, group_html );\n\n\t\t\t} else {\n\t\t\t\tappend( html, group_fragment );\n\t\t\t}\n\t\t});\n\n\t\tdropdown_content.innerHTML = '';\n\t\tappend( dropdown_content, html );\n\n\t\t// highlight matching terms inline\n\t\tif (self.settings.highlight) {\n\t\t\tremoveHighlight( dropdown_content );\n\t\t\tif (results.query.length && results.tokens.length) {\n\t\t\t\titerate( results.tokens, (tok) => {\n\t\t\t\t\thighlight( dropdown_content, tok.regex);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// helper method for adding templates to dropdown\n\t\tvar add_template = (template:TomTemplateNames) => {\n\t\t\tlet content = self.render(template,{input:query});\n\t\t\tif( content ){\n\t\t\t\tshow_dropdown = true;\n\t\t\t\tdropdown_content.insertBefore(content, dropdown_content.firstChild);\n\t\t\t}\n\t\t\treturn content;\n\t\t};\n\n\n\t\t// add loading message\n\t\tif( self.loading ){\n\t\t\tadd_template('loading');\n\n\t\t// invalid query\n\t\t}else if( !self.settings.shouldLoad.call(self,query) ){\n\t\t\tadd_template('not_loading');\n\n\t\t// add no_results message\n\t\t}else if( results.items.length === 0 ){\n\t\t\tadd_template('no_results');\n\n\t\t}\n\n\n\n\t\t// add create option\n\t\thas_create_option = self.canCreate(query);\n\t\tif (has_create_option) {\n\t\t\tcreate = add_template('option_create');\n\t\t}\n\n\n\t\t// activate\n\t\tself.hasOptions = results.items.length > 0 || has_create_option;\n\t\tif( show_dropdown ){\n\n\t\t\tif (results.items.length > 0) {\n\n\t\t\t\tif( !active_option && self.settings.mode === 'single' && self.items[0] != undefined ){\n\t\t\t\t\tactive_option = self.getOption(self.items[0]);\n\t\t\t\t}\n\n\t\t\t\tif( !dropdown_content.contains(active_option)  ){\n\n\t\t\t\t\tlet active_index = 0;\n\t\t\t\t\tif( create && !self.settings.addPrecedence ){\n\t\t\t\t\t\tactive_index = 1;\n\t\t\t\t\t}\n\t\t\t\t\tactive_option = self.selectable()[active_index] as HTMLElement;\n\t\t\t\t}\n\n\t\t\t}else if( create ){\n\t\t\t\tactive_option = create;\n\t\t\t}\n\n\t\t\tif( triggerDropdown && !self.isOpen ){\n\t\t\t\tself.open();\n\t\t\t\tself.scrollToOption(active_option,'auto');\n\t\t\t}\n\t\t\tself.setActiveOption(active_option);\n\n\t\t}else{\n\t\t\tself.clearActiveOption();\n\t\t\tif( triggerDropdown && self.isOpen ){\n\t\t\t\tself.close(false); // if create_option=null, we want the dropdown to close but not reset the textbox value\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return list of selectable options\n\t *\n\t */\n\tselectable():NodeList{\n\t\treturn this.dropdown_content.querySelectorAll('[data-selectable]');\n\t}\n\n\n\n\t/**\n\t * Adds an available option. If it already exists,\n\t * nothing will happen. Note: this does not refresh\n\t * the options list dropdown (use `refreshOptions`\n\t * for that).\n\t *\n\t * Usage:\n\t *\n\t *   this.addOption(data)\n\t *\n\t */\n\taddOption( data:TomOption, user_created = false ):false|string {\n\t\tconst self = this;\n\n\t\t// @deprecated 1.7.7\n\t\t// use addOptions( array, user_created ) for adding multiple options\n\t\tif( Array.isArray(data) ){\n\t\t\tself.addOptions( data, user_created);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst key = hash_key(data[self.settings.valueField]);\n\t\tif( key === null || self.options.hasOwnProperty(key) ){\n\t\t\treturn false;\n\t\t}\n\n\t\tdata.$order\t\t\t= data.$order || ++self.order;\n\t\tdata.$id\t\t\t= self.inputId + '-opt-' + data.$order;\n\t\tself.options[key]\t= data;\n\t\tself.lastQuery\t\t= null;\n\n\t\tif( user_created ){\n\t\t\tself.userOptions[key] = user_created;\n\t\t\tself.trigger('option_add', key, data);\n\t\t}\n\n\t\treturn key;\n\t}\n\n\t/**\n\t * Add multiple options\n\t *\n\t */\n\taddOptions( data:TomOption[], user_created = false ):void{\n\t\titerate( data, (dat:TomOption) => {\n\t\t\tthis.addOption(dat, user_created);\n\t\t});\n\t}\n\n\t/**\n\t * @deprecated 1.7.7\n\t */\n\tregisterOption( data:TomOption ):false|string {\n\t\treturn this.addOption(data);\n\t}\n\n\t/**\n\t * Registers an option group to the pool of option groups.\n\t *\n\t * @return {boolean|string}\n\t */\n\tregisterOptionGroup(data:TomOption) {\n\t\tvar key = hash_key(data[this.settings.optgroupValueField]);\n\n\t\tif ( key === null ) return false;\n\n\t\tdata.$order = data.$order || ++this.order;\n\t\tthis.optgroups[key] = data;\n\t\treturn key;\n\t}\n\n\t/**\n\t * Registers a new optgroup for options\n\t * to be bucketed into.\n\t *\n\t */\n\taddOptionGroup(id:string, data:TomOption) {\n\t\tvar hashed_id;\n\t\tdata[this.settings.optgroupValueField] = id;\n\n\t\tif( hashed_id = this.registerOptionGroup(data) ){\n\t\t\tthis.trigger('optgroup_add', hashed_id, data);\n\t\t}\n\t}\n\n\t/**\n\t * Removes an existing option group.\n\t *\n\t */\n\tremoveOptionGroup(id:string) {\n\t\tif (this.optgroups.hasOwnProperty(id)) {\n\t\t\tdelete this.optgroups[id];\n\t\t\tthis.clearCache();\n\t\t\tthis.trigger('optgroup_remove', id);\n\t\t}\n\t}\n\n\t/**\n\t * Clears all existing option groups.\n\t */\n\tclearOptionGroups() {\n\t\tthis.optgroups = {};\n\t\tthis.clearCache();\n\t\tthis.trigger('optgroup_clear');\n\t}\n\n\t/**\n\t * Updates an option available for selection. If\n\t * it is visible in the selected items or options\n\t * dropdown, it will be re-rendered automatically.\n\t *\n\t */\n\tupdateOption(value:string, data:TomOption) {\n\t\tconst self = this;\n\t\tvar item_new;\n\t\tvar index_item;\n\n\t\tconst value_old\t\t= hash_key(value);\n\t\tconst value_new\t\t= hash_key(data[self.settings.valueField]);\n\n\t\t// sanity checks\n\t\tif( value_old === null ) return;\n\n\t\tconst data_old\t\t= self.options[value_old];\n\n\t\tif( data_old == undefined ) return;\n\t\tif( typeof value_new !== 'string' ) throw new Error('Value must be set in option data');\n\n\n\t\tconst option\t\t= self.getOption(value_old);\n\t\tconst item\t\t\t= self.getItem(value_old);\n\n\n\t\tdata.$order = data.$order || data_old.$order;\n\t\tdelete self.options[value_old];\n\n\t\t// invalidate render cache\n\t\t// don't remove existing node yet, we'll remove it after replacing it\n\t\tself.uncacheValue(value_new);\n\n\t\tself.options[value_new] = data;\n\n\t\t// update the option if it's in the dropdown\n\t\tif( option ){\n\t\t\tif( self.dropdown_content.contains(option) ){\n\n\t\t\t\tconst option_new\t= self._render('option', data);\n\t\t\t\treplaceNode(option, option_new);\n\n\t\t\t\tif( self.activeOption === option ){\n\t\t\t\t\tself.setActiveOption(option_new);\n\t\t\t\t}\n\t\t\t}\n\t\t\toption.remove();\n\t\t}\n\n\t\t// update the item if we have one\n\t\tif( item ){\n\t\t\tindex_item = self.items.indexOf(value_old);\n\t\t\tif (index_item !== -1) {\n\t\t\t\tself.items.splice(index_item, 1, value_new);\n\t\t\t}\n\n\t\t\titem_new\t= self._render('item', data);\n\n\t\t\tif( item.classList.contains('active') ) addClasses(item_new,'active');\n\n\t\t\treplaceNode( item, item_new);\n\t\t}\n\n\t\t// invalidate last query because we might have updated the sortField\n\t\tself.lastQuery = null;\n\t}\n\n\t/**\n\t * Removes a single option.\n\t *\n\t */\n\tremoveOption(value:string, silent?:boolean):void {\n\t\tconst self = this;\n\t\tvalue = get_hash(value);\n\n\t\tself.uncacheValue(value);\n\n\t\tdelete self.userOptions[value];\n\t\tdelete self.options[value];\n\t\tself.lastQuery = null;\n\t\tself.trigger('option_remove', value);\n\t\tself.removeItem(value, silent);\n\t}\n\n\t/**\n\t * Clears all options.\n\t */\n\tclearOptions(filter?:TomClearFilter ) {\n\n\t\tconst boundFilter = (filter || this.clearFilter).bind(this);\n\n\t\tthis.loadedSearches\t\t= {};\n\t\tthis.userOptions\t\t= {};\n\t\tthis.clearCache();\n\n\t\tconst selected:TomOptions\t= {};\n\t\titerate(this.options,(option:TomOption,key:string)=>{\n\t\t\tif( boundFilter(option,key as string) ){\n\t\t\t\tselected[key] = option;\n\t\t\t}\n\t\t});\n\n\t\tthis.options = this.sifter.items = selected;\n\t\tthis.lastQuery = null;\n\t\tthis.trigger('option_clear');\n\t}\n\n\t/**\n\t * Used by clearOptions() to decide whether or not an option should be removed\n\t * Return true to keep an option, false to remove\n\t *\n\t */\n\tclearFilter(option:TomOption,value:string){\n\t\tif( this.items.indexOf(value) >= 0 ){\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Returns the dom element of the option\n\t * matching the given value.\n\t *\n\t */\n\tgetOption(value:undefined|null|boolean|string|number, create:boolean=false):null|HTMLElement {\n\n\t\tconst hashed = hash_key(value);\n\t\tif( hashed === null ) return null;\n\n\t\tconst option = this.options[hashed];\n\t\tif( option != undefined ){\n\n\t\t\tif( option.$div ){\n\t\t\t\treturn option.$div;\n\t\t\t}\n\n\t\t\tif( create ){\n\t\t\t\treturn this._render('option', option);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Returns the dom element of the next or previous dom element of the same type\n\t * Note: adjacent options may not be adjacent DOM elements (optgroups)\n\t *\n\t */\n\tgetAdjacent( option:null|HTMLElement, direction:number, type:string = 'option' ) : HTMLElement|null{\n\t\tvar self = this, all;\n\n\t\tif( !option ){\n\t\t\treturn null;\n\t\t}\n\n\t\tif( type == 'item' ){\n\t\t\tall\t\t\t= self.controlChildren();\n\t\t}else{\n\t\t\tall\t\t\t= self.dropdown_content.querySelectorAll('[data-selectable]');\n\t\t}\n\n\t\tfor( let i = 0; i < all.length; i++ ){\n\t\t\tif( all[i] != option ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( direction > 0 ){\n\t\t\t\treturn all[i+1] as HTMLElement;\n\t\t\t}\n\n\t\t\treturn all[i-1] as HTMLElement;\n\t\t}\n\t\treturn null;\n\t}\n\n\n\t/**\n\t * Returns the dom element of the item\n\t * matching the given value.\n\t *\n\t */\n\tgetItem(item:string|TomItem|null):null|TomItem {\n\n\t\tif( typeof item == 'object' ){\n\t\t\treturn item;\n\t\t}\n\n\t\tvar value = hash_key(item);\n\t\treturn value !== null\n\t\t\t? this.control.querySelector(`[data-value=\"${addSlashes(value)}\"]`)\n\t\t\t: null;\n\t}\n\n\t/**\n\t * \"Selects\" multiple items at once. Adds them to the list\n\t * at the current caret position.\n\t *\n\t */\n\taddItems( values:string|string[], silent?:boolean ):void{\n\t\tvar self = this;\n\n\t\tvar items = Array.isArray(values) ? values : [values];\n\t\titems = items.filter(x => self.items.indexOf(x) === -1);\n\t\tconst last_item = items[items.length - 1];\n\t\titems.forEach(item => {\n\t\t\tself.isPending = (item !== last_item);\n\t\t\tself.addItem(item, silent);\n\t\t});\n\t}\n\n\t/**\n\t * \"Selects\" an item. Adds it to the list\n\t * at the current caret position.\n\t *\n\t */\n\taddItem( value:string, silent?:boolean ):void{\n\t\tvar events = silent ? [] : ['change','dropdown_close'];\n\n\t\tdebounce_events(this, events, () => {\n\t\t\tvar item, wasFull;\n\t\t\tconst self = this;\n\t\t \tconst inputMode = self.settings.mode;\n\t\t\tconst hashed = hash_key(value);\n\n\t\t\tif( hashed && self.items.indexOf(hashed) !== -1 ){\n\n\t\t\t\tif( inputMode === 'single' ){\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\n\t\t\t\tif( inputMode === 'single' || !self.settings.duplicates ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hashed === null || !self.options.hasOwnProperty(hashed)) return;\n\t\t\tif (inputMode === 'single') self.clear(silent);\n\t\t\tif (inputMode === 'multi' && self.isFull()) return;\n\n\t\t\titem = self._render('item', self.options[hashed]);\n\n\t\t\tif( self.control.contains(item) ){ // duplicates\n\t\t\t\titem = item.cloneNode(true) as HTMLElement;\n\t\t\t}\n\n\t\t\twasFull = self.isFull();\n\t\t\tself.items.splice(self.caretPos, 0, hashed);\n\t\t\tself.insertAtCaret(item);\n\n\t\t\tif (self.isSetup) {\n\n\t\t\t\t// update menu / remove the option (if this is not one item being added as part of series)\n\t\t\t\tif( !self.isPending && self.settings.hideSelected ){\n\t\t\t\t\tlet option = self.getOption(hashed);\n\t\t\t\t\tlet next = self.getAdjacent(option, 1);\n\t\t\t\t\tif( next ){\n\t\t\t\t\t\tself.setActiveOption(next);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// refreshOptions after setActiveOption(),\n\t\t\t\t// otherwise setActiveOption() will be called by refreshOptions() with the wrong value\n\t\t\t\tif( !self.isPending && !self.settings.closeAfterSelect ){\n\t\t\t\t\tself.refreshOptions(self.isFocused && inputMode !== 'single');\n\t\t\t\t}\n\n\t\t\t\t// hide the menu if the maximum number of items have been selected or no options are left\n\t\t\t\tif( self.settings.closeAfterSelect != false && self.isFull() ){\n\t\t\t\t\tself.close();\n\t\t\t\t} else if (!self.isPending) {\n\t\t\t\t\tself.positionDropdown();\n\t\t\t\t}\n\n\t\t\t\tself.trigger('item_add', hashed, item);\n\n\t\t\t\tif (!self.isPending) {\n\t\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!self.isPending || (!wasFull && self.isFull())) {\n\t\t\t\tself.inputState();\n\t\t\t\tself.refreshState();\n\t\t\t}\n\n\t\t});\n\t}\n\n\t/**\n\t * Removes the selected item matching\n\t * the provided value.\n\t *\n\t */\n\tremoveItem( item:string|TomItem|null=null, silent?:boolean ){\n\t\tconst self\t\t= this;\n\t\titem\t\t\t= self.getItem(item);\n\n\t\tif( !item ) return;\n\n\t\tvar i,idx;\n\t\tconst value\t= item.dataset.value;\n\t\ti = nodeIndex(item);\n\n\t\titem.remove();\n\t\tif( item.classList.contains('active') ){\n\t\t\tidx = self.activeItems.indexOf(item);\n\t\t\tself.activeItems.splice(idx, 1);\n\t\t\tremoveClasses(item,'active');\n\t\t}\n\n\t\tself.items.splice(i, 1);\n\t\tself.lastQuery = null;\n\t\tif (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {\n\t\t\tself.removeOption(value, silent);\n\t\t}\n\n\t\tif (i < self.caretPos) {\n\t\t\tself.setCaret(self.caretPos - 1);\n\t\t}\n\n\t\tself.updateOriginalInput({silent: silent});\n\t\tself.refreshState();\n\t\tself.positionDropdown();\n\t\tself.trigger('item_remove', value, item);\n\n\t}\n\n\t/**\n\t * Invokes the `create` method provided in the\n\t * TomSelect options that should provide the data\n\t * for the new item, given the user input.\n\t *\n\t * Once this completes, it will be added\n\t * to the item list.\n\t *\n\t */\n\tcreateItem( input:null|string=null, callback:TomCreateCallback = ()=>{} ):boolean{\n\n\t\t// triggerDropdown parameter @deprecated 2.1.1\n\t\tif( arguments.length === 3 ){\n\t\t\tcallback = arguments[2];\n\t\t}\n\t\tif( typeof callback != 'function' ){\n\t\t\tcallback = () => {};\n\t\t}\n\n\t\tvar self  = this;\n\t\tvar caret = self.caretPos;\n\t\tvar output;\n\t\tinput = input || self.inputValue();\n\n\t\tif (!self.canCreate(input)) {\n\t\t\tcallback();\n\t\t\treturn false;\n\t\t}\n\n\t\tself.lock();\n\n\t\tvar created = false;\n\t\tvar create = (data?:boolean|TomOption) => {\n\t\t\tself.unlock();\n\n\t\t\tif (!data || typeof data !== 'object') return callback();\n\t\t\tvar value = hash_key(data[self.settings.valueField]);\n\t\t\tif( typeof value !== 'string' ){\n\t\t\t\treturn callback();\n\t\t\t}\n\n\t\t\tself.setTextboxValue();\n\t\t\tself.addOption(data,true);\n\t\t\tself.setCaret(caret);\n\t\t\tself.addItem(value);\n\t\t\tcallback(data);\n\t\t\tcreated = true;\n\t\t};\n\n\t\tif( typeof self.settings.create === 'function' ){\n\t\t\toutput = self.settings.create.call(this, input, create);\n\t\t}else{\n\t\t\toutput = {\n\t\t\t\t[self.settings.labelField]: input,\n\t\t\t\t[self.settings.valueField]: input,\n\t\t\t};\n\t\t}\n\n\t\tif( !created ){\n\t\t\tcreate(output);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Re-renders the selected item lists.\n\t */\n\trefreshItems() {\n\t\tvar self = this;\n\t\tself.lastQuery = null;\n\n\t\tif (self.isSetup) {\n\t\t\tself.addItems(self.items);\n\t\t}\n\n\t\tself.updateOriginalInput();\n\t\tself.refreshState();\n\t}\n\n\t/**\n\t * Updates all state-dependent attributes\n\t * and CSS classes.\n\t */\n\trefreshState() {\n\t\tconst self     = this;\n\n\t\tself.refreshValidityState();\n\n\t\tconst isFull\t= self.isFull();\n\t\tconst isLocked\t= self.isLocked;\n\n\t\tself.wrapper.classList.toggle('rtl',self.rtl);\n\n\n\t\tconst wrap_classList = self.wrapper.classList;\n\n\t\twrap_classList.toggle('focus', self.isFocused)\n\t\twrap_classList.toggle('disabled', self.isDisabled)\n\t\twrap_classList.toggle('readonly', self.isReadOnly)\n\t\twrap_classList.toggle('required', self.isRequired)\n\t\twrap_classList.toggle('invalid', !self.isValid)\n\t\twrap_classList.toggle('locked', isLocked)\n\t\twrap_classList.toggle('full', isFull)\n\t\twrap_classList.toggle('input-active', self.isFocused && !self.isInputHidden)\n\t\twrap_classList.toggle('dropdown-active', self.isOpen)\n\t\twrap_classList.toggle('has-options', isEmptyObject(self.options) )\n\t\twrap_classList.toggle('has-items', self.items.length > 0);\n\n\t}\n\n\n\t/**\n\t * Update the `required` attribute of both input and control input.\n\t *\n\t * The `required` property needs to be activated on the control input\n\t * for the error to be displayed at the right place. `required` also\n\t * needs to be temporarily deactivated on the input since the input is\n\t * hidden and can't show errors.\n\t */\n\trefreshValidityState() {\n\t\tvar self = this;\n\n\t\tif( !self.input.validity ){\n\t\t\treturn;\n\t\t}\n\n\t\tself.isValid = self.input.validity.valid;\n\t\tself.isInvalid = !self.isValid;\n\t}\n\n\t/**\n\t * Determines whether or not more items can be added\n\t * to the control without exceeding the user-defined maximum.\n\t *\n\t * @returns {boolean}\n\t */\n\tisFull() {\n\t\treturn this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;\n\t}\n\n\t/**\n\t * Refreshes the original <select> or <input>\n\t * element to reflect the current state.\n\t *\n\t */\n\tupdateOriginalInput( opts:TomArgObject = {} ){\n\t\tconst self = this;\n\t\tvar option, label;\n\n\t\tconst empty_option = self.input.querySelector('option[value=\"\"]') as HTMLOptionElement;\n\n\t\tif( self.is_select_tag ){\n\n\t\t\tconst selected:HTMLOptionElement[]\t\t= [];\n\t\t\tconst has_selected:number\t\t\t\t= self.input.querySelectorAll('option:checked').length;\n\n\t\t\tfunction AddSelected(option_el:HTMLOptionElement|null, value:string, label:string):HTMLOptionElement{\n\n\t\t\t\tif( !option_el ){\n\t\t\t\t\toption_el = getDom('<option value=\"' + escape_html(value) + '\">' + escape_html(label) + '</option>') as HTMLOptionElement;\n\t\t\t\t}\n\n\t\t\t\t// don't move empty option from top of list\n\t\t\t\t// fixes bug in firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1725293\n\t\t\t\tif( option_el != empty_option ){\n\t\t\t\t\tself.input.append(option_el);\n\t\t\t\t}\n\n\t\t\t\tselected.push(option_el);\n\n\t\t\t\t// marking empty option as selected can break validation\n\t\t\t\t// fixes https://github.com/orchidjs/tom-select/issues/303\n\t\t\t\tif( option_el != empty_option || has_selected > 0 ){\n\t\t\t\t\toption_el.selected = true;\n\t\t\t\t}\n\n\t\t\t\treturn option_el;\n\t\t\t}\n\n\t\t\t// unselect all selected options\n\t\t\tself.input.querySelectorAll('option:checked').forEach((option_el:Element) => {\n\t\t\t\t(<HTMLOptionElement>option_el).selected = false;\n\t\t\t});\n\n\n\t\t\t// nothing selected?\n\t\t\tif( self.items.length == 0 && self.settings.mode == 'single' ){\n\n\t\t\t\tAddSelected(empty_option, \"\", \"\");\n\n\t\t\t// order selected <option> tags for values in self.items\n\t\t\t}else{\n\n\t\t\t\tself.items.forEach((value)=>{\n\t\t\t\t\toption\t\t\t= self.options[value]!;\n\t\t\t\t\tlabel\t\t\t= option[self.settings.labelField] || '';\n\n\t\t\t\t\tif( selected.includes(option.$option) ){\n\t\t\t\t\t\tconst reuse_opt = self.input.querySelector(`option[value=\"${addSlashes(value)}\"]:not(:checked)`) as HTMLOptionElement;\n\t\t\t\t\t\tAddSelected(reuse_opt, value, label);\n\t\t\t\t\t}else{\n\t\t\t\t\t\toption.$option\t= AddSelected(option.$option, value, label);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t} else {\n\t\t\tself.input.value = self.getValue() as string;\n\t\t}\n\n\t\tif (self.isSetup) {\n\t\t\tif (!opts.silent) {\n\t\t\t\tself.trigger('change', self.getValue() );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Shows the autocomplete dropdown containing\n\t * the available options.\n\t */\n\topen() {\n\t\tvar self = this;\n\n\t\tif (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull())) return;\n\t\tself.isOpen = true;\n\t\tsetAttr(self.focus_node,{'aria-expanded': 'true'});\n\t\tself.refreshState();\n\t\tapplyCSS(self.dropdown,{visibility: 'hidden', display: 'block'});\n\t\tself.positionDropdown();\n\t\tapplyCSS(self.dropdown,{visibility: 'visible', display: 'block'});\n\t\tself.focus();\n\t\tself.trigger('dropdown_open', self.dropdown);\n\t}\n\n\t/**\n\t * Closes the autocomplete dropdown menu.\n\t */\n\tclose(setTextboxValue=true) {\n\t\tvar self = this;\n\t\tvar trigger = self.isOpen;\n\n\t\tif( setTextboxValue ){\n\n\t\t\t// before blur() to prevent form onchange event\n\t\t\tself.setTextboxValue();\n\n\t\t\tif (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\tself.inputState();\n\t\t\t}\n\t\t}\n\n\t\tself.isOpen = false;\n\t\tsetAttr(self.focus_node,{'aria-expanded': 'false'});\n\t\tapplyCSS(self.dropdown,{display: 'none'});\n\t\tif( self.settings.hideSelected ){\n\t\t\tself.clearActiveOption();\n\t\t}\n\t\tself.refreshState();\n\n\t\tif (trigger) self.trigger('dropdown_close', self.dropdown);\n\t}\n\n\t/**\n\t * Calculates and applies the appropriate\n\t * position of the dropdown if dropdownParent = 'body'.\n\t * Otherwise, position is determined by css\n\t */\n\tpositionDropdown(){\n\n\t\tif( this.settings.dropdownParent !== 'body' ){\n\t\t\treturn;\n\t\t}\n\n\t\tvar context\t\t\t= this.control;\n\t\tvar rect\t\t\t= context.getBoundingClientRect();\n\t\tvar top\t\t\t\t= context.offsetHeight + rect.top  + window.scrollY;\n\t\tvar left\t\t\t= rect.left + window.scrollX;\n\n\n\t\tapplyCSS(this.dropdown,{\n\t\t\twidth : rect.width + 'px',\n\t\t\ttop   : top + 'px',\n\t\t\tleft  : left + 'px'\n\t\t});\n\n\t}\n\n\t/**\n\t * Resets / clears all selected items\n\t * from the control.\n\t *\n\t */\n\tclear(silent?:boolean) {\n\t\tvar self = this;\n\n\t\tif (!self.items.length) return;\n\n\t\tvar items = self.controlChildren();\n\t\titerate(items,(item:TomItem)=>{\n\t\t\tself.removeItem(item,true);\n\t\t});\n\n\t\tself.inputState();\n\t\tif( !silent ) self.updateOriginalInput();\n\t\tself.trigger('clear');\n\t}\n\n\t/**\n\t * A helper method for inserting an element\n\t * at the current caret position.\n\t *\n\t */\n\tinsertAtCaret(el:HTMLElement) {\n\t\tconst self\t\t= this;\n\t\tconst caret\t\t= self.caretPos;\n\t\tconst target\t= self.control;\n\n\t\ttarget.insertBefore(el, target.children[caret] || null);\n\t\tself.setCaret(caret + 1);\n\t}\n\n\t/**\n\t * Removes the current selected item(s).\n\t *\n\t */\n\tdeleteSelection(e:KeyboardEvent):boolean {\n\t\tvar direction, selection, caret, tail;\n\t\tvar self = this;\n\n\t\tdirection = (e && e.keyCode === constants.KEY_BACKSPACE) ? -1 : 1;\n\t\tselection = getSelection(self.control_input);\n\n\n\t\t// determine items that will be removed\n\t\tconst rm_items:TomItem[]\t= [];\n\n\t\tif (self.activeItems.length) {\n\n\t\t\ttail = getTail(self.activeItems, direction);\n\t\t\tcaret = nodeIndex(tail);\n\n\t\t\tif (direction > 0) { caret++; }\n\n\t\t\titerate(self.activeItems, (item:TomItem) => rm_items.push(item) );\n\n\t\t} else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {\n\t\t\tconst items = self.controlChildren();\n\t\t\tlet rm_item;\n\t\t\tif( direction < 0 && selection.start === 0 && selection.length === 0 ){\n\t\t\t\trm_item = items[self.caretPos - 1];\n\n\t\t\t}else if( direction > 0 && selection.start === self.inputValue().length ){\n\t\t\t\trm_item = items[self.caretPos];\n\t\t\t}\n\n\t\t\tif( rm_item !== undefined ){\n\t\t\t\trm_items.push( rm_item );\n\t\t\t}\n\t\t}\n\n\t\tif( !self.shouldDelete(rm_items,e) ){\n\t\t\treturn false;\n\t\t}\n\n\t\tpreventDefault(e,true);\n\n\t\t// perform removal\n\t\tif (typeof caret !== 'undefined') {\n\t\t\tself.setCaret(caret);\n\t\t}\n\n\t\twhile( rm_items.length ){\n\t\t\tself.removeItem(rm_items.pop());\n\t\t}\n\n\t\tself.inputState();\n\t\tself.positionDropdown();\n\t\tself.refreshOptions(false);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Return true if the items should be deleted\n\t */\n\tshouldDelete(items:TomItem[],evt:MouseEvent|KeyboardEvent){\n\n\t\tconst values = items.map(item => item.dataset.value);\n\n\t\t// allow the callback to abort\n\t\tif( !values.length || (typeof this.settings.onDelete === 'function' && this.settings.onDelete(values,evt) === false) ){\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Selects the previous / next item (depending on the `direction` argument).\n\t *\n\t * > 0 - right\n\t * < 0 - left\n\t *\n\t */\n\tadvanceSelection(direction:number, e?:MouseEvent|KeyboardEvent) {\n\t\tvar last_active, adjacent, self = this;\n\n\t\tif (self.rtl) direction *= -1;\n\t\tif( self.inputValue().length ) return;\n\n\n\t\t// add or remove to active items\n\t\tif( isKeyDown(constants.KEY_SHORTCUT,e) || isKeyDown('shiftKey',e) ){\n\n\t\t\tlast_active\t\t\t= self.getLastActive(direction);\n\t\t\tif( last_active ){\n\n\t\t\t\tif( !last_active.classList.contains('active') ){\n\t\t\t\t\tadjacent\t\t\t= last_active;\n\t\t\t\t}else{\n\t\t\t\t\tadjacent\t\t\t= self.getAdjacent(last_active,direction,'item');\n\t\t\t\t}\n\n\t\t\t// if no active item, get items adjacent to the control input\n\t\t\t}else if( direction > 0 ){\n\t\t\t\tadjacent\t\t\t= self.control_input.nextElementSibling;\n\t\t\t}else{\n\t\t\t\tadjacent\t\t\t= self.control_input.previousElementSibling;\n\t\t\t}\n\n\n\t\t\tif( adjacent ){\n\t\t\t\tif( adjacent.classList.contains('active') ){\n\t\t\t\t\tself.removeActiveItem(last_active);\n\t\t\t\t}\n\t\t\t\tself.setActiveItemClass(adjacent); // mark as last_active !! after removeActiveItem() on last_active\n\t\t\t}\n\n\t\t// move caret to the left or right\n\t\t}else{\n\t\t\tself.moveCaret(direction);\n\t\t}\n\t}\n\n\tmoveCaret(direction:number){}\n\n\t/**\n\t * Get the last active item\n\t *\n\t */\n\tgetLastActive(direction?:number){\n\n\t\tlet last_active = this.control.querySelector('.last-active');\n\t\tif( last_active ){\n\t\t\treturn last_active;\n\t\t}\n\n\n\t\tvar result = this.control.querySelectorAll('.active');\n\t\tif( result ){\n\t\t\treturn getTail(result,direction);\n\t\t}\n\t}\n\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tsetCaret(new_pos:number) {\n\t\tthis.caretPos = this.items.length;\n\t}\n\n\t/**\n\t * Return list of item dom elements\n\t *\n\t */\n\tcontrolChildren():TomItem[]{\n\t\treturn Array.from( this.control.querySelectorAll('[data-ts-item]') ) as TomItem[];\n\t}\n\n\t/**\n\t * Disables user input on the control. Used while\n\t * items are being asynchronously created.\n\t */\n\tlock() {\n\t\tthis.setLocked(true);\n\t}\n\n\t/**\n\t * Re-enables user input on the control.\n\t */\n\tunlock() {\n\t\tthis.setLocked(false);\n\t}\n\n\t/**\n\t * Disable or enable user input on the control\n\t */\n\tsetLocked( lock:boolean = this.isReadOnly || this.isDisabled ){\n\t\tthis.isLocked = lock;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Disables user input on the control completely.\n\t * While disabled, it cannot receive focus.\n\t */\n\tdisable() {\n\t\tthis.setDisabled(true);\n\t\tthis.close();\n\t}\n\n\t/**\n\t * Enables the control so that it can respond\n\t * to focus and user input.\n\t */\n\tenable() {\n\t\tthis.setDisabled(false);\n\t}\n\n\tsetDisabled(disabled:boolean){\n\t\tthis.focus_node.tabIndex\t\t= disabled ? -1 : this.tabIndex;\n\t\tthis.isDisabled\t\t\t\t\t= disabled;\n\t\tthis.input.disabled\t\t\t\t= disabled;\n\t\tthis.control_input.disabled\t\t= disabled;\n\t\tthis.setLocked();\n\t}\n\n\tsetReadOnly(isReadOnly:boolean){\n\t\tthis.isReadOnly\t\t\t\t\t= isReadOnly;\n\t\tthis.input.readOnly\t\t\t\t= isReadOnly;\n\t\tthis.control_input.readOnly\t\t= isReadOnly;\n\t\tthis.setLocked();\n\t}\n\n\t/**\n\t * Completely destroys the control and\n\t * unbinds all event listeners so that it can\n\t * be garbage collected.\n\t */\n\tdestroy() {\n\t\tvar self = this;\n\t\tvar revertSettings = self.revertSettings;\n\n\t\tself.trigger('destroy');\n\t\tself.off();\n\t\tself.wrapper.remove();\n\t\tself.dropdown.remove();\n\n\t\tself.input.innerHTML = revertSettings.innerHTML;\n\t\tself.input.tabIndex = revertSettings.tabIndex;\n\n\t\tremoveClasses(self.input,'tomselected','ts-hidden-accessible');\n\n\t\tself._destroy();\n\n\t\tdelete self.input.tomselect;\n\t}\n\n\t/**\n\t * A helper method for rendering \"item\" and\n\t * \"option\" templates, given the data.\n\t *\n\t */\n\trender( templateName:TomTemplateNames, data?:any ):null|HTMLElement{\n\t\tvar id, html;\n\t\tconst self = this;\n\n\t\tif( typeof this.settings.render[templateName] !== 'function' ){\n\t\t\treturn null;\n\t\t}\n\n\t\t// render markup\n\t\thtml = self.settings.render[templateName].call(this, data, escape_html);\n\n\t\tif( !html ){\n\t\t\treturn null;\n\t\t}\n\n\t\thtml = getDom( html );\n\n\t\t// add mandatory attributes\n\t\tif (templateName === 'option' || templateName === 'option_create') {\n\n\t\t\tif( data[self.settings.disabledField] ){\n\t\t\t\tsetAttr(html,{'aria-disabled':'true'});\n\t\t\t}else{\n\t\t\t\tsetAttr(html,{'data-selectable': ''});\n\t\t\t}\n\n\t\t}else if (templateName === 'optgroup') {\n\t\t\tid = data.group[self.settings.optgroupValueField];\n\t\t\tsetAttr(html,{'data-group': id});\n\t\t\tif(data.group[self.settings.disabledField]) {\n\t\t\t\tsetAttr(html,{'data-disabled': ''});\n\t\t\t}\n\t\t}\n\n\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\tconst value\t= get_hash(data[self.settings.valueField]);\n\t\t\tsetAttr(html,{'data-value': value });\n\n\n\t\t\t// make sure we have some classes if a template is overwritten\n\t\t\tif( templateName === 'item' ){\n\t\t\t\taddClasses(html,self.settings.itemClass);\n\t\t\t\tsetAttr(html,{'data-ts-item':''});\n\t\t\t}else{\n\t\t\t\taddClasses(html,self.settings.optionClass);\n\t\t\t\tsetAttr(html,{\n\t\t\t\t\trole:'option',\n\t\t\t\t\tid:data.$id\n\t\t\t\t});\n\n\t\t\t\t// update cache\n\t\t\t\tdata.$div = html;\n\t\t\t\tself.options[value] = data;\n\t\t\t}\n\n\n\t\t}\n\n\t\treturn html;\n\n\t}\n\n\n\t/**\n\t * Type guarded rendering\n\t *\n\t */\n\t_render( templateName:TomTemplateNames, data?:any ):HTMLElement{\n\t\tconst html = this.render(templateName, data);\n\n\t\tif( html == null ){\n\t\t\tthrow 'HTMLElement expected';\n\t\t}\n\t\treturn html;\n\t}\n\n\n\t/**\n\t * Clears the render cache for a template. If\n\t * no template is given, clears all render\n\t * caches.\n\t *\n\t */\n\tclearCache():void{\n\n\t\titerate(this.options, (option:TomOption)=>{\n\t\t\tif( option.$div ){\n\t\t\t\toption.$div.remove();\n\t\t\t\tdelete option.$div;\n\t\t\t}\n\t\t});\n\n\t}\n\n\t/**\n\t * Removes a value from item and option caches\n\t *\n\t */\n\tuncacheValue(value:string){\n\n\t\tconst option_el\t\t\t= this.getOption(value);\n\t\tif( option_el ) option_el.remove();\n\n\t}\n\n\t/**\n\t * Determines whether or not to display the\n\t * create item prompt, given a user input.\n\t *\n\t */\n\tcanCreate( input:string ):boolean {\n\t\treturn this.settings.create && (input.length > 0) && (this.settings.createFilter as TomCreateFilter ).call(this, input);\n\t}\n\n\n\t/**\n\t * Wraps this.`method` so that `new_fn` can be invoked 'before', 'after', or 'instead' of the original method\n\t *\n\t * this.hook('instead','onKeyDown',function( arg1, arg2 ...){\n\t *\n\t * });\n\t */\n\thook( when:string, method:string, new_fn:any ){\n\t\tvar self = this;\n\t\tvar orig_method = self[method];\n\n\n\t\tself[method] = function(){\n\t\t\tvar result, result_new;\n\n\t\t\tif( when === 'after' ){\n\t\t\t\tresult = orig_method.apply(self, arguments);\n\t\t\t}\n\n\t\t\tresult_new = new_fn.apply(self, arguments );\n\n\t\t\tif( when === 'instead' ){\n\t\t\t\treturn result_new;\n\t\t\t}\n\n\t\t\tif( when === 'before' ){\n\t\t\t\tresult = orig_method.apply(self, arguments);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\n\t}\n\n};\n","/**\n * microplugin.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\ntype TSettings = {\n\t[key:string]:any\n}\n\ntype TPlugins = {\n\tnames: string[],\n\tsettings: TSettings,\n\trequested: {[key:string]:boolean},\n\tloaded: {[key:string]:any}\n};\n\nexport type TPluginItem = {name:string,options:{}};\nexport type TPluginHash = {[key:string]:{}};\n\n\n\n\nexport default function MicroPlugin(Interface: any ){\n\n\tInterface.plugins = {};\n\n\treturn class extends Interface{\n\n\t\tpublic plugins:TPlugins = {\n\t\t\tnames     : [],\n\t\t\tsettings  : {},\n\t\t\trequested : {},\n\t\t\tloaded    : {}\n\t\t};\n\n\t\t/**\n\t\t * Registers a plugin.\n\t\t *\n\t\t * @param {function} fn\n\t\t */\n\t\tstatic define(name:string, fn:(this:any,settings:TSettings)=>any){\n\t\t\tInterface.plugins[name] = {\n\t\t\t\t'name' : name,\n\t\t\t\t'fn'   : fn\n\t\t\t};\n\t\t}\n\n\n\t\t/**\n\t\t * Initializes the listed plugins (with options).\n\t\t * Acceptable formats:\n\t\t *\n\t\t * List (without options):\n\t\t *   ['a', 'b', 'c']\n\t\t *\n\t\t * List (with options):\n\t\t *   [{'name': 'a', options: {}}, {'name': 'b', options: {}}]\n\t\t *\n\t\t * Hash (with options):\n\t\t *   {'a': { ... }, 'b': { ... }, 'c': { ... }}\n\t\t *\n\t\t * @param {array|object} plugins\n\t\t */\n\t\tinitializePlugins(plugins:string[]|TPluginItem[]|TPluginHash) {\n\t\t\tvar key, name;\n\t\t\tconst self  = this;\n\t\t\tconst queue:string[] = [];\n\n\t\t\tif (Array.isArray(plugins)) {\n\t\t\t\tplugins.forEach((plugin:string|TPluginItem)=>{\n\t\t\t\t\tif (typeof plugin === 'string') {\n\t\t\t\t\t\tqueue.push(plugin);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.plugins.settings[plugin.name] = plugin.options;\n\t\t\t\t\t\tqueue.push(plugin.name);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (plugins) {\n\t\t\t\tfor (key in plugins) {\n\t\t\t\t\tif (plugins.hasOwnProperty(key)) {\n\t\t\t\t\t\tself.plugins.settings[key] = plugins[key];\n\t\t\t\t\t\tqueue.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile( name = queue.shift() ){\n\t\t\t\tself.require(name);\n\t\t\t}\n\t\t}\n\n\t\tloadPlugin(name:string) {\n\t\t\tvar self    = this;\n\t\t\tvar plugins = self.plugins;\n\t\t\tvar plugin  = Interface.plugins[name];\n\n\t\t\tif (!Interface.plugins.hasOwnProperty(name)) {\n\t\t\t\tthrow new Error('Unable to find \"' +  name + '\" plugin');\n\t\t\t}\n\n\t\t\tplugins.requested[name] = true;\n\t\t\tplugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);\n\t\t\tplugins.names.push(name);\n\t\t}\n\n\t\t/**\n\t\t * Initializes a plugin.\n\t\t *\n\t\t */\n\t\trequire(name:string) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\n\t\t\tif (!self.plugins.loaded.hasOwnProperty(name)) {\n\t\t\t\tif (plugins.requested[name]) {\n\t\t\t\t\tthrow new Error('Plugin has circular dependency (\"' + name + '\")');\n\t\t\t\t}\n\t\t\t\tself.loadPlugin(name);\n\t\t\t}\n\n\t\t\treturn plugins.loaded[name];\n\t\t}\n\n\t};\n\n}\n","import TomSelect from './tom-select';\n\nimport change_listener from './plugins/change_listener/plugin';\nimport checkbox_options from './plugins/checkbox_options/plugin';\nimport clear_button from './plugins/clear_button/plugin';\nimport drag_drop from './plugins/drag_drop/plugin';\nimport dropdown_header from './plugins/dropdown_header/plugin';\nimport caret_position from './plugins/caret_position/plugin';\nimport dropdown_input from './plugins/dropdown_input/plugin';\nimport input_autogrow from './plugins/input_autogrow/plugin';\nimport no_backspace_delete from './plugins/no_backspace_delete/plugin';\nimport no_active_items from './plugins/no_active_items/plugin';\nimport optgroup_columns from './plugins/optgroup_columns/plugin';\nimport remove_button from './plugins/remove_button/plugin';\nimport restore_on_backspace from './plugins/restore_on_backspace/plugin';\nimport virtual_scroll from './plugins/virtual_scroll/plugin';\n\nTomSelect.define('change_listener', change_listener);\nTomSelect.define('checkbox_options', checkbox_options);\nTomSelect.define('clear_button', clear_button);\nTomSelect.define('drag_drop', drag_drop);\nTomSelect.define('dropdown_header', dropdown_header);\nTomSelect.define('caret_position', caret_position);\nTomSelect.define('dropdown_input', dropdown_input);\nTomSelect.define('input_autogrow', input_autogrow);\nTomSelect.define('no_backspace_delete', no_backspace_delete);\nTomSelect.define('no_active_items', no_active_items);\nTomSelect.define('optgroup_columns', optgroup_columns);\nTomSelect.define('remove_button', remove_button);\nTomSelect.define('restore_on_backspace', restore_on_backspace);\nTomSelect.define('virtual_scroll', virtual_scroll);\n\nexport default TomSelect;\n","/**\n * Plugin: \"change_listener\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { addEvent } from '../../utils';\n\nexport default function(this:TomSelect) {\n\taddEvent(this.input,'change',()=>{\n\t\tthis.sync();\n\t});\n};\n","/**\n * Plugin: \"checkbox_options\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { preventDefault, hash_key } from '../../utils';\nimport { getDom } from '../../vanilla';\nimport { CBOptions } from './types';\n\n\nexport default function(this:TomSelect, userOptions:CBOptions) {\n\tvar self = this;\n\tvar orig_onOptionSelect = self.onOptionSelect;\n\n\tself.settings.hideSelected = false;\n\n\tconst cbOptions : CBOptions = Object.assign({\n\t\t// so that the user may add different ones as well\n\t\tclassName             : \"tomselect-checkbox\",\n\n\t\t// the following default to the historic plugin's values\n\t\tcheckedClassNames     : undefined,\n\t\tuncheckedClassNames   : undefined,\n\t}, userOptions);\n\n\n\tvar UpdateChecked = function(checkbox:HTMLInputElement, toCheck : boolean) {\n\t\tif( toCheck ){\n\t\t\tcheckbox.checked = true;\n\t\t\tif (cbOptions.uncheckedClassNames) {\n\t\t\t\tcheckbox.classList.remove(...cbOptions.uncheckedClassNames);\n\t\t\t}\n\t\t\tif (cbOptions.checkedClassNames) {\n\t\t\t\tcheckbox.classList.add(...cbOptions.checkedClassNames);\n\t\t\t}\n\t\t}else{\n\t\t\tcheckbox.checked = false;\n\t\t\tif (cbOptions.checkedClassNames) {\n\t\t\t\tcheckbox.classList.remove(...cbOptions.checkedClassNames);\n\t\t\t}\n\t\t\tif (cbOptions.uncheckedClassNames) {\n\t\t\t\tcheckbox.classList.add(...cbOptions.uncheckedClassNames);\n\t\t\t}\n\t\t}\n\t}\n\n\t// update the checkbox for an option\n\tvar UpdateCheckbox = function(option:HTMLElement){\n\t\tsetTimeout(()=>{\n\t\t\tvar checkbox = option.querySelector('input.' + cbOptions.className);\n\t\t\tif( checkbox instanceof HTMLInputElement ){\n\t\t\t\tUpdateChecked(checkbox, option.classList.contains('selected'));\n\t\t\t}\n\t\t},1);\n\t};\n\n\t// add checkbox to option template\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_option = self.settings.render.option;\n\n\t\tself.settings.render.option = (data, escape_html) => {\n\t\t\tvar rendered = getDom(orig_render_option.call(self, data, escape_html));\n\t\t\tvar checkbox = document.createElement('input');\n\t\t\tif (cbOptions.className) {\n\t\t\t\tcheckbox.classList.add(cbOptions.className);\n\t\t\t}\n\t\t\tcheckbox.addEventListener('click',function(evt){\n\t\t\t\tpreventDefault(evt);\n\t\t\t});\n\n\t\t\tcheckbox.type = 'checkbox';\n\t\t\tconst hashed = hash_key(data[self.settings.valueField]);\n\n\t\t\tUpdateChecked(checkbox, !!(hashed && self.items.indexOf(hashed) > -1) );\n\n\t\t\trendered.prepend(checkbox);\n\t\t\treturn rendered;\n\t\t};\n\t});\n\n\t// uncheck when item removed\n\tself.on('item_remove',(value:string) => {\n\t\tvar option = self.getOption(value);\n\n\t\tif( option ){ // if dropdown hasn't been opened yet, the option won't exist\n\t\t\toption.classList.remove('selected'); // selected class won't be removed yet\n\t\t\tUpdateCheckbox(option);\n\t\t}\n\t});\n\n\t// check when item added\n\tself.on('item_add',(value:string) => {\n\t\tvar option = self.getOption(value);\n\n\t\tif( option ){ // if dropdown hasn't been opened yet, the option won't exist\n\t\t\tUpdateCheckbox(option);\n\t\t}\n\t});\n\n\n\t// remove items when selected option is clicked\n\tself.hook('instead','onOptionSelect',( evt:KeyboardEvent, option:HTMLElement )=>{\n\n\t\tif( option.classList.contains('selected') ){\n\t\t\toption.classList.remove('selected')\n\t\t\tself.removeItem(option.dataset.value);\n\t\t\tself.refreshOptions();\n\t\t\tpreventDefault(evt,true);\n\t\t\treturn;\n        }\n\n\t\torig_onOptionSelect.call(self, evt, option);\n\n\t\tUpdateCheckbox(option);\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { getDom } from '../../vanilla';\nimport { CBOptions } from './types';\n\nexport default function(this:TomSelect, userOptions:CBOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\tclassName: 'clear-button',\n\t\ttitle: 'Clear All',\n\t\thtml: (data:CBOptions) => {\n\t\t\treturn `<div class=\"${data.className}\" title=\"${data.title}\">&#10799;</div>`;\n\t\t}\n\t}, userOptions);\n\n\tself.on('initialize',()=>{\n\t\tvar button = getDom(options.html(options));\n\t\tbutton.addEventListener('click',(evt)=>{\n\n\t\t\tif( self.isLocked ) return;\n\n\t\t\tself.clear();\n\n\t\t\tif( self.settings.mode === 'single' && self.settings.allowEmptyOption ){\n\t\t\t\tself.addItem('');\n\t\t\t}\n\n\t\t\tevt.preventDefault();\n\t\t\tevt.stopPropagation();\n\t\t});\n\t\tself.control.appendChild(button);\n\t});\n\n};\n","/**\n * Plugin: \"drag_drop\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { TomOption, TomItem } from '../../types/index';\nimport { escape_html, preventDefault, addEvent } from '../../utils';\nimport { getDom, setAttr } from '../../vanilla';\n\n\nconst insertAfter = (referenceNode:Element, newNode:Element) => {\n\treferenceNode.parentNode?.insertBefore(newNode, referenceNode.nextSibling);\n}\n\nconst insertBefore = (referenceNode:Element, newNode:Element) => {\n\treferenceNode.parentNode?.insertBefore(newNode, referenceNode);\n}\n\nconst isBefore = (referenceNode:Element|undefined|null, newNode:Element|undefined|null) =>{\n\t\n\tdo{\n\t\tnewNode = newNode?.previousElementSibling;\n\n\t\tif( referenceNode == newNode ){\n\t\t\treturn true;\n\t\t}\n\n\t}while( newNode && newNode.previousElementSibling );\n\n\treturn false;\n}\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tif (self.settings.mode !== 'multi') return;\n\n\tvar orig_lock\t\t= self.lock;\n\tvar orig_unlock\t\t= self.unlock;\n\tlet sortable = true;\n\t\tlet drag_item:TomItem|undefined;\n\n\n\t/**\n\t * Add draggable attribute to item\n\t */\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_item = self.settings.render.item;\n\n\t\tself.settings.render.item = (data:TomOption, escape:typeof escape_html) => {\n\t\t\tconst item = getDom(orig_render_item.call(self, data, escape)) as TomItem;\n\t\t\tsetAttr(item,{'draggable':'true'});\n\n\n\t\t\t// prevent doc_mousedown (see tom-select.ts)\n\t\t\tconst mousedown = (evt:Event) => {\n\t\t\t\tif( !sortable ) preventDefault(evt);\n\t\t\t\tevt.stopPropagation();\n\t\t\t}\n\n\t\t\tconst dragStart = (evt:Event) => {\n\t\t\t\tdrag_item = item;\n\t\t\t\t\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\titem.classList.add('ts-dragging');\n\t\t\t\t}, 0);\n\t\t\t\t\n\t\t\t}\n\n\t\t\tconst dragOver = (evt:Event) =>{\n\t\t\t\tevt.preventDefault();\n\t\t\t\titem.classList.add('ts-drag-over');\n\t\t\t\tmoveitem(item,drag_item);\n\t\t\t}\n\n\t\t\tconst dragLeave = () => {\n\t\t\t\titem.classList.remove('ts-drag-over');\n\t\t\t}\n\n\t\t\tconst moveitem = (targetitem:TomItem, dragitem:TomItem|undefined) => {\n\t\t\t\tif( dragitem === undefined ) return;\n\t\t\t\t\n\t\t\t\tif( isBefore(dragitem,item) ){\n\t\t\t\t\tinsertAfter(targetitem,dragitem);\n\t\t\t\t}else{\n\t\t\t\t\tinsertBefore(targetitem,dragitem);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst dragend = () => {\n\t\t\t\tdocument.querySelectorAll('.ts-drag-over').forEach(el=> el.classList.remove('ts-drag-over'));\n\t\t\t\tdrag_item?.classList.remove('ts-dragging');\n\t\t\t\tdrag_item = undefined;\n\n\t\t\t\tvar values:string[] = [];\n\t\t\t\tself.control.querySelectorAll(`[data-value]`).forEach((el:Element)=> {\n\t\t\t\t\tif( (<HTMLOptionElement>el).dataset.value ){\n\t\t\t\t\t\tlet value = (<HTMLOptionElement>el).dataset.value;\n\t\t\t\t\t\tif( value ){\n\t\t\t\t\t\t\tvalues.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tself.setValue(values);\n\t\t\t}\t\n\n\n\t\t\taddEvent(item,'mousedown', mousedown);\n\t\t\taddEvent(item,'dragstart', dragStart);\n\t\t\taddEvent(item,'dragenter', dragOver)\n\t\t\taddEvent(item,'dragover', dragOver);\n\t\t\taddEvent(item,'dragleave', dragLeave);\n\t\t\taddEvent(item,'dragend', dragend);\n\t\t\t\t\n\t\t\treturn item;\n\t\t}\t\n\t});\n\n\n\n\tself.hook('instead','lock',()=>{\n\t\tsortable = false;\n\t\treturn orig_lock.call(self);\n\t});\n\n\tself.hook('instead','unlock',()=>{\n\t\tsortable = true;\n\t\treturn orig_unlock.call(self);\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { getDom } from '../../vanilla';\nimport { preventDefault } from '../../utils';\nimport { DHOptions } from './types';\n\nexport default function(this:TomSelect, userOptions:DHOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\ttitle         : 'Untitled',\n\t\theaderClass   : 'dropdown-header',\n\t\ttitleRowClass : 'dropdown-header-title',\n\t\tlabelClass    : 'dropdown-header-label',\n\t\tcloseClass    : 'dropdown-header-close',\n\n\t\thtml: (data:DHOptions) => {\n\t\t\treturn (\n\t\t\t\t'<div class=\"' + data.headerClass + '\">' +\n\t\t\t\t\t'<div class=\"' + data.titleRowClass + '\">' +\n\t\t\t\t\t\t'<span class=\"' + data.labelClass + '\">' + data.title + '</span>' +\n\t\t\t\t\t\t'<a class=\"' + data.closeClass + '\">&times;</a>' +\n\t\t\t\t\t'</div>' +\n\t\t\t\t'</div>'\n\t\t\t);\n\t\t}\n\t}, userOptions);\n\n\tself.on('initialize',()=>{\n\t\tvar header = getDom(options.html(options));\n\n\t\tvar close_link = header.querySelector('.'+options.closeClass);\n\t\tif( close_link ){\n\t\t\tclose_link.addEventListener('click',(evt)=>{\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t\tself.close();\n\t\t\t});\n\t\t}\n\n\t\tself.dropdown.insertBefore(header, self.dropdown.firstChild);\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { nodeIndex, removeClasses } from '../../vanilla';\n\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tself.hook('instead','setCaret',(new_pos:number) => {\n\n\t\tif( self.settings.mode === 'single' || !self.control.contains(self.control_input) ) {\n\t\t\tnew_pos = self.items.length;\n\t\t} else {\n\t\t\tnew_pos = Math.max(0, Math.min(self.items.length, new_pos));\n\n\t\t\tif( new_pos != self.caretPos && !self.isPending ){\n\n\t\t\t\tself.controlChildren().forEach((child,j) => {\n\t\t\t\t\tif( j < new_pos ){\n\t\t\t\t\t\tself.control_input.insertAdjacentElement('beforebegin', child );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.control.appendChild( child );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tself.caretPos = new_pos;\n\t});\n\n\tself.hook('instead','moveCaret',(direction:number) => {\n\n\t\tif( !self.isFocused ) return;\n\n\t\t// move caret before or after selected items\n\t\tconst last_active\t\t= self.getLastActive(direction);\n\t\tif( last_active ){\n\t\t\tconst idx = nodeIndex(last_active);\n\t\t\tself.setCaret(direction > 0 ? idx + 1: idx);\n\t\t\tself.setActiveItem();\n\t\t\tremoveClasses(last_active as HTMLElement,'last-active');\n\n\t\t// move caret left or right of current position\n\t\t}else{\n\t\t\tself.setCaret(self.caretPos + direction);\n\n\t\t}\n\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport * as constants from '../../constants';\nimport { getDom, addClasses } from '../../vanilla';\nimport { addEvent, preventDefault } from '../../utils';\n\n\nexport default function(this:TomSelect) {\n\tconst self = this;\n\n\tself.settings.shouldOpen = true; // make sure the input is shown even if there are no options to display in the dropdown\n\n\tself.hook('before','setup',()=>{\n\t\tself.focus_node\t\t= self.control;\n\n\t\taddClasses( self.control_input, 'dropdown-input');\n\n\t \tconst div = getDom('<div class=\"dropdown-input-wrap\">');\n\t\tdiv.append(self.control_input);\n\t\tself.dropdown.insertBefore(div, self.dropdown.firstChild);\n\n\t\t// set a placeholder in the select control\n\t\tconst placeholder = getDom('<input class=\"items-placeholder\" tabindex=\"-1\" />') as HTMLInputElement;\n\t\tplaceholder.placeholder = self.settings.placeholder ||'';\n\t\tself.control.append(placeholder);\n\n\t});\n\n\n\tself.on('initialize',()=>{\n\n\t\t// set tabIndex on control to -1, otherwise [shift+tab] will put focus right back on control_input\n\t\tself.control_input.addEventListener('keydown',(evt:KeyboardEvent) =>{\n\t\t//addEvent(self.control_input,'keydown' as const,(evt:KeyboardEvent) =>{\n\t\t\tswitch( evt.keyCode ){\n\t\t\t\tcase constants.KEY_ESC:\n\t\t\t\t\tif (self.isOpen) {\n\t\t\t\t\t\tpreventDefault(evt,true);\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t\tself.clearActiveItems();\n\t\t\t\treturn;\n\t\t\t\tcase constants.KEY_TAB:\n\t\t\t\t\tself.focus_node.tabIndex = -1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn self.onKeyDown.call(self,evt);\n\t\t});\n\n\t\tself.on('blur',()=>{\n\t\t\tself.focus_node.tabIndex = self.isDisabled ? -1 : self.tabIndex;\n\t\t});\n\n\n\t\t// give the control_input focus when the dropdown is open\n\t\tself.on('dropdown_open',() =>{\n\t\t\tself.control_input.focus();\n\t\t});\n\n\t\t// prevent onBlur from closing when focus is on the control_input\n\t\tconst orig_onBlur = self.onBlur;\n\t\tself.hook('instead','onBlur',(evt?:FocusEvent)=>{\n\t\t\tif( evt && evt.relatedTarget == self.control_input ) return;\n\t\t\treturn orig_onBlur.call(self);\n\t\t});\n\n\t\taddEvent(self.control_input,'blur', () => self.onBlur() );\n\n\t\t// return focus to control to allow further keyboard input\n\t\tself.hook('before','close',() =>{\n\n\t\t\tif( !self.isOpen ) return;\n\t\t\tself.focus_node.focus({preventScroll: true});\n\t\t});\n\n\t});\n\n};\n","/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { addEvent } from '../../utils';\n\nexport default function(this:TomSelect) {\n\tvar self\t\t\t\t\t= this;\n\n\tself.on('initialize',()=>{\n\n\n\t\tvar test_input\t\t\t\t= document.createElement('span');\n\t\tvar control\t\t\t\t\t= self.control_input;\n\t\ttest_input.style.cssText\t= 'position:absolute; top:-99999px; left:-99999px; width:auto; padding:0; white-space:pre; ';\n\n\t\tself.wrapper.appendChild(test_input);\n\n\n\t\tvar transfer_styles\t\t\t= [ 'letterSpacing', 'fontSize', 'fontFamily', 'fontWeight', 'textTransform' ];\n\n\t\tfor( const style_name of transfer_styles ){\n\t\t\t// @ts-ignore TS7015 https://stackoverflow.com/a/50506154/697576\n\t\t\ttest_input.style[style_name] = control.style[style_name];\n\t\t}\n\n\n\t\t/**\n\t\t * Set the control width\n\t\t *\n\t\t */\n\t\tvar resize = ()=>{\n\t\t\ttest_input.textContent\t= control.value;\n\t\t\tcontrol.style.width\t\t= test_input.clientWidth+'px';\n\t\t};\n\n\t\tresize();\n\t\tself.on('update item_add item_remove',resize);\n\t\taddEvent(control,'input', resize );\n\t\taddEvent(control,'keyup', resize );\n\t\taddEvent(control,'blur', resize );\n\t\taddEvent(control,'update', resize );\n\t});\n\n};\n","/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tvar orig_deleteSelection = self.deleteSelection;\n\n\tthis.hook('instead','deleteSelection',(evt:KeyboardEvent) => {\n\n\t\tif( self.activeItems.length ){\n\t\t\treturn orig_deleteSelection.call(self, evt);\n\t\t}\n\n\t\treturn false;\n\t});\n\n};\n","/**\n * Plugin: \"no_active_items\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\n\nexport default function(this:TomSelect) {\n\tthis.hook('instead','setActiveItem',() => {});\n\tthis.hook('instead','selectAll',() => {});\n};\n","/**\n * Plugin: \"optgroup_columns\" (Tom Select.js)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport * as constants from '../../constants';\nimport { parentMatch, nodeIndex } from '../../vanilla';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\tvar orig_keydown = self.onKeyDown;\n\n\tself.hook('instead','onKeyDown',(evt:KeyboardEvent)=>{\n\t\tvar index, option, options, optgroup;\n\n\t\tif( !self.isOpen || !(evt.keyCode === constants.KEY_LEFT || evt.keyCode === constants.KEY_RIGHT)) {\n\t\t\treturn orig_keydown.call(self,evt);\n\t\t}\n\n\t\tself.ignoreHover\t= true;\n\t\toptgroup\t\t\t= parentMatch(self.activeOption,'[data-group]');\n\t\tindex\t\t\t\t= nodeIndex(self.activeOption,'[data-selectable]');\n\n\t\tif( !optgroup ){\n\t\t\treturn;\n\t\t}\n\n\t\tif( evt.keyCode === constants.KEY_LEFT ){\n\t\t\toptgroup = optgroup.previousSibling;\n\t\t} else {\n\t\t\toptgroup = optgroup.nextSibling;\n\t\t}\n\n\t\tif( !optgroup ){\n\t\t\treturn;\n\t\t}\n\n\t\toptions\t\t\t\t= (<HTMLOptGroupElement>optgroup).querySelectorAll('[data-selectable]');\n\t\toption\t\t\t\t= options[ Math.min(options.length - 1, index) ] as HTMLElement;\n\n\t\tif( option ){\n\t\t\tself.setActiveOption(option);\n\t\t}\n\n\t});\n\n};\n","/**\n * Plugin: \"remove_button\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { getDom } from '../../vanilla';\nimport { escape_html, preventDefault, addEvent } from '../../utils';\nimport { TomOption, TomItem } from '../../types/index';\nimport { RBOptions } from './types';\n\nexport default function(this:TomSelect, userOptions:RBOptions) {\n\n\tconst options = Object.assign({\n\t\t\tlabel     : '&times;',\n\t\t\ttitle     : 'Remove',\n\t\t\tclassName : 'remove',\n\t\t\tappend    : true\n\t\t}, userOptions);\n\n\n\t//options.className = 'remove-single';\n\tvar self\t\t\t= this;\n\n\t// override the render method to add remove button to each item\n\tif( !options.append ){\n\t\treturn;\n\t}\n\n\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_item = self.settings.render.item;\n\n\t\tself.settings.render.item = (data:TomOption, escape:typeof escape_html) => {\n\n\t\t\tvar item = getDom(orig_render_item.call(self, data, escape)) as TomItem;\n\n\t\t\tvar close_button = getDom(html);\n\t\t\titem.appendChild(close_button);\n\n\t\t\taddEvent(close_button,'mousedown',(evt) => {\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t});\n\n\t\t\taddEvent(close_button,'click',(evt) => {\n\n\t\t\t\tif( self.isLocked ) return;\n\n\t\t\t\t// propagating will trigger the dropdown to show for single mode\n\t\t\t\tpreventDefault(evt,true);\n\n\t\t\t\tif( self.isLocked ) return;\n\t\t\t\tif( !self.shouldDelete([item],evt as MouseEvent) ) return;\n\n\t\t\t\tself.removeItem(item);\n\t\t\t\tself.refreshOptions(false);\n\t\t\t\tself.inputState();\n\t\t\t});\n\n\t\t\treturn item;\n\t\t};\n\n\t});\n\n\n};\n","/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nimport TomSelect from '../../tom-select';\nimport { TomOption } from '../../types/index';\n\ntype TPluginOptions = {\n\ttext?:(option:TomOption)=>string,\n};\n\nexport default function(this:TomSelect, userOptions:TPluginOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\ttext: (option:TomOption) => {\n\t\t\treturn option[self.settings.labelField];\n\t\t}\n\t},userOptions);\n\n\tself.on('item_remove',function(value:string){\n\t\tif( !self.isFocused ){\n\t\t\treturn;\n\t\t}\n\n\t\tif( self.control_input.value.trim() === '' ){\n\t\t\tvar option = self.options[value];\n\t\t\tif( option ){\n\t\t\t\tself.setTextboxValue(options.text.call(self, option));\n\t\t\t}\n\t\t}\n\t});\n\n};\n","/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { TomOption } from '../../types/index';\nimport { addClasses } from '../../vanilla';\n\nexport default function(this:TomSelect) {\n\tconst self\t\t\t\t\t\t\t= this;\n\tconst orig_canLoad\t\t\t\t\t= self.canLoad;\n\tconst orig_clearActiveOption\t\t= self.clearActiveOption;\n\tconst orig_loadCallback\t\t\t\t= self.loadCallback;\n\n\tvar pagination:{[key:string]:any}\t= {};\n\tvar dropdown_content:HTMLElement;\n\tvar loading_more\t\t\t\t\t= false;\n\tvar load_more_opt:HTMLElement;\n\tvar default_values: string[]\t\t= [];\n\n\tif( !self.settings.shouldLoadMore ){\n\n\t\t// return true if additional results should be loaded\n\t\tself.settings.shouldLoadMore = ():boolean=>{\n\n\t\t\tconst scroll_percent = dropdown_content.clientHeight / (dropdown_content.scrollHeight - dropdown_content.scrollTop);\n\t\t\tif( scroll_percent > 0.9 ){\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif( self.activeOption ){\n\t\t\t\tvar selectable\t= self.selectable();\n\t\t\t\tvar index\t\t= Array.from(selectable).indexOf(self.activeOption);\n\t\t\t\tif( index >= (selectable.length-2) ){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}\n\n\n\tif( !self.settings.firstUrl ){\n\t\tthrow 'virtual_scroll plugin requires a firstUrl() method';\n\t}\n\n\n\t// in order for virtual scrolling to work,\n\t// options need to be ordered the same way they're returned from the remote data source\n\tself.settings.sortField\t\t\t= [{field:'$order'},{field:'$score'}];\n\n\n\t// can we load more results for given query?\n\tconst canLoadMore = (query:string):boolean => {\n\n\t\tif( typeof self.settings.maxOptions === 'number' && dropdown_content.children.length >= self.settings.maxOptions ){\n\t\t\treturn false;\n\t\t}\n\n\t\tif( (query in pagination) && pagination[query] ){\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tconst clearFilter = (option:TomOption, value:string):boolean => {\n\t\tif( self.items.indexOf(value) >= 0 || default_values.indexOf(value) >= 0 ){\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\n\t// set the next url that will be\n\tself.setNextUrl = (value:string,next_url:any):void => {\n\t\tpagination[value] = next_url;\n\t};\n\n\t// getUrl() to be used in settings.load()\n\tself.getUrl = (query:string):any =>{\n\n\t\tif( query in pagination ){\n\t\t\tconst next_url = pagination[query];\n\t\t\tpagination[query] = false;\n\t\t\treturn next_url;\n\t\t}\n\n\t\t// if the user goes back to a previous query\n\t\t// we need to load the first page again\n\t\tself.clearPagination();\n\n\t\treturn self.settings.firstUrl.call(self,query);\n\t};\n\n\t// clear pagination\n\tself.clearPagination = ():void =>{\n\t\tpagination = {};\n\t};\n\n\t// don't clear the active option (and cause unwanted dropdown scroll)\n\t// while loading more results\n\tself.hook('instead','clearActiveOption',()=>{\n\n\t\tif( loading_more ){\n\t\t\treturn;\n\t\t}\n\n\t\treturn orig_clearActiveOption.call(self);\n\t});\n\n\t// override the canLoad method\n\tself.hook('instead','canLoad',(query:string)=>{\n\n\t\t// first time the query has been seen\n\t\tif( !(query in pagination) ){\n\t\t\treturn orig_canLoad.call(self,query);\n\t\t}\n\n\t\treturn canLoadMore(query);\n\t});\n\n\n\t// wrap the load\n\tself.hook('instead','loadCallback',( options:TomOption[], optgroups:TomOption[])=>{\n\n\t\tif( !loading_more ){\n\t\t\tself.clearOptions(clearFilter);\n\t\t}else if( load_more_opt ){\n\t\t\tconst first_option = options[0];\n\t\t\tif( first_option !== undefined ){\n\t\t\t\tload_more_opt.dataset.value\t\t= first_option[self.settings.valueField];\n\t\t\t}\n\t\t}\n\n\t\torig_loadCallback.call( self, options, optgroups);\n\n\t\tloading_more = false;\n\t});\n\n\n\t// add templates to dropdown\n\t//\tloading_more if we have another url in the queue\n\t//\tno_more_results if we don't have another url in the queue\n\tself.hook('after','refreshOptions',()=>{\n\n\t\tconst query\t\t= self.lastValue;\n\t\tvar option;\n\n\t\tif( canLoadMore(query) ){\n\n\t\t\toption = self.render('loading_more',{query:query});\n\t\t\tif( option ){\n\t\t\t\toption.setAttribute('data-selectable',''); // so that navigating dropdown with [down] keypresses can navigate to this node\n\t\t\t\tload_more_opt = option;\n\t\t\t}\n\n\t\t}else if( (query in pagination) && !dropdown_content.querySelector('.no-results') ){\n\t\t\toption = self.render('no_more_results',{query:query});\n\t\t}\n\n\t\tif( option ){\n\t\t\taddClasses(option,self.settings.optionClass);\n\t\t\tdropdown_content.append( option );\n\t\t}\n\n\t});\n\n\n\t// add scroll listener and default templates\n\tself.on('initialize',()=>{\n\t\tdefault_values = Object.keys(self.options);\n\t\tdropdown_content = self.dropdown_content;\n\n\t\t// default templates\n\t\tself.settings.render = Object.assign({}, {\n\t\t\tloading_more:() => {\n\t\t\t\treturn `<div class=\"loading-more-results\">Loading more results ... </div>`;\n\t\t\t},\n\t\t\tno_more_results:() =>{\n\t\t\t\treturn `<div class=\"no-more-results\">No more results</div>`;\n\t\t\t}\n\t\t},self.settings.render);\n\n\n\t\t// watch dropdown content scroll position\n\t\tdropdown_content.addEventListener('scroll',()=>{\n\n\t\t\tif( !self.settings.shouldLoadMore.call(self) ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// !important: this will get checked again in load() but we still need to check here otherwise loading_more will be set to true\n\t\t\tif( !canLoadMore(self.lastValue) ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// don't call load() too much\n\t\t\tif( loading_more ) return;\n\n\n\t\t\tloading_more = true;\n\t\t\tself.load.call(self,self.lastValue);\n\t\t});\n\t});\n\n};\n"],"names":["forEvents","events","callback","split","forEach","event","MicroEvent","constructor","this","_events","on","fct","event_array","push","off","n","arguments","length","undefined","splice","indexOf","trigger","args","self","apply","arrayToPattern","chars","filter","Boolean","maxValueLength","join","sequencePattern","array","hasDuplicates","pattern","prev_char_count","prev_pattern","char","i","setToPattern","toArray","Set","size","escape_regex","str","replace","reduce","longest","value","Math","max","unicodeLength","p","Array","from","allSubstrings","input","result","start","substring","subresult","tmp","slice","charAt","unshift","code_points","unicode_map","multi_char_reg","latin_convert","latin_condensed","a","aa","ae","ao","au","av","ay","b","c","d","e","f","g","h","j","k","l","m","o","oe","oi","oo","ou","q","r","s","t","th","tz","u","v","vy","w","y","z","hv","latin","unicode","convert_pat","RegExp","Object","keys","normalize","form","asciifold","_asciifold","toLowerCase","generateSets","unicode_sets","addMatching","folded","to_add","folded_set","patt","match","add","code_point_min","code_point_max","composed","String","fromCharCode","code_point","generator","generateMap","multi_char","set","sort","multi_char_patt","substringsToPattern","min_replacement","map","sub_pat","strings","chars_replaced","mapSequence","sequencesToPattern","sequences","all","sequence","seq","len","substrs","inSequences","needle_seq","end","needle_parts","parts","part","needle_part","substr","Sequence","min","last","clone","position","last_piece","JSON","parse","stringify","last_part","pop","last_substr","clone_last_len","getPattern","_code_points","match_str","overlapping","added_types","has","new_seq","old_seq","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","token","weight","score","pos","regex","search","string","propToArray","key","isArray","iterate","object","hasOwnProperty","cmp","Sifter","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","implicit_score","sort_flds","sort_empty","bind","get_field","id","fld","direction","sort_fld","optsUser","assign","trim","total","nesting","fn_score","item","_","fn_sort","limit","getDom","jquery","HTMLElement","isHtmlString","tpl","document","createElement","innerHTML","content","firstChild","querySelector","arg","triggerEvent","dom_el","event_name","createEvent","initEvent","dispatchEvent","applyCSS","css","style","addClasses","elmts","classes","norm_classes","classesArray","castAsArray","el","cls","classList","removeClasses","remove","_classes","concat","parentMatch","target","selector","wrapper","contains","matches","parentNode","getTail","list","nodeIndex","amongst","nodeName","previousElementSibling","setAttr","attrs","val","attr","removeAttribute","setAttribute","replaceNode","existing","replacement","replaceChild","highlight","element","highlightRecursive","node","nodeType","spannode","className","middlebit","splitText","index","middleclone","cloneNode","appendChild","highlightText","childNodes","test","tagName","highlightChildren","KEY_SHORTCUT","navigator","userAgent","defaults","optgroups","plugins","delimiter","splitOn","persist","create","createOnBlur","createFilter","openOnFocus","shouldOpen","maxOptions","maxItems","hideSelected","duplicates","addPrecedence","selectOnTab","preload","allowEmptyOption","refreshThrottle","loadThrottle","loadingClass","dataAttr","optgroupField","valueField","labelField","disabledField","optgroupLabelField","optgroupValueField","lockOptgroupOrder","sortField","searchField","searchConjunction","mode","wrapperClass","controlClass","dropdownClass","dropdownContentClass","itemClass","optionClass","dropdownParent","controlInput","copyClassesToDropdown","placeholder","hidePlaceholder","shouldLoad","render","hash_key","get_hash","escape_html","loadDebounce","fn","delay","timeout","loading","clearTimeout","setTimeout","loadedSearches","call","debounce_events","types","type","event_args","preventDefault","evt","stop","stopPropagation","addEvent","addEventListener","isKeyDown","key_name","altKey","ctrlKey","shiftKey","metaKey","getId","existing_id","getAttribute","addSlashes","append","parent","getSettings","settings_user","attr_data","field_label","field_value","field_disabled","field_optgroup","field_optgroup_label","field_optgroup_value","tag_name","option","textContent","settings_element","init_select","optionsMap","group_count","$order","readData","dataset","json","addOption","group","arr","option_data","disabled","$option","selected","hasAttribute","children","child","optgroup","optgroup_data","init_textbox","data_raw","opt","values","instance_i","TomSelect","Interface","super","requested","loaded","define","initializePlugins","queue","plugin","require","loadPlugin","Error","MicroPlugin","input_arg","user_settings","dir","control_input","dropdown","control","dropdown_content","focus_node","order","tabIndex","is_select_tag","rtl","inputId","_destroy","sifter","isOpen","isDisabled","isReadOnly","isRequired","isInvalid","isValid","isLocked","isFocused","isInputHidden","isSetup","ignoreFocus","ignoreHover","hasOptions","currentResults","lastValue","caretPos","activeOption","activeItems","userOptions","refreshTimeout","tomselect","window","getComputedStyle","getPropertyValue","required","setupCallbacks","setupTemplates","_render","inputMode","setup","passive_event","passive","listboxId","role","control_id","escapeQuery","label","label_click","focus","for","label_id","width","classes_plugins","multiple","load","target_match","onOptionHover","capture","onOptionSelect","onItemSelect","onClick","onKeyDown","onKeyPress","onInput","onBlur","onFocus","onPaste","doc_mousedown","composedPath","blur","inputState","win_scroll","positionDropdown","removeEventListener","revertSettings","insertAdjacentElement","sync","refreshState","updateOriginalInput","refreshItems","close","disable","readOnly","setReadOnly","enable","onChange","setupOptions","addOptions","registerOptionGroup","templates","optgroup_header","escape","option_create","no_results","not_loading","callbacks","initialize","change","item_add","item_remove","item_select","clear","option_add","option_remove","option_clear","optgroup_add","optgroup_remove","optgroup_clear","dropdown_open","dropdown_close","get_settings","setValue","lastQuery","clearActiveItems","onMouseDown","pastedText","inputValue","splitInput","piece","addItem","createItem","character","keyCode","which","constants","selectAll","open","next","getAdjacent","setActiveOption","prev","canSelect","activeElement","advanceSelection","deleteSelection","_onInput","refreshOptions","wasFocused","hasFocus","deactivate","setActiveItem","setCaret","parentElement","closeAfterSelect","canLoad","loadCallback","clearActiveOption","setTextboxValue","getValue","silent","addItems","setMaxItems","eventName","begin","swap","getLastActive","prototype","setActiveItemClass","removeActiveItem","last_active","idx","scroll","scrollToOption","behavior","height_menu","clientHeight","scrollTop","height_item","offsetHeight","getBoundingClientRect","top","scrollBehavior","controlChildren","toggle","offsetWidth","getSearchOptions","calculateScore","hashed","triggerDropdown","html","has_create_option","active_group","groups","groups_order","same_query","results","active_option","show_dropdown","closest","getGroupFragment","group_order_i","order_group","fragment","group_fragment","createDocumentFragment","opt_value","opt_hash","option_el","getOption","includes","self_optgroup","$id","toString","elements","group_order","group_heading","group_options","header","group_html","querySelectorAll","tok","add_template","template","insertBefore","canCreate","active_index","selectable","user_created","dat","registerOption","addOptionGroup","hashed_id","removeOptionGroup","clearCache","clearOptionGroups","updateOption","item_new","index_item","value_old","value_new","data_old","getItem","uncacheValue","option_new","removeOption","removeItem","clearOptions","boundFilter","clearFilter","$div","last_item","x","isPending","wasFull","isFull","insertAtCaret","output","caret","lock","created","unlock","refreshValidityState","wrap_classList","validity","valid","opts","empty_option","has_selected","AddSelected","visibility","display","context","rect","scrollY","left","scrollX","selection","tail","selectionStart","selectionEnd","rm_items","rm_item","shouldDelete","onDelete","adjacent","nextElementSibling","moveCaret","new_pos","setLocked","setDisabled","destroy","templateName","hook","when","method","new_fn","orig_method","result_new","orig_onOptionSelect","cbOptions","checkedClassNames","uncheckedClassNames","UpdateChecked","checkbox","toCheck","checked","UpdateCheckbox","HTMLInputElement","orig_render_option","rendered","prepend","title","button","orig_lock","orig_unlock","drag_item","sortable","orig_render_item","draggable","dragOver","moveitem","targetitem","dragitem","insertAfter","referenceNode","newNode","_referenceNode$parent","isBefore","_newNode","nextSibling","_referenceNode$parent2","dragLeave","dragend","_drag_item","headerClass","titleRowClass","labelClass","closeClass","close_link","div","orig_onBlur","relatedTarget","preventScroll","test_input","cssText","style_name","resize","clientWidth","orig_deleteSelection","orig_keydown","previousSibling","close_button","text","orig_canLoad","orig_clearActiveOption","orig_loadCallback","load_more_opt","pagination","loading_more","default_values","shouldLoadMore","scrollHeight","firstUrl","canLoadMore","setNextUrl","next_url","getUrl","clearPagination","first_option","no_more_results"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6]}