PageSourceSearch

https://worldfringe.com/wp-content/plugins/ultimate-member/assets/libs/select2/select2.full.js?ver=4.0.13

js worldfringe.com collected 2026-10-01 11:51:16 UTC 173,566 bytes, 6,820 lines download raw bytes

1/*!
2 * Select2 4.0.13
3 * https://select2.github.io
4 *
5 * Released under the MIT license
6 * https://github.com/select2/select2/blob/master/LICENSE.md
7 */
8;
vendor: 18,996 bytes, lines 8-577
8(function (factory) {
9  if (typeof define === 'function' && define.amd) {
10    // AMD. Register as an anonymous module.
11    define(['jquery'], factory);
12  } else if (typeof module === 'object' && module.exports) {
13    // Node/CommonJS
14    module.exports = function (root, jQuery) {
15      if (jQuery === undefined) {
16        // require('jQuery') returns a factory that requires window to
17        // build a jQuery instance, we normalize how we use modules
18        // that require this pattern but the window provided is a noop
19        // if it's defined (how jquery works)
20        if (typeof window !== 'undefined') {
21          jQuery = require('jquery');
22        }
23        else {
24          jQuery = require('jquery')(root);
25        }
26      }
27      factory(jQuery);
28      return jQuery;
29    };
30  } else {
31    // Browser globals
32    factory(jQuery);
33  }
34} (function (jQuery) {
35  // This is needed so we can catch the AMD loader configuration and use it
36  // The inner file should be wrapped (by `banner.start.js`) in a function that
37  // returns the AMD loader references.
38  var S2 =(function () {
39  // Restore the Select2 AMD loader so it can be used
40  // Needed mostly in the language files, where the loader is not inserted
41  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
42    var S2 = jQuery.fn.select2.amd;
43  }
44var S2;(function () { if (!S2 || !S2.requirejs) {
45if (!S2) { S2 = {}; } else { require = S2; }
46/**
47 * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
48 * Released under MIT license, http://github.com/requirejs/almond/LICENSE
49 */
50//Going sloppy to avoid 'use strict' string cost, but strict practices should
51//be followed.
52/*global setTimeout: false */
53
54var requirejs, require, define;
55(function (undef) {
56    var main, req, makeMap, handlers,
57        defined = {},
58        waiting = {},
59        config = {},
60        defining = {},
61        hasOwn = Object.prototype.hasOwnProperty,
62        aps = [].slice,
63        jsSuffixRegExp = /\.js$/;
64
65    function hasProp(obj, prop) {
66        return hasOwn.call(obj, prop);
67    }
68
69    /**
70     * Given a relative module name, like ./something, normalize it to
71     * a real name that can be mapped to a path.
72     * @param {String} name the relative name
73     * @param {String} baseName a real name that the name arg is relative
74     * to.
75     * @returns {String} normalized name
76     */
77    function normalize(name, baseName) {
78        var nameParts, nameSegment, mapValue, foundMap, lastIndex,
79            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,
80            baseParts = baseName && baseName.split("/"),
81            map = config.map,
82            starMap = (map && map['*']) || {};
83
84        //Adjust any relative paths.
85        if (name) {
86            name = name.split('/');
87            lastIndex = name.length - 1;
88
89            // If wanting node ID compatibility, strip .js from end
90            // of IDs. Have to do this here, and not in nameToUrl
91            // because node allows either .js or non .js to map
92            // to same file.
93            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
94                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
95            }
96
97            // Starts with a '.' so need the baseName
98            if (name[0].charAt(0) === '.' && baseParts) {
99                //Convert baseName to array, and lop off the last part,
100                //so that . matches that 'directory' and not name of the baseName's
101                //module. For instance, baseName of 'one/two/three', maps to
102                //'one/two/three.js', but we want the directory, 'one/two' for
103                //this normalization.
104                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);
105                name = normalizedBaseParts.concat(name);
106            }
107
108            //start trimDots
109            for (i = 0; i < name.length; i++) {
110                part = name[i];
111                if (part === '.') {
112                    name.splice(i, 1);
113                    i -= 1;
114                } else if (part === '..') {
115                    // If at the start, or previous value is still ..,
116                    // keep them so that when converted to a path it may
117                    // still work when converted to a path, even though
118                    // as an ID it is less than ideal. In larger point
119                    // releases, may be better to just kick out an error.
120                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {
121                        continue;
122                    } else if (i > 0) {
123                        name.splice(i - 1, 2);
124                        i -= 2;
125                    }
126                }
127            }
128            //end trimDots
129
130            name = name.join('/');
131        }
132
133        //Apply map config if available.
134        if ((baseParts || starMap) && map) {
135            nameParts = name.split('/');
136
137            for (i = nameParts.length; i > 0; i -= 1) {
138                nameSegment = nameParts.slice(0, i).join("/");
139
140                if (baseParts) {
141                    //Find the longest baseName segment match in the config.
142                    //So, do joins on the biggest to smallest lengths of baseParts.
143                    for (j = baseParts.length; j > 0; j -= 1) {
144                        mapValue = map[baseParts.slice(0, j).join('/')];
145
146                        //baseName segment has  config, find if it has one for
147                        //this name.
148                        if (mapValue) {
149                            mapValue = mapValue[nameSegment];
150                            if (mapValue) {
151                                //Match, update name to the new value.
152                                foundMap = mapValue;
153                                foundI = i;
154                                break;
155                            }
156                        }
157                    }
158                }
159
160                if (foundMap) {
161                    break;
162                }
163
164                //Check for a star map match, but just hold on to it,
165                //if there is a shorter segment match later in a matching
166                //config, then favor over this star map.
167                if (!foundStarMap && starMap && starMap[nameSegment]) {
168                    foundStarMap = starMap[nameSegment];
169                    starI = i;
170                }
171            }
172
173            if (!foundMap && foundStarMap) {
174                foundMap = foundStarMap;
175                foundI = starI;
176            }
177
178            if (foundMap) {
179                nameParts.splice(0, foundI, foundMap);
180                name = nameParts.join('/');
181            }
182        }
183
184        return name;
185    }
186
187    function makeRequire(relName, forceSync) {
188        return function () {
189            //A version of a require function that passes a moduleName
190            //value for items that may need to
191            //look up paths relative to the moduleName
192            var args = aps.call(arguments, 0);
193
194            //If first arg is not require('string'), and there is only
195            //one arg, it is the array form without a callback. Insert
196            //a null so that the following concat is correct.
197            if (typeof args[0] !== 'string' && args.length === 1) {
198                args.push(null);
199            }
200            return req.apply(undef, args.concat([relName, forceSync]));
201        };
202    }
203
204    function makeNormalize(relName) {
205        return function (name) {
206            return normalize(name, relName);
207        };
208    }
209
210    function makeLoad(depName) {
211        return function (value) {
212            defined[depName] = value;
213        };
214    }
215
216    function callDep(name) {
217        if (hasProp(waiting, name)) {
218            var args = waiting[name];
219            delete waiting[name];
220            defining[name] = true;
221            main.apply(undef, args);
222        }
223
224        if (!hasProp(defined, name) && !hasProp(defining, name)) {
225            throw new Error('No ' + name);
226        }
227        return defined[name];
228    }
229
230    //Turns a plugin!resource to [plugin, resource]
231    //with the plugin being undefined if the name
232    //did not have a plugin prefix.
233    function splitPrefix(name) {
234        var prefix,
235            index = name ? name.indexOf('!') : -1;
236        if (index > -1) {
237            prefix = name.substring(0, index);
238            name = name.substring(index + 1, name.length);
239        }
240        return [prefix, name];
241    }
242
243    //Creates a parts array for a relName where first part is plugin ID,
244    //second part is resource ID. Assumes relName has already been normalized.
245    function makeRelParts(relName) {
246        return relName ? splitPrefix(relName) : [];
247    }
248
249    /**
250     * Makes a name map, normalizing the name, and using a plugin
251     * for normalization if necessary. Grabs a ref to plugin
252     * too, as an optimization.
253     */
254    makeMap = function (name, relParts) {
255        var plugin,
256            parts = splitPrefix(name),
257            prefix = parts[0],
258            relResourceName = relParts[1];
259
260        name = parts[1];
261
262        if (prefix) {
263            prefix = normalize(prefix, relResourceName);
264            plugin = callDep(prefix);
265        }
266
267        //Normalize according
268        if (prefix) {
269            if (plugin && plugin.normalize) {
270                name = plugin.normalize(name, makeNormalize(relResourceName));
271            } else {
272                name = normalize(name, relResourceName);
273            }
274        } else {
275            name = normalize(name, relResourceName);
276            parts = splitPrefix(name);
277            prefix = parts[0];
278            name = parts[1];
279            if (prefix) {
280                plugin = callDep(prefix);
281            }
282        }
283
284        //Using ridiculous property names for space reasons
285        return {
286            f: prefix ? prefix + '!' + name : name, //fullName
287            n: name,
288            pr: prefix,
289            p: plugin
290        };
291    };
292
293    function makeConfig(name) {
294        return function () {
295            return (config && config.config && config.config[name]) || {};
296        };
297    }
298
299    handlers = {
300        require: function (name) {
301            return makeRequire(name);
302        },
303        exports: function (name) {
304            var e = defined[name];
305            if (typeof e !== 'undefined') {
306                return e;
307            } else {
308                return (defined[name] = {});
309            }
310        },
311        module: function (name) {
312            return {
313                id: name,
314                uri: '',
315                exports: defined[name],
316                config: makeConfig(name)
317            };
318        }
319    };
320
321    main = function (name, deps, callback, relName) {
322        var cjsModule, depName, ret, map, i, relParts,
323            args = [],
324            callbackType = typeof callback,
325            usingExports;
326
327        //Use name if no relName
328        relName = relName || name;
329        relParts = makeRelParts(relName);
330
331        //Call the callback to define the module, if necessary.
332        if (callbackType === 'undefined' || callbackType === 'function') {
333            //Pull out the defined dependencies and pass the ordered
334            //values to the callback.
335            //Default to [require, exports, module] if no deps
336            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
337            for (i = 0; i < deps.length; i += 1) {
338                map = makeMap(deps[i], relParts);
339                depName = map.f;
340
341                //Fast path CommonJS standard dependencies.
342                if (depName === "require") {
343                    args[i] = handlers.require(name);
344                } else if (depName === "exports") {
345                    //CommonJS module spec 1.1
346                    args[i] = handlers.exports(name);
347                    usingExports = true;
348                } else if (depName === "module") {
349                    //CommonJS module spec 1.1
350                    cjsModule = args[i] = handlers.module(name);
351                } else if (hasProp(defined, depName) ||
352                           hasProp(waiting, depName) ||
353                           hasProp(defining, depName)) {
354                    args[i] = callDep(depName);
355                } else if (map.p) {
356                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
357                    args[i] = defined[depName];
358                } else {
359                    throw new Error(name + ' missing ' + depName);
360                }
361            }
362
363            ret = callback ? callback.apply(defined[name], args) : undefined;
364
365            if (name) {
366                //If setting exports via "module" is in play,
367                //favor that over return value and exports. After that,
368                //favor a non-undefined return value over exports use.
369                if (cjsModule && cjsModule.exports !== undef &&
370                        cjsModule.exports !== defined[name]) {
371                    defined[name] = cjsModule.exports;
372                } else if (ret !== undef || !usingExports) {
373                    //Use the return value from the function.
374                    defined[name] = ret;
375                }
376            }
377        } else if (name) {
378            //May just be an object definition for the module. Only
379            //worry about defining if have a module name.
380            defined[name] = callback;
381        }
382    };
383
384    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
385        if (typeof deps === "string") {
386            if (handlers[deps]) {
387                //callback in this case is really relName
388                return handlers[deps](callback);
389            }
390            //Just return the module wanted. In this scenario, the
391            //deps arg is the module name, and second arg (if passed)
392            //is just the relName.
393            //Normalize module name, if it contains . or ..
394            return callDep(makeMap(deps, makeRelParts(callback)).f);
395        } else if (!deps.splice) {
396            //deps is a config object, not an array.
397            config = deps;
398            if (config.deps) {
399                req(config.deps, config.callback);
400            }
401            if (!callback) {
402                return;
403            }
404
405            if (callback.splice) {
406                //callback is an array, which means it is a dependency list.
407                //Adjust args if there are dependencies
408                deps = callback;
409                callback = relName;
410                relName = null;
411            } else {
412                deps = undef;
413            }
414        }
415
416        //Support require(['a'])
417        callback = callback || function () {};
418
419        //If relName is a function, it is an errback handler,
420        //so remove it.
421        if (typeof relName === 'function') {
422            relName = forceSync;
423            forceSync = alt;
424        }
425
426        //Simulate async callback;
427        if (forceSync) {
428            main(undef, deps, callback, relName);
429        } else {
430            //Using a non-zero value because of concern for what old browsers
431            //do, and latest browsers "upgrade" to 4 if lower value is used:
432            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
433            //If want a value immediately, use require('id') instead -- something
434            //that works in almond on the global level, but not guaranteed and
435            //unlikely to work in other AMD implementations.
436            setTimeout(function () {
437                main(undef, deps, callback, relName);
438            }, 4);
439        }
440
441        return req;
442    };
443
444    /**
445     * Just drops the config on the floor, but returns req in case
446     * the config return value is used.
447     */
448    req.config = function (cfg) {
449        return req(cfg);
450    };
451
452    /**
453     * Expose module registry for debugging and tooling
454     */
455    requirejs._defined = defined;
456
457    define = function (name, deps, callback) {
458        if (typeof name !== 'string') {
459            throw new Error('See almond README: incorrect module build, no module name');
460        }
461
462        //This module may not have dependencies
463        if (!deps.splice) {
464            //deps is not an array, so probably means
465            //an object literal or factory function for
466            //the value. Adjust args.
467            callback = deps;
468            deps = [];
469        }
470
471        if (!hasProp(defined, name) && !hasProp(waiting, name)) {
472            waiting[name] = [name, deps, callback];
473        }
474    };
475
476    define.amd = {
477        jQuery: true
478    };
479}());
480
481S2.requirejs = requirejs;S2.require = require;S2.define = define;
482}
483}());
484S2.define("almond", function(){});
485
486/* global jQuery:false, $:false */
487S2.define('jquery',[],function () {
488  var _$ = jQuery || $;
489
490  if (_$ == null && console && console.error) {
491    console.error(
492      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +
493      'found. Make sure that you are including jQuery before Select2 on your ' +
494      'web page.'
495    );
496  }
497
498  return _$;
499});
500
501S2.define('select2/utils',[
502  'jquery'
503], function ($) {
504  var Utils = {};
505
506  Utils.Extend = function (ChildClass, SuperClass) {
507    var __hasProp = {}.hasOwnProperty;
508
509    function BaseConstructor () {
510      this.constructor = ChildClass;
511    }
512
513    for (var key in SuperClass) {
514      if (__hasProp.call(SuperClass, key)) {
515        ChildClass[key] = SuperClass[key];
516      }
517    }
518
519    BaseConstructor.prototype = SuperClass.prototype;
520    ChildClass.prototype = new BaseConstructor();
521    ChildClass.__super__ = SuperClass.prototype;
522
523    return ChildClass;
524  };
525
526  function getMethods (theClass) {
527    var proto = theClass.prototype;
528
529    var methods = [];
530
531    for (var methodName in proto) {
532      var m = proto[methodName];
533
534      if (typeof m !== 'function') {
535        continue;
536      }
537
538      if (methodName === 'constructor') {
539        continue;
540      }
541
542      methods.push(methodName);
543    }
544
545    return methods;
546  }
547
548  Utils.Decorate = function (SuperClass, DecoratorClass) {
549    var decoratedMethods = getMethods(DecoratorClass);
550    var superMethods = getMethods(SuperClass);
551
552    function DecoratedClass () {
553      var unshift = Array.prototype.unshift;
554
555      var argCount = DecoratorClass.prototype.constructor.length;
556
557      var calledConstructor = SuperClass.prototype.constructor;
558
559      if (argCount > 0) {
560        unshift.call(arguments, SuperClass.prototype.constructor);
561
562        calledConstructor = DecoratorClass.prototype.constructor;
563      }
564
565      calledConstructor.apply(this, arguments);
566    }
567
568    DecoratorClass.displayName = SuperClass.displayName;
569
570    function ctr () {
571      this.constructor = DecoratedClass;
572    }
573
574    DecoratedClass.prototype = new ctr();
575
576    for (var m = 0; m < superMethods.length; m++) {
577      
vendor: 3,385 bytes, lines 577-714
577var superMethod = superMethods[m];
578
579      DecoratedClass.prototype[superMethod] =
580        SuperClass.prototype[superMethod];
581    }
582
583    var calledMethod = function (methodName) {
584      // Stub out the original method if it's not decorating an actual method
585      var originalMethod = function () {};
586
587      if (methodName in DecoratedClass.prototype) {
588        originalMethod = DecoratedClass.prototype[methodName];
589      }
590
591      var decoratedMethod = DecoratorClass.prototype[methodName];
592
593      return function () {
594        var unshift = Array.prototype.unshift;
595
596        unshift.call(arguments, originalMethod);
597
598        return decoratedMethod.apply(this, arguments);
599      };
600    };
601
602    for (var d = 0; d < decoratedMethods.length; d++) {
603      var decoratedMethod = decoratedMethods[d];
604
605      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);
606    }
607
608    return DecoratedClass;
609  };
610
611  var Observable = function () {
612    this.listeners = {};
613  };
614
615  Observable.prototype.on = function (event, callback) {
616    this.listeners = this.listeners || {};
617
618    if (event in this.listeners) {
619      this.listeners[event].push(callback);
620    } else {
621      this.listeners[event] = [callback];
622    }
623  };
624
625  Observable.prototype.trigger = function (event) {
626    var slice = Array.prototype.slice;
627    var params = slice.call(arguments, 1);
628
629    this.listeners = this.listeners || {};
630
631    // Params should always come in as an array
632    if (params == null) {
633      params = [];
634    }
635
636    // If there are no arguments to the event, use a temporary object
637    if (params.length === 0) {
638      params.push({});
639    }
640
641    // Set the `_type` of the first object to the event
642    params[0]._type = event;
643
644    if (event in this.listeners) {
645      this.invoke(this.listeners[event], slice.call(arguments, 1));
646    }
647
648    if ('*' in this.listeners) {
649      this.invoke(this.listeners['*'], arguments);
650    }
651  };
652
653  Observable.prototype.invoke = function (listeners, params) {
654    for (var i = 0, len = listeners.length; i < len; i++) {
655      listeners[i].apply(this, params);
656    }
657  };
658
659  Utils.Observable = Observable;
660
661  Utils.generateChars = function (length) {
662    var chars = '';
663
664    for (var i = 0; i < length; i++) {
665      var randomChar = Math.floor(Math.random() * 36);
666      chars += randomChar.toString(36);
667    }
668
669    return chars;
670  };
671
672  Utils.bind = function (func, context) {
673    return function () {
674      func.apply(context, arguments);
675    };
676  };
677
678  Utils._convertData = function (data) {
679    for (var originalKey in data) {
680      var keys = originalKey.split('-');
681
682      var dataLevel = data;
683
684      if (keys.length === 1) {
685        continue;
686      }
687
688      for (var k = 0; k < keys.length; k++) {
689        var key = keys[k];
690
691        // Lowercase the first letter
692        // By default, dash-separated becomes camelCase
693        key = key.substring(0, 1).toLowerCase() + key.substring(1);
694
695        if (!(key in dataLevel)) {
696          dataLevel[key] = {};
697        }
698
699        if (k == keys.length - 1) {
700          dataLevel[key] = data[originalKey];
701        }
702
703        dataLevel = dataLevel[key];
704      }
705
706      delete data[originalKey];
707    }
708
709    return data;
710  };
711
712  Utils.hasScroll = function (index, el) {
713    // Adapted from the function created by @ShadowScripter
714    // and adapted by @BillBarry on the Stack Exchange Code Review website.
715    // The original code can be found at
716    // http://codereview.stackexchange.com/q/13338
717    // and was designed to be used with the Sizzle selector engine.
718
719    var $el = $(el);
720    var overflowX = el.style.overflowX;
721    var overflowY = el.style.overflowY;
722
723    //Check both x and y declarations
724    if (overflowX === overflowY &&
725        (overflowY === 'hidden' || overflowY === 'visible')) {
726      return false;
727    }
728
729    if (overflowX === 'scroll' || overflowY === 'scroll') {
730      return true;
731    }
732
733    return ($el.innerHeight() < el.scrollHeight ||
734      $el.innerWidth() < el.scrollWidth);
735  };
736
737  Utils.escapeMarkup = function (markup) {
738    var replaceMap = {
739      '\\': '&#92;',
740      '&': '&amp;',
741      '<': '&lt;',
742      '>': '&gt;',
743      '"': '&quot;',
744      '\'': '&#39;',
745      '/': '&#47;'
746    };
747
748    // Do not try to escape the markup if it's not a string
749    if (typeof markup !== 'string') {
750      return markup;
751    }
752
753    return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
754      return replaceMap[match];
755    });
756  };
757
758  // Append an array of jQuery nodes to a given element.
759  Utils.appendMany = function ($element, $nodes) {
760    // jQuery 1.7.x does not support $.fn.append() with an array
761    // Fall back to a jQuery object collection using $.fn.add()
762    if ($.fn.jquery.substr(0, 3) === '1.7') {
763      var $jqNodes = $();
764
765      $.map($nodes, function (node) {
766        $jqNodes = $jqNodes.add(node);
767      });
768
769      $nodes = $jqNodes;
770    }
771
772    $element.append($nodes);
773  };
774
775  // Cache objects in Utils.__cache instead of $.data (see #4346)
776  Utils.__cache = {};
777
778  var id = 0;
779  Utils.GetUniqueElementId = function (element) {
780    // Get a unique element Id. If element has no id,
781    // creates a new unique number, stores it in the id
782    // attribute and returns the new id.
783    // If an id already exists, it simply returns it.
784
785    var select2Id = element.getAttribute('data-select2-id');
786    if (select2Id == null) {
787      // If element has id, use it.
788      if (element.id) {
789        select2Id = element.id;
790        element.setAttribute('data-select2-id', select2Id);
791      } else {
792        element.setAttribute('data-select2-id', ++id);
793        select2Id = id.toString();
794      }
795    }
796    return select2Id;
797  };
798
799  Utils.StoreData = function (element, name, value) {
800    // Stores an item in the cache for a specified element.
801    // name is the cache key.
802    var id = Utils.GetUniqueElementId(element);
803    if (!Utils.__cache[id]) {
804      Utils.__cache[id] = {};
805    }
806
807    Utils.__cache[id][name] = value;
808  };
809
810  Utils.GetData = function (element, name) {
811    // Retrieves a value from the cache by its key (name)
812    // name is optional. If no name specified, return
813    // all cache items for the specified element.
814    // and for a specified element.
815    var id = Utils.GetUniqueElementId(element);
816    if (name) {
817      if (Utils.__cache[id]) {
818        if (Utils.__cache[id][name] != null) {
819          return Utils.__cache[id][name];
820        }
821        return $(element).data(name); // Fallback to HTML5 data attribs.
822      }
823      return $(element).data(name); // Fallback to HTML5 data attribs.
824    } else {
825      return Utils.__cache[id];
826    }
827  };
828
829  Utils.RemoveData = function (element) {
830    // Removes all cached items for a specified element.
831    var id = Utils.GetUniqueElementId(element);
832    if (Utils.__cache[id] != null) {
833      delete Utils.__cache[id];
834    }
835
836    element.removeAttribute('data-select2-id');
837  };
838
839  return Utils;
840});
841
842S2.define('select2/results',[
843  'jquery',
844  './utils'
845], function ($, Utils) {
846  function Results ($element, options, dataAdapter) {
847    this.$element = $element;
848    this.data = dataAdapter;
849    this.options = options;
850
851    Results.__super__.constructor.call(this);
852  }
853
854  Utils.Extend(Results, Utils.Observable);
855
856  Results.prototype.render = function () {
857    var $results = $(
858      '<ul class="select2-results__options" role="listbox"></ul>'
859    );
860
861    if (this.options.get('multiple')) {
862      $results.attr('aria-multiselectable', 'true');
863    }
864
865    this.$results = $results;
866
867    return $results;
868  };
869
870  Results.prototype.clear = function () {
871    this.$results.empty();
872  };
873
874  Results.prototype.displayMessage = function (params) {
875    var escapeMarkup = this.options.get('escapeMarkup');
876
877    this.clear();
878    this.hideLoading();
879
880    var $message = $(
881      '<li role="alert" aria-live="assertive"' +
882      ' class="select2-results__option"></li>'
883    );
884
885    var message = this.options.get('translations').get(params.message);
886
887    $message.append(
888      escapeMarkup(
889        message(params.args)
890      )
891    );
892
893    $message[0].className += ' select2-results__message';
vendor: 9,101 bytes, lines 894-1256
894
895    this.$results.append($message);
896  };
897
898  Results.prototype.hideMessages = function () {
899    this.$results.find('.select2-results__message').remove();
900  };
901
902  Results.prototype.append = function (data) {
903    this.hideLoading();
904
905    var $options = [];
906
907    if (data.results == null || data.results.length === 0) {
908      if (this.$results.children().length === 0) {
909        this.trigger('results:message', {
910          message: 'noResults'
911        });
912      }
913
914      return;
915    }
916
917    data.results = this.sort(data.results);
918
919    for (var d = 0; d < data.results.length; d++) {
920      var item = data.results[d];
921
922      var $option = this.option(item);
923
924      $options.push($option);
925    }
926
927    this.$results.append($options);
928  };
929
930  Results.prototype.position = function ($results, $dropdown) {
931    var $resultsContainer = $dropdown.find('.select2-results');
932    $resultsContainer.append($results);
933  };
934
935  Results.prototype.sort = function (data) {
936    var sorter = this.options.get('sorter');
937
938    return sorter(data);
939  };
940
941  Results.prototype.highlightFirstItem = function () {
942    var $options = this.$results
943      .find('.select2-results__option[aria-selected]');
944
945    var $selected = $options.filter('[aria-selected=true]');
946
947    // Check if there are any selected options
948    if ($selected.length > 0) {
949      // If there are selected options, highlight the first
950      $selected.first().trigger('mouseenter');
951    } else {
952      // If there are no selected options, highlight the first option
953      // in the dropdown
954      $options.first().trigger('mouseenter');
955    }
956
957    this.ensureHighlightVisible();
958  };
959
960  Results.prototype.setClasses = function () {
961    var self = this;
962
963    this.data.current(function (selected) {
964      var selectedIds = $.map(selected, function (s) {
965        return s.id.toString();
966      });
967
968      var $options = self.$results
969        .find('.select2-results__option[aria-selected]');
970
971      $options.each(function () {
972        var $option = $(this);
973
974        var item = Utils.GetData(this, 'data');
975
976        // id needs to be converted to a string when comparing
977        var id = '' + item.id;
978
979        if ((item.element != null && item.element.selected) ||
980            (item.element == null && $.inArray(id, selectedIds) > -1)) {
981          $option.attr('aria-selected', 'true');
982        } else {
983          $option.attr('aria-selected', 'false');
984        }
985      });
986
987    });
988  };
989
990  Results.prototype.showLoading = function (params) {
991    this.hideLoading();
992
993    var loadingMore = this.options.get('translations').get('searching');
994
995    var loading = {
996      disabled: true,
997      loading: true,
998      text: loadingMore(params)
999    };
1000    var $loading = this.option(loading);
1001    $loading.className += ' loading-results';
1002
1003    this.$results.prepend($loading);
1004  };
1005
1006  Results.prototype.hideLoading = function () {
1007    this.$results.find('.loading-results').remove();
1008  };
1009
1010  Results.prototype.option = function (data) {
1011    var option = document.createElement('li');
1012    option.className = 'select2-results__option';
1013
1014    var attrs = {
1015      'role': 'option',
1016      'aria-selected': 'false'
1017    };
1018
1019    var matches = window.Element.prototype.matches ||
1020      window.Element.prototype.msMatchesSelector ||
1021      window.Element.prototype.webkitMatchesSelector;
1022
1023    if ((data.element != null && matches.call(data.element, ':disabled')) ||
1024        (data.element == null && data.disabled)) {
1025      delete attrs['aria-selected'];
1026      attrs['aria-disabled'] = 'true';
1027    }
1028
1029    if (data.id == null) {
1030      delete attrs['aria-selected'];
1031    }
1032
1033    if (data._resultId != null) {
1034      option.id = data._resultId;
1035    }
1036
1037    if (data.title) {
1038      option.title = data.title;
1039    }
1040
1041    if (data.children) {
1042      attrs.role = 'group';
1043      attrs['aria-label'] = data.text;
1044      delete attrs['aria-selected'];
1045    }
1046
1047    for (var attr in attrs) {
1048      var val = attrs[attr];
1049
1050      option.setAttribute(attr, val);
1051    }
1052
1053    if (data.children) {
1054      var $option = $(option);
1055
1056      var label = document.createElement('strong');
1057      label.className = 'select2-results__group';
1058
1059      var $label = $(label);
1060      this.template(data, label);
1061
1062      var $children = [];
1063
1064      for (var c = 0; c < data.children.length; c++) {
1065        var child = data.children[c];
1066
1067        var $child = this.option(child);
1068
1069        $children.push($child);
1070      }
1071
1072      var $childrenContainer = $('<ul></ul>', {
1073        'class': 'select2-results__options select2-results__options--nested'
1074      });
1075
1076      $childrenContainer.append($children);
1077
1078      $option.append(label);
1079      $option.append($childrenContainer);
1080    } else {
1081      this.template(data, option);
1082    }
1083
1084    Utils.StoreData(option, 'data', data);
1085
1086    return option;
1087  };
1088
1089  Results.prototype.bind = function (container, $container) {
1090    var self = this;
1091
1092    var id = container.id + '-results';
1093
1094    this.$results.attr('id', id);
1095
1096    container.on('results:all', function (params) {
1097      self.clear();
1098      self.append(params.data);
1099
1100      if (container.isOpen()) {
1101        self.setClasses();
1102        self.highlightFirstItem();
1103      }
1104    });
1105
1106    container.on('results:append', function (params) {
1107      self.append(params.data);
1108
1109      if (container.isOpen()) {
1110        self.setClasses();
1111      }
1112    });
1113
1114    container.on('query', function (params) {
1115      self.hideMessages();
1116      self.showLoading(params);
1117    });
1118
1119    container.on('select', function () {
1120      if (!container.isOpen()) {
1121        return;
1122      }
1123
1124      self.setClasses();
1125
1126      if (self.options.get('scrollAfterSelect')) {
1127        self.highlightFirstItem();
1128      }
1129    });
1130
1131    container.on('unselect', function () {
1132      if (!container.isOpen()) {
1133        return;
1134      }
1135
1136      self.setClasses();
1137
1138      if (self.options.get('scrollAfterSelect')) {
1139        self.highlightFirstItem();
1140      }
1141    });
1142
1143    container.on('open', function () {
1144      // When the dropdown is open, aria-expended="true"
1145      self.$results.attr('aria-expanded', 'true');
1146      self.$results.attr('aria-hidden', 'false');
1147
1148      self.setClasses();
1149      self.ensureHighlightVisible();
1150    });
1151
1152    container.on('close', function () {
1153      // When the dropdown is closed, aria-expended="false"
1154      self.$results.attr('aria-expanded', 'false');
1155      self.$results.attr('aria-hidden', 'true');
1156      self.$results.removeAttr('aria-activedescendant');
1157    });
1158
1159    container.on('results:toggle', function () {
1160      var $highlighted = self.getHighlightedResults();
1161
1162      if ($highlighted.length === 0) {
1163        return;
1164      }
1165
1166      $highlighted.trigger('mouseup');
1167    });
1168
1169    container.on('results:select', function () {
1170      var $highlighted = self.getHighlightedResults();
1171
1172      if ($highlighted.length === 0) {
1173        return;
1174      }
1175
1176      var data = Utils.GetData($highlighted[0], 'data');
1177
1178      if ($highlighted.attr('aria-selected') == 'true') {
1179        self.trigger('close', {});
1180      } else {
1181        self.trigger('select', {
1182          data: data
1183        });
1184      }
1185    });
1186
1187    container.on('results:previous', function () {
1188      var $highlighted = self.getHighlightedResults();
1189
1190      var $options = self.$results.find('[aria-selected]');
1191
1192      var currentIndex = $options.index($highlighted);
1193
1194      // If we are already at the top, don't move further
1195      // If no options, currentIndex will be -1
1196      if (currentIndex <= 0) {
1197        return;
1198      }
1199
1200      var nextIndex = currentIndex - 1;
1201
1202      // If none are highlighted, highlight the first
1203      if ($highlighted.length === 0) {
1204        nextIndex = 0;
1205      }
1206
1207      var $next = $options.eq(nextIndex);
1208
1209      $next.trigger('mouseenter');
1210
1211      var currentOffset = self.$results.offset().top;
1212      var nextTop = $next.offset().top;
1213      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);
1214
1215      if (nextIndex === 0) {
1216        self.$results.scrollTop(0);
1217      } else if (nextTop - currentOffset < 0) {
1218        self.$results.scrollTop(nextOffset);
1219      }
1220    });
1221
1222    container.on('results:next', function () {
1223      var $highlighted = self.getHighlightedResults();
1224
1225      var $options = self.$results.find('[aria-selected]');
1226
1227      var currentIndex = $options.index($highlighted);
1228
1229      var nextIndex = currentIndex + 1;
1230
1231      // If we are at the last option, stay there
1232      if (nextIndex >= $options.length) {
1233        return;
1234      }
1235
1236      var $next = $options.eq(nextIndex);
1237
1238      $next.trigger('mouseenter');
1239
1240      var currentOffset = self.$results.offset().top +
1241        self.$results.outerHeight(false);
1242      var nextBottom = $next.offset().top + $next.outerHeight(false);
1243      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;
1244
1245      if (nextIndex === 0) {
1246        self.$results.scrollTop(0);
1247      } else if (nextBottom > currentOffset) {
1248        self.$results.scrollTop(nextOffset);
1249      }
1250    });
1251
1252    container.on('results:focus', function (params) {
1253      params.element.addClass('select2-results__option--highlighted');
1254    });
1255
1256    container.on('results:message', function (params) {
vendor: 24,175 bytes, lines 1257-2178
1257      self.displayMessage(params);
1258    });
1259
1260    if ($.fn.mousewheel) {
1261      this.$results.on('mousewheel', function (e) {
1262        var top = self.$results.scrollTop();
1263
1264        var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;
1265
1266        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
1267        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
1268
1269        if (isAtTop) {
1270          self.$results.scrollTop(0);
1271
1272          e.preventDefault();
1273          e.stopPropagation();
1274        } else if (isAtBottom) {
1275          self.$results.scrollTop(
1276            self.$results.get(0).scrollHeight - self.$results.height()
1277          );
1278
1279          e.preventDefault();
1280          e.stopPropagation();
1281        }
1282      });
1283    }
1284
1285    this.$results.on('mouseup', '.select2-results__option[aria-selected]',
1286      function (evt) {
1287      var $this = $(this);
1288
1289      var data = Utils.GetData(this, 'data');
1290
1291      if ($this.attr('aria-selected') === 'true') {
1292        if (self.options.get('multiple')) {
1293          self.trigger('unselect', {
1294            originalEvent: evt,
1295            data: data
1296          });
1297        } else {
1298          self.trigger('close', {});
1299        }
1300
1301        return;
1302      }
1303
1304      self.trigger('select', {
1305        originalEvent: evt,
1306        data: data
1307      });
1308    });
1309
1310    this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
1311      function (evt) {
1312      var data = Utils.GetData(this, 'data');
1313
1314      self.getHighlightedResults()
1315          .removeClass('select2-results__option--highlighted');
1316
1317      self.trigger('results:focus', {
1318        data: data,
1319        element: $(this)
1320      });
1321    });
1322  };
1323
1324  Results.prototype.getHighlightedResults = function () {
1325    var $highlighted = this.$results
1326    .find('.select2-results__option--highlighted');
1327
1328    return $highlighted;
1329  };
1330
1331  Results.prototype.destroy = function () {
1332    this.$results.remove();
1333  };
1334
1335  Results.prototype.ensureHighlightVisible = function () {
1336    var $highlighted = this.getHighlightedResults();
1337
1338    if ($highlighted.length === 0) {
1339      return;
1340    }
1341
1342    var $options = this.$results.find('[aria-selected]');
1343
1344    var currentIndex = $options.index($highlighted);
1345
1346    var currentOffset = this.$results.offset().top;
1347    var nextTop = $highlighted.offset().top;
1348    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);
1349
1350    var offsetDelta = nextTop - currentOffset;
1351    nextOffset -= $highlighted.outerHeight(false) * 2;
1352
1353    if (currentIndex <= 2) {
1354      this.$results.scrollTop(0);
1355    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {
1356      this.$results.scrollTop(nextOffset);
1357    }
1358  };
1359
1360  Results.prototype.template = function (result, container) {
1361    var template = this.options.get('templateResult');
1362    var escapeMarkup = this.options.get('escapeMarkup');
1363
1364    var content = template(result, container);
1365
1366    if (content == null) {
1367      container.style.display = 'none';
1368    } else if (typeof content === 'string') {
1369      container.innerHTML = escapeMarkup(content);
1370    } else {
1371      $(container).append(content);
1372    }
1373  };
1374
1375  return Results;
1376});
1377
1378S2.define('select2/keys',[
1379
1380], function () {
1381  var KEYS = {
1382    BACKSPACE: 8,
1383    TAB: 9,
1384    ENTER: 13,
1385    SHIFT: 16,
1386    CTRL: 17,
1387    ALT: 18,
1388    ESC: 27,
1389    SPACE: 32,
1390    PAGE_UP: 33,
1391    PAGE_DOWN: 34,
1392    END: 35,
1393    HOME: 36,
1394    LEFT: 37,
1395    UP: 38,
1396    RIGHT: 39,
1397    DOWN: 40,
1398    DELETE: 46
1399  };
1400
1401  return KEYS;
1402});
1403
1404S2.define('select2/selection/base',[
1405  'jquery',
1406  '../utils',
1407  '../keys'
1408], function ($, Utils, KEYS) {
1409  function BaseSelection ($element, options) {
1410    this.$element = $element;
1411    this.options = options;
1412
1413    BaseSelection.__super__.constructor.call(this);
1414  }
1415
1416  Utils.Extend(BaseSelection, Utils.Observable);
1417
1418  BaseSelection.prototype.render = function () {
1419    var $selection = $(
1420      '<span class="select2-selection" role="combobox" ' +
1421      ' aria-haspopup="true" aria-expanded="false">' +
1422      '</span>'
1423    );
1424
1425    this._tabindex = 0;
1426
1427    if (Utils.GetData(this.$element[0], 'old-tabindex') != null) {
1428      this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex');
1429    } else if (this.$element.attr('tabindex') != null) {
1430      this._tabindex = this.$element.attr('tabindex');
1431    }
1432
1433    $selection.attr('title', this.$element.attr('title'));
1434    $selection.attr('tabindex', this._tabindex);
1435    $selection.attr('aria-disabled', 'false');
1436
1437    this.$selection = $selection;
1438
1439    return $selection;
1440  };
1441
1442  BaseSelection.prototype.bind = function (container, $container) {
1443    var self = this;
1444
1445    var resultsId = container.id + '-results';
1446
1447    this.container = container;
1448
1449    this.$selection.on('focus', function (evt) {
1450      self.trigger('focus', evt);
1451    });
1452
1453    this.$selection.on('blur', function (evt) {
1454      self._handleBlur(evt);
1455    });
1456
1457    this.$selection.on('keydown', function (evt) {
1458      self.trigger('keypress', evt);
1459
1460      if (evt.which === KEYS.SPACE) {
1461        evt.preventDefault();
1462      }
1463    });
1464
1465    container.on('results:focus', function (params) {
1466      self.$selection.attr('aria-activedescendant', params.data._resultId);
1467    });
1468
1469    container.on('selection:update', function (params) {
1470      self.update(params.data);
1471    });
1472
1473    container.on('open', function () {
1474      // When the dropdown is open, aria-expanded="true"
1475      self.$selection.attr('aria-expanded', 'true');
1476      self.$selection.attr('aria-owns', resultsId);
1477
1478      self._attachCloseHandler(container);
1479    });
1480
1481    container.on('close', function () {
1482      // When the dropdown is closed, aria-expanded="false"
1483      self.$selection.attr('aria-expanded', 'false');
1484      self.$selection.removeAttr('aria-activedescendant');
1485      self.$selection.removeAttr('aria-owns');
1486
1487      self.$selection.trigger('focus');
1488
1489      self._detachCloseHandler(container);
1490    });
1491
1492    container.on('enable', function () {
1493      self.$selection.attr('tabindex', self._tabindex);
1494      self.$selection.attr('aria-disabled', 'false');
1495    });
1496
1497    container.on('disable', function () {
1498      self.$selection.attr('tabindex', '-1');
1499      self.$selection.attr('aria-disabled', 'true');
1500    });
1501  };
1502
1503  BaseSelection.prototype._handleBlur = function (evt) {
1504    var self = this;
1505
1506    // This needs to be delayed as the active element is the body when the tab
1507    // key is pressed, possibly along with others.
1508    window.setTimeout(function () {
1509      // Don't trigger `blur` if the focus is still in the selection
1510      if (
1511        (document.activeElement == self.$selection[0]) ||
1512        ($.contains(self.$selection[0], document.activeElement))
1513      ) {
1514        return;
1515      }
1516
1517      self.trigger('blur', evt);
1518    }, 1);
1519  };
1520
1521  BaseSelection.prototype._attachCloseHandler = function (container) {
1522
1523    $(document.body).on('mousedown.select2.' + container.id, function (e) {
1524      var $target = $(e.target);
1525
1526      var $select = $target.closest('.select2');
1527
1528      var $all = $('.select2.select2-container--open');
1529
1530      $all.each(function () {
1531        if (this == $select[0]) {
1532          return;
1533        }
1534
1535        var $element = Utils.GetData(this, 'element');
1536
1537        $element.select2('close');
1538      });
1539    });
1540  };
1541
1542  BaseSelection.prototype._detachCloseHandler = function (container) {
1543    $(document.body).off('mousedown.select2.' + container.id);
1544  };
1545
1546  BaseSelection.prototype.position = function ($selection, $container) {
1547    var $selectionContainer = $container.find('.selection');
1548    $selectionContainer.append($selection);
1549  };
1550
1551  BaseSelection.prototype.destroy = function () {
1552    this._detachCloseHandler(this.container);
1553  };
1554
1555  BaseSelection.prototype.update = function (data) {
1556    throw new Error('The `update` method must be defined in child classes.');
1557  };
1558
1559  /**
1560   * Helper method to abstract the "enabled" (not "disabled") state of this
1561   * object.
1562   *
1563   * @return {true} if the instance is not disabled.
1564   * @return {false} if the instance is disabled.
1565   */
1566  BaseSelection.prototype.isEnabled = function () {
1567    return !this.isDisabled();
1568  };
1569
1570  /**
1571   * Helper method to abstract the "disabled" state of this object.
1572   *
1573   * @return {true} if the disabled option is true.
1574   * @return {false} if the disabled option is false.
1575   */
1576  BaseSelection.prototype.isDisabled = function () {
1577    return this.options.get('disabled');
1578  };
1579
1580  return BaseSelection;
1581});
1582
1583S2.define('select2/selection/single',[
1584  'jquery',
1585  './base',
1586  '../utils',
1587  '../keys'
1588], function ($, BaseSelection, Utils, KEYS) {
1589  function SingleSelection () {
1590    SingleSelection.__super__.constructor.apply(this, arguments);
1591  }
1592
1593  Utils.Extend(SingleSelection, BaseSelection);
1594
1595  SingleSelection.prototype.render = function () {
1596    var $selection = SingleSelection.__super__.render.call(this);
1597
1598    $selection.addClass('select2-selection--single');
1599
1600    $selection.html(
1601      '<span class="select2-selection__rendered"></span>' +
1602      '<span class="select2-selection__arrow" role="presentation">' +
1603        '<b role="presentation"></b>' +
1604      '</span>'
1605    );
1606
1607    return $selection;
1608  };
1609
1610  SingleSelection.prototype.bind = function (container, $container) {
1611    var self = this;
1612
1613    SingleSelection.__super__.bind.apply(this, arguments);
1614
1615    var id = container.id + '-container';
1616
1617    this.$selection.find('.select2-selection__rendered')
1618      .attr('id', id)
1619      .attr('role', 'textbox')
1620      .attr('aria-readonly', 'true');
1621    this.$selection.attr('aria-labelledby', id);
1622
1623    this.$selection.on('mousedown', function (evt) {
1624      // Only respond to left clicks
1625      if (evt.which !== 1) {
1626        return;
1627      }
1628
1629      self.trigger('toggle', {
1630        originalEvent: evt
1631      });
1632    });
1633
1634    this.$selection.on('focus', function (evt) {
1635      // User focuses on the container
1636    });
1637
1638    this.$selection.on('blur', function (evt) {
1639      // User exits the container
1640    });
1641
1642    container.on('focus', function (evt) {
1643      if (!container.isOpen()) {
1644        self.$selection.trigger('focus');
1645      }
1646    });
1647  };
1648
1649  SingleSelection.prototype.clear = function () {
1650    var $rendered = this.$selection.find('.select2-selection__rendered');
1651    $rendered.empty();
1652    $rendered.removeAttr('title'); // clear tooltip on empty
1653  };
1654
1655  SingleSelection.prototype.display = function (data, container) {
1656    var template = this.options.get('templateSelection');
1657    var escapeMarkup = this.options.get('escapeMarkup');
1658
1659    return escapeMarkup(template(data, container));
1660  };
1661
1662  SingleSelection.prototype.selectionContainer = function () {
1663    return $('<span></span>');
1664  };
1665
1666  SingleSelection.prototype.update = function (data) {
1667    if (data.length === 0) {
1668      this.clear();
1669      return;
1670    }
1671
1672    var selection = data[0];
1673
1674    var $rendered = this.$selection.find('.select2-selection__rendered');
1675    var formatted = this.display(selection, $rendered);
1676
1677    $rendered.empty().append(formatted);
1678
1679    var title = selection.title || selection.text;
1680
1681    if (title) {
1682      $rendered.attr('title', title);
1683    } else {
1684      $rendered.removeAttr('title');
1685    }
1686  };
1687
1688  return SingleSelection;
1689});
1690
1691S2.define('select2/selection/multiple',[
1692  'jquery',
1693  './base',
1694  '../utils'
1695], function ($, BaseSelection, Utils) {
1696  function MultipleSelection ($element, options) {
1697    MultipleSelection.__super__.constructor.apply(this, arguments);
1698  }
1699
1700  Utils.Extend(MultipleSelection, BaseSelection);
1701
1702  MultipleSelection.prototype.render = function () {
1703    var $selection = MultipleSelection.__super__.render.call(this);
1704
1705    $selection.addClass('select2-selection--multiple');
1706
1707    $selection.html(
1708      '<ul class="select2-selection__rendered"></ul>'
1709    );
1710
1711    return $selection;
1712  };
1713
1714  MultipleSelection.prototype.bind = function (container, $container) {
1715    var self = this;
1716
1717    MultipleSelection.__super__.bind.apply(this, arguments);
1718
1719    this.$selection.on('click', function (evt) {
1720      self.trigger('toggle', {
1721        originalEvent: evt
1722      });
1723    });
1724
1725    this.$selection.on(
1726      'click',
1727      '.select2-selection__choice__remove',
1728      function (evt) {
1729        // Ignore the event if it is disabled
1730        if (self.isDisabled()) {
1731          return;
1732        }
1733
1734        var $remove = $(this);
1735        var $selection = $remove.parent();
1736
1737        var data = Utils.GetData($selection[0], 'data');
1738
1739        self.trigger('unselect', {
1740          originalEvent: evt,
1741          data: data
1742        });
1743      }
1744    );
1745  };
1746
1747  MultipleSelection.prototype.clear = function () {
1748    var $rendered = this.$selection.find('.select2-selection__rendered');
1749    $rendered.empty();
1750    $rendered.removeAttr('title');
1751  };
1752
1753  MultipleSelection.prototype.display = function (data, container) {
1754    var template = this.options.get('templateSelection');
1755    var escapeMarkup = this.options.get('escapeMarkup');
1756
1757    return escapeMarkup(template(data, container));
1758  };
1759
1760  MultipleSelection.prototype.selectionContainer = function () {
1761    var $container = $(
1762      '<li class="select2-selection__choice">' +
1763        '<span class="select2-selection__choice__remove" role="presentation">' +
1764          '&times;' +
1765        '</span>' +
1766      '</li>'
1767    );
1768
1769    return $container;
1770  };
1771
1772  MultipleSelection.prototype.update = function (data) {
1773    this.clear();
1774
1775    if (data.length === 0) {
1776      return;
1777    }
1778
1779    var $selections = [];
1780
1781    for (var d = 0; d < data.length; d++) {
1782      var selection = data[d];
1783
1784      var $selection = this.selectionContainer();
1785      var formatted = this.display(selection, $selection);
1786
1787      $selection.append(formatted);
1788
1789      var title = selection.title || selection.text;
1790
1791      if (title) {
1792        $selection.attr('title', title);
1793      }
1794
1795      Utils.StoreData($selection[0], 'data', selection);
1796
1797      $selections.push($selection);
1798    }
1799
1800    var $rendered = this.$selection.find('.select2-selection__rendered');
1801
1802    Utils.appendMany($rendered, $selections);
1803  };
1804
1805  return MultipleSelection;
1806});
1807
1808S2.define('select2/selection/placeholder',[
1809  '../utils'
1810], function (Utils) {
1811  function Placeholder (decorated, $element, options) {
1812    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
1813
1814    decorated.call(this, $element, options);
1815  }
1816
1817  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {
1818    if (typeof placeholder === 'string') {
1819      placeholder = {
1820        id: '',
1821        text: placeholder
1822      };
1823    }
1824
1825    return placeholder;
1826  };
1827
1828  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {
1829    var $placeholder = this.selectionContainer();
1830
1831    $placeholder.html(this.display(placeholder));
1832    $placeholder.addClass('select2-selection__placeholder')
1833                .removeClass('select2-selection__choice');
1834
1835    return $placeholder;
1836  };
1837
1838  Placeholder.prototype.update = function (decorated, data) {
1839    var singlePlaceholder = (
1840      data.length == 1 && data[0].id != this.placeholder.id
1841    );
1842    var multipleSelections = data.length > 1;
1843
1844    if (multipleSelections || singlePlaceholder) {
1845      return decorated.call(this, data);
1846    }
1847
1848    this.clear();
1849
1850    var $placeholder = this.createPlaceholder(this.placeholder);
1851
1852    this.$selection.find('.select2-selection__rendered').append($placeholder);
1853  };
1854
1855  return Placeholder;
1856});
1857
1858S2.define('select2/selection/allowClear',[
1859  'jquery',
1860  '../keys',
1861  '../utils'
1862], function ($, KEYS, Utils) {
1863  function AllowClear () { }
1864
1865  AllowClear.prototype.bind = function (decorated, container, $container) {
1866    var self = this;
1867
1868    decorated.call(this, container, $container);
1869
1870    if (this.placeholder == null) {
1871      if (this.options.get('debug') && window.console && console.error) {
1872        console.error(
1873          'Select2: The `allowClear` option should be used in combination ' +
1874          'with the `placeholder` option.'
1875        );
1876      }
1877    }
1878
1879    this.$selection.on('mousedown', '.select2-selection__clear',
1880      function (evt) {
1881        self._handleClear(evt);
1882    });
1883
1884    container.on('keypress', function (evt) {
1885      self._handleKeyboardClear(evt, container);
1886    });
1887  };
1888
1889  AllowClear.prototype._handleClear = function (_, evt) {
1890    // Ignore the event if it is disabled
1891    if (this.isDisabled()) {
1892      return;
1893    }
1894
1895    var $clear = this.$selection.find('.select2-selection__clear');
1896
1897    // Ignore the event if nothing has been selected
1898    if ($clear.length === 0) {
1899      return;
1900    }
1901
1902    evt.stopPropagation();
1903
1904    var data = Utils.GetData($clear[0], 'data');
1905
1906    var previousVal = this.$element.val();
1907    this.$element.val(this.placeholder.id);
1908
1909    var unselectData = {
1910      data: data
1911    };
1912    this.trigger('clear', unselectData);
1913    if (unselectData.prevented) {
1914      this.$element.val(previousVal);
1915      return;
1916    }
1917
1918    for (var d = 0; d < data.length; d++) {
1919      unselectData = {
1920        data: data[d]
1921      };
1922
1923      // Trigger the `unselect` event, so people can prevent it from being
1924      // cleared.
1925      this.trigger('unselect', unselectData);
1926
1927      // If the event was prevented, don't clear it out.
1928      if (unselectData.prevented) {
1929        this.$element.val(previousVal);
1930        return;
1931      }
1932    }
1933
1934    this.$element.trigger('input').trigger('change');
1935
1936    this.trigger('toggle', {});
1937  };
1938
1939  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
1940    if (container.isOpen()) {
1941      return;
1942    }
1943
1944    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {
1945      this._handleClear(evt);
1946    }
1947  };
1948
1949  AllowClear.prototype.update = function (decorated, data) {
1950    decorated.call(this, data);
1951
1952    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||
1953        data.length === 0) {
1954      return;
1955    }
1956
1957    var removeAll = this.options.get('translations').get('removeAllItems');
1958
1959    var $remove = $(
1960      '<span class="select2-selection__clear" title="' + removeAll() +'">' +
1961        '&times;' +
1962      '</span>'
1963    );
1964    Utils.StoreData($remove[0], 'data', data);
1965
1966    this.$selection.find('.select2-selection__rendered').prepend($remove);
1967  };
1968
1969  return AllowClear;
1970});
1971
1972S2.define('select2/selection/search',[
1973  'jquery',
1974  '../utils',
1975  '../keys'
1976], function ($, Utils, KEYS) {
1977  function Search (decorated, $element, options) {
1978    decorated.call(this, $element, options);
1979  }
1980
1981  Search.prototype.render = function (decorated) {
1982    var $search = $(
1983      '<li class="select2-search select2-search--inline">' +
1984        '<input class="select2-search__field" type="search" tabindex="-1"' +
1985        ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
1986        ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
1987      '</li>'
1988    );
1989
1990    this.$searchContainer = $search;
1991    this.$search = $search.find('input');
1992
1993    var $rendered = decorated.call(this);
1994
1995    this._transferTabIndex();
1996
1997    return $rendered;
1998  };
1999
2000  Search.prototype.bind = function (decorated, container, $container) {
2001    var self = this;
2002
2003    var resultsId = container.id + '-results';
2004
2005    decorated.call(this, container, $container);
2006
2007    container.on('open', function () {
2008      self.$search.attr('aria-controls', resultsId);
2009      self.$search.trigger('focus');
2010    });
2011
2012    container.on('close', function () {
2013      self.$search.val('');
2014      self.$search.removeAttr('aria-controls');
2015      self.$search.removeAttr('aria-activedescendant');
2016      self.$search.trigger('focus');
2017    });
2018
2019    container.on('enable', function () {
2020      self.$search.prop('disabled', false);
2021
2022      self._transferTabIndex();
2023    });
2024
2025    container.on('disable', function () {
2026      self.$search.prop('disabled', true);
2027    });
2028
2029    container.on('focus', function (evt) {
2030      self.$search.trigger('focus');
2031    });
2032
2033    container.on('results:focus', function (params) {
2034      if (params.data._resultId) {
2035        self.$search.attr('aria-activedescendant', params.data._resultId);
2036      } else {
2037        self.$search.removeAttr('aria-activedescendant');
2038      }
2039    });
2040
2041    this.$selection.on('focusin', '.select2-search--inline', function (evt) {
2042      self.trigger('focus', evt);
2043    });
2044
2045    this.$selection.on('focusout', '.select2-search--inline', function (evt) {
2046      self._handleBlur(evt);
2047    });
2048
2049    this.$selection.on('keydown', '.select2-search--inline', function (evt) {
2050      evt.stopPropagation();
2051
2052      self.trigger('keypress', evt);
2053
2054      self._keyUpPrevented = evt.isDefaultPrevented();
2055
2056      var key = evt.which;
2057
2058      if (key === KEYS.BACKSPACE && self.$search.val() === '') {
2059        var $previousChoice = self.$searchContainer
2060          .prev('.select2-selection__choice');
2061
2062        if ($previousChoice.length > 0) {
2063          var item = Utils.GetData($previousChoice[0], 'data');
2064
2065          self.searchRemoveChoice(item);
2066
2067          evt.preventDefault();
2068        }
2069      }
2070    });
2071
2072    this.$selection.on('click', '.select2-search--inline', function (evt) {
2073      if (self.$search.val()) {
2074        evt.stopPropagation();
2075      }
2076    });
2077
2078    // Try to detect the IE version should the `documentMode` property that
2079    // is stored on the document. This is only implemented in IE and is
2080    // slightly cleaner than doing a user agent check.
2081    // This property is not available in Edge, but Edge also doesn't have
2082    // this bug.
2083    var msie = document.documentMode;
2084    var disableInputEvents = msie && msie <= 11;
2085
2086    // Workaround for browsers which do not support the `input` event
2087    // This will prevent double-triggering of events for browsers which support
2088    // both the `keyup` and `input` events.
2089    this.$selection.on(
2090      'input.searchcheck',
2091      '.select2-search--inline',
2092      function (evt) {
2093        // IE will trigger the `input` event when a placeholder is used on a
2094        // search box. To get around this issue, we are forced to ignore all
2095        // `input` events in IE and keep using `keyup`.
2096        if (disableInputEvents) {
2097          self.$selection.off('input.search input.searchcheck');
2098          return;
2099        }
2100
2101        // Unbind the duplicated `keyup` event
2102        self.$selection.off('keyup.search');
2103      }
2104    );
2105
2106    this.$selection.on(
2107      'keyup.search input.search',
2108      '.select2-search--inline',
2109      function (evt) {
2110        // IE will trigger the `input` event when a placeholder is used on a
2111        // search box. To get around this issue, we are forced to ignore all
2112        // `input` events in IE and keep using `keyup`.
2113        if (disableInputEvents && evt.type === 'input') {
2114          self.$selection.off('input.search input.searchcheck');
2115          return;
2116        }
2117
2118        var key = evt.which;
2119
2120        // We can freely ignore events from modifier keys
2121        if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {
2122          return;
2123        }
2124
2125        // Tabbing will be handled during the `keydown` phase
2126        if (key == KEYS.TAB) {
2127          return;
2128        }
2129
2130        self.handleSearch(evt);
2131      }
2132    );
2133  };
2134
2135  /**
2136   * This method will transfer the tabindex attribute from the rendered
2137   * selection to the search box. This allows for the search box to be used as
2138   * the primary focus instead of the selection container.
2139   *
2140   * @private
2141   */
2142  Search.prototype._transferTabIndex = function (decorated) {
2143    this.$search.attr('tabindex', this.$selection.attr('tabindex'));
2144    this.$selection.attr('tabindex', '-1');
2145  };
2146
2147  Search.prototype.createPlaceholder = function (decorated, placeholder) {
2148    this.$search.attr('placeholder', placeholder.text);
2149  };
2150
2151  Search.prototype.update = function (decorated, data) {
2152    var searchHadFocus = this.$search[0] == document.activeElement;
2153
2154    this.$search.attr('placeholder', '');
2155
2156    decorated.call(this, data);
2157
2158    this.$selection.find('.select2-selection__rendered')
2159                   .append(this.$searchContainer);
2160
2161    this.resizeSearch();
2162    if (searchHadFocus) {
2163      this.$search.trigger('focus');
2164    }
2165  };
2166
2167  Search.prototype.handleSearch = function () {
2168    this.resizeSearch();
2169
2170    if (!this._keyUpPrevented) {
2171      var input = this.$search.val();
2172
2173      this.trigger('query', {
2174        term: input
2175      });
2176    }
2177
2178    this._keyUpPrevented = false;
vendor: 43,019 bytes, lines 2179-4179
2179  };
2180
2181  Search.prototype.searchRemoveChoice = function (decorated, item) {
2182    this.trigger('unselect', {
2183      data: item
2184    });
2185
2186    this.$search.val(item.text);
2187    this.handleSearch();
2188  };
2189
2190  Search.prototype.resizeSearch = function () {
2191    this.$search.css('width', '25px');
2192
2193    var width = '';
2194
2195    if (this.$search.attr('placeholder') !== '') {
2196      width = this.$selection.find('.select2-selection__rendered').width();
2197    } else {
2198      var minimumWidth = this.$search.val().length + 1;
2199
2200      width = (minimumWidth * 0.75) + 'em';
2201    }
2202
2203    this.$search.css('width', width);
2204  };
2205
2206  return Search;
2207});
2208
2209S2.define('select2/selection/eventRelay',[
2210  'jquery'
2211], function ($) {
2212  function EventRelay () { }
2213
2214  EventRelay.prototype.bind = function (decorated, container, $container) {
2215    var self = this;
2216    var relayEvents = [
2217      'open', 'opening',
2218      'close', 'closing',
2219      'select', 'selecting',
2220      'unselect', 'unselecting',
2221      'clear', 'clearing'
2222    ];
2223
2224    var preventableEvents = [
2225      'opening', 'closing', 'selecting', 'unselecting', 'clearing'
2226    ];
2227
2228    decorated.call(this, container, $container);
2229
2230    container.on('*', function (name, params) {
2231      // Ignore events that should not be relayed
2232      if ($.inArray(name, relayEvents) === -1) {
2233        return;
2234      }
2235
2236      // The parameters should always be an object
2237      params = params || {};
2238
2239      // Generate the jQuery event for the Select2 event
2240      var evt = $.Event('select2:' + name, {
2241        params: params
2242      });
2243
2244      self.$element.trigger(evt);
2245
2246      // Only handle preventable events if it was one
2247      if ($.inArray(name, preventableEvents) === -1) {
2248        return;
2249      }
2250
2251      params.prevented = evt.isDefaultPrevented();
2252    });
2253  };
2254
2255  return EventRelay;
2256});
2257
2258S2.define('select2/translation',[
2259  'jquery',
2260  'require'
2261], function ($, require) {
2262  function Translation (dict) {
2263    this.dict = dict || {};
2264  }
2265
2266  Translation.prototype.all = function () {
2267    return this.dict;
2268  };
2269
2270  Translation.prototype.get = function (key) {
2271    return this.dict[key];
2272  };
2273
2274  Translation.prototype.extend = function (translation) {
2275    this.dict = $.extend({}, translation.all(), this.dict);
2276  };
2277
2278  // Static functions
2279
2280  Translation._cache = {};
2281
2282  Translation.loadPath = function (path) {
2283    if (!(path in Translation._cache)) {
2284      var translations = require(path);
2285
2286      Translation._cache[path] = translations;
2287    }
2288
2289    return new Translation(Translation._cache[path]);
2290  };
2291
2292  return Translation;
2293});
2294
2295S2.define('select2/diacritics',[
2296
2297], function () {
2298  var diacritics = {
2299    '\u24B6': 'A',
2300    '\uFF21': 'A',
2301    '\u00C0': 'A',
2302    '\u00C1': 'A',
2303    '\u00C2': 'A',
2304    '\u1EA6': 'A',
2305    '\u1EA4': 'A',
2306    '\u1EAA': 'A',
2307    '\u1EA8': 'A',
2308    '\u00C3': 'A',
2309    '\u0100': 'A',
2310    '\u0102': 'A',
2311    '\u1EB0': 'A',
2312    '\u1EAE': 'A',
2313    '\u1EB4': 'A',
2314    '\u1EB2': 'A',
2315    '\u0226': 'A',
2316    '\u01E0': 'A',
2317    '\u00C4': 'A',
2318    '\u01DE': 'A',
2319    '\u1EA2': 'A',
2320    '\u00C5': 'A',
2321    '\u01FA': 'A',
2322    '\u01CD': 'A',
2323    '\u0200': 'A',
2324    '\u0202': 'A',
2325    '\u1EA0': 'A',
2326    '\u1EAC': 'A',
2327    '\u1EB6': 'A',
2328    '\u1E00': 'A',
2329    '\u0104': 'A',
2330    '\u023A': 'A',
2331    '\u2C6F': 'A',
2332    '\uA732': 'AA',
2333    '\u00C6': 'AE',
2334    '\u01FC': 'AE',
2335    '\u01E2': 'AE',
2336    '\uA734': 'AO',
2337    '\uA736': 'AU',
2338    '\uA738': 'AV',
2339    '\uA73A': 'AV',
2340    '\uA73C': 'AY',
2341    '\u24B7': 'B',
2342    '\uFF22': 'B',
2343    '\u1E02': 'B',
2344    '\u1E04': 'B',
2345    '\u1E06': 'B',
2346    '\u0243': 'B',
2347    '\u0182': 'B',
2348    '\u0181': 'B',
2349    '\u24B8': 'C',
2350    '\uFF23': 'C',
2351    '\u0106': 'C',
2352    '\u0108': 'C',
2353    '\u010A': 'C',
2354    '\u010C': 'C',
2355    '\u00C7': 'C',
2356    '\u1E08': 'C',
2357    '\u0187': 'C',
2358    '\u023B': 'C',
2359    '\uA73E': 'C',
2360    '\u24B9': 'D',
2361    '\uFF24': 'D',
2362    '\u1E0A': 'D',
2363    '\u010E': 'D',
2364    '\u1E0C': 'D',
2365    '\u1E10': 'D',
2366    '\u1E12': 'D',
2367    '\u1E0E': 'D',
2368    '\u0110': 'D',
2369    '\u018B': 'D',
2370    '\u018A': 'D',
2371    '\u0189': 'D',
2372    '\uA779': 'D',
2373    '\u01F1': 'DZ',
2374    '\u01C4': 'DZ',
2375    '\u01F2': 'Dz',
2376    '\u01C5': 'Dz',
2377    '\u24BA': 'E',
2378    '\uFF25': 'E',
2379    '\u00C8': 'E',
2380    '\u00C9': 'E',
2381    '\u00CA': 'E',
2382    '\u1EC0': 'E',
2383    '\u1EBE': 'E',
2384    '\u1EC4': 'E',
2385    '\u1EC2': 'E',
2386    '\u1EBC': 'E',
2387    '\u0112': 'E',
2388    '\u1E14': 'E',
2389    '\u1E16': 'E',
2390    '\u0114': 'E',
2391    '\u0116': 'E',
2392    '\u00CB': 'E',
2393    '\u1EBA': 'E',
2394    '\u011A': 'E',
2395    '\u0204': 'E',
2396    '\u0206': 'E',
2397    '\u1EB8': 'E',
2398    '\u1EC6': 'E',
2399    '\u0228': 'E',
2400    '\u1E1C': 'E',
2401    '\u0118': 'E',
2402    '\u1E18': 'E',
2403    '\u1E1A': 'E',
2404    '\u0190': 'E',
2405    '\u018E': 'E',
2406    '\u24BB': 'F',
2407    '\uFF26': 'F',
2408    '\u1E1E': 'F',
2409    '\u0191': 'F',
2410    '\uA77B': 'F',
2411    '\u24BC': 'G',
2412    '\uFF27': 'G',
2413    '\u01F4': 'G',
2414    '\u011C': 'G',
2415    '\u1E20': 'G',
2416    '\u011E': 'G',
2417    '\u0120': 'G',
2418    '\u01E6': 'G',
2419    '\u0122': 'G',
2420    '\u01E4': 'G',
2421    '\u0193': 'G',
2422    '\uA7A0': 'G',
2423    '\uA77D': 'G',
2424    '\uA77E': 'G',
2425    '\u24BD': 'H',
2426    '\uFF28': 'H',
2427    '\u0124': 'H',
2428    '\u1E22': 'H',
2429    '\u1E26': 'H',
2430    '\u021E': 'H',
2431    '\u1E24': 'H',
2432    '\u1E28': 'H',
2433    '\u1E2A': 'H',
2434    '\u0126': 'H',
2435    '\u2C67': 'H',
2436    '\u2C75': 'H',
2437    '\uA78D': 'H',
2438    '\u24BE': 'I',
2439    '\uFF29': 'I',
2440    '\u00CC': 'I',
2441    '\u00CD': 'I',
2442    '\u00CE': 'I',
2443    '\u0128': 'I',
2444    '\u012A': 'I',
2445    '\u012C': 'I',
2446    '\u0130': 'I',
2447    '\u00CF': 'I',
2448    '\u1E2E': 'I',
2449    '\u1EC8': 'I',
2450    '\u01CF': 'I',
2451    '\u0208': 'I',
2452    '\u020A': 'I',
2453    '\u1ECA': 'I',
2454    '\u012E': 'I',
2455    '\u1E2C': 'I',
2456    '\u0197': 'I',
2457    '\u24BF': 'J',
2458    '\uFF2A': 'J',
2459    '\u0134': 'J',
2460    '\u0248': 'J',
2461    '\u24C0': 'K',
2462    '\uFF2B': 'K',
2463    '\u1E30': 'K',
2464    '\u01E8': 'K',
2465    '\u1E32': 'K',
2466    '\u0136': 'K',
2467    '\u1E34': 'K',
2468    '\u0198': 'K',
2469    '\u2C69': 'K',
2470    '\uA740': 'K',
2471    '\uA742': 'K',
2472    '\uA744': 'K',
2473    '\uA7A2': 'K',
2474    '\u24C1': 'L',
2475    '\uFF2C': 'L',
2476    '\u013F': 'L',
2477    '\u0139': 'L',
2478    '\u013D': 'L',
2479    '\u1E36': 'L',
2480    '\u1E38': 'L',
2481    '\u013B': 'L',
2482    '\u1E3C': 'L',
2483    '\u1E3A': 'L',
2484    '\u0141': 'L',
2485    '\u023D': 'L',
2486    '\u2C62': 'L',
2487    '\u2C60': 'L',
2488    '\uA748': 'L',
2489    '\uA746': 'L',
2490    '\uA780': 'L',
2491    '\u01C7': 'LJ',
2492    '\u01C8': 'Lj',
2493    '\u24C2': 'M',
2494    '\uFF2D': 'M',
2495    '\u1E3E': 'M',
2496    '\u1E40': 'M',
2497    '\u1E42': 'M',
2498    '\u2C6E': 'M',
2499    '\u019C': 'M',
2500    '\u24C3': 'N',
2501    '\uFF2E': 'N',
2502    '\u01F8': 'N',
2503    '\u0143': 'N',
2504    '\u00D1': 'N',
2505    '\u1E44': 'N',
2506    '\u0147': 'N',
2507    '\u1E46': 'N',
2508    '\u0145': 'N',
2509    '\u1E4A': 'N',
2510    '\u1E48': 'N',
2511    '\u0220': 'N',
2512    '\u019D': 'N',
2513    '\uA790': 'N',
2514    '\uA7A4': 'N',
2515    '\u01CA': 'NJ',
2516    '\u01CB': 'Nj',
2517    '\u24C4': 'O',
2518    '\uFF2F': 'O',
2519    '\u00D2': 'O',
2520    '\u00D3': 'O',
2521    '\u00D4': 'O',
2522    '\u1ED2': 'O',
2523    '\u1ED0': 'O',
2524    '\u1ED6': 'O',
2525    '\u1ED4': 'O',
2526    '\u00D5': 'O',
2527    '\u1E4C': 'O',
2528    '\u022C': 'O',
2529    '\u1E4E': 'O',
2530    '\u014C': 'O',
2531    '\u1E50': 'O',
2532    '\u1E52': 'O',
2533    '\u014E': 'O',
2534    '\u022E': 'O',
2535    '\u0230': 'O',
2536    '\u00D6': 'O',
2537    '\u022A': 'O',
2538    '\u1ECE': 'O',
2539    '\u0150': 'O',
2540    '\u01D1': 'O',
2541    '\u020C': 'O',
2542    '\u020E': 'O',
2543    '\u01A0': 'O',
2544    '\u1EDC': 'O',
2545    '\u1EDA': 'O',
2546    '\u1EE0': 'O',
2547    '\u1EDE': 'O',
2548    '\u1EE2': 'O',
2549    '\u1ECC': 'O',
2550    '\u1ED8': 'O',
2551    '\u01EA': 'O',
2552    '\u01EC': 'O',
2553    '\u00D8': 'O',
2554    '\u01FE': 'O',
2555    '\u0186': 'O',
2556    '\u019F': 'O',
2557    '\uA74A': 'O',
2558    '\uA74C': 'O',
2559    '\u0152': 'OE',
2560    '\u01A2': 'OI',
2561    '\uA74E': 'OO',
2562    '\u0222': 'OU',
2563    '\u24C5': 'P',
2564    '\uFF30': 'P',
2565    '\u1E54': 'P',
2566    '\u1E56': 'P',
2567    '\u01A4': 'P',
2568    '\u2C63': 'P',
2569    '\uA750': 'P',
2570    '\uA752': 'P',
2571    '\uA754': 'P',
2572    '\u24C6': 'Q',
2573    '\uFF31': 'Q',
2574    '\uA756': 'Q',
2575    '\uA758': 'Q',
2576    '\u024A': 'Q',
2577    '\u24C7': 'R',
2578    '\uFF32': 'R',
2579    '\u0154': 'R',
2580    '\u1E58': 'R',
2581    '\u0158': 'R',
2582    '\u0210': 'R',
2583    '\u0212': 'R',
2584    '\u1E5A': 'R',
2585    '\u1E5C': 'R',
2586    '\u0156': 'R',
2587    '\u1E5E': 'R',
2588    '\u024C': 'R',
2589    '\u2C64': 'R',
2590    '\uA75A': 'R',
2591    '\uA7A6': 'R',
2592    '\uA782': 'R',
2593    '\u24C8': 'S',
2594    '\uFF33': 'S',
2595    '\u1E9E': 'S',
2596    '\u015A': 'S',
2597    '\u1E64': 'S',
2598    '\u015C': 'S',
2599    '\u1E60': 'S',
2600    '\u0160': 'S',
2601    '\u1E66': 'S',
2602    '\u1E62': 'S',
2603    '\u1E68': 'S',
2604    '\u0218': 'S',
2605    '\u015E': 'S',
2606    '\u2C7E': 'S',
2607    '\uA7A8': 'S',
2608    '\uA784': 'S',
2609    '\u24C9': 'T',
2610    '\uFF34': 'T',
2611    '\u1E6A': 'T',
2612    '\u0164': 'T',
2613    '\u1E6C': 'T',
2614    '\u021A': 'T',
2615    '\u0162': 'T',
2616    '\u1E70': 'T',
2617    '\u1E6E': 'T',
2618    '\u0166': 'T',
2619    '\u01AC': 'T',
2620    '\u01AE': 'T',
2621    '\u023E': 'T',
2622    '\uA786': 'T',
2623    '\uA728': 'TZ',
2624    '\u24CA': 'U',
2625    '\uFF35': 'U',
2626    '\u00D9': 'U',
2627    '\u00DA': 'U',
2628    '\u00DB': 'U',
2629    '\u0168': 'U',
2630    '\u1E78': 'U',
2631    '\u016A': 'U',
2632    '\u1E7A': 'U',
2633    '\u016C': 'U',
2634    '\u00DC': 'U',
2635    '\u01DB': 'U',
2636    '\u01D7': 'U',
2637    '\u01D5': 'U',
2638    '\u01D9': 'U',
2639    '\u1EE6': 'U',
2640    '\u016E': 'U',
2641    '\u0170': 'U',
2642    '\u01D3': 'U',
2643    '\u0214': 'U',
2644    '\u0216': 'U',
2645    '\u01AF': 'U',
2646    '\u1EEA': 'U',
2647    '\u1EE8': 'U',
2648    '\u1EEE': 'U',
2649    '\u1EEC': 'U',
2650    '\u1EF0': 'U',
2651    '\u1EE4': 'U',
2652    '\u1E72': 'U',
2653    '\u0172': 'U',
2654    '\u1E76': 'U',
2655    '\u1E74': 'U',
2656    '\u0244': 'U',
2657    '\u24CB': 'V',
2658    '\uFF36': 'V',
2659    '\u1E7C': 'V',
2660    '\u1E7E': 'V',
2661    '\u01B2': 'V',
2662    '\uA75E': 'V',
2663    '\u0245': 'V',
2664    '\uA760': 'VY',
2665    '\u24CC': 'W',
2666    '\uFF37': 'W',
2667    '\u1E80': 'W',
2668    '\u1E82': 'W',
2669    '\u0174': 'W',
2670    '\u1E86': 'W',
2671    '\u1E84': 'W',
2672    '\u1E88': 'W',
2673    '\u2C72': 'W',
2674    '\u24CD': 'X',
2675    '\uFF38': 'X',
2676    '\u1E8A': 'X',
2677    '\u1E8C': 'X',
2678    '\u24CE': 'Y',
2679    '\uFF39': 'Y',
2680    '\u1EF2': 'Y',
2681    '\u00DD': 'Y',
2682    '\u0176': 'Y',
2683    '\u1EF8': 'Y',
2684    '\u0232': 'Y',
2685    '\u1E8E': 'Y',
2686    '\u0178': 'Y',
2687    '\u1EF6': 'Y',
2688    '\u1EF4': 'Y',
2689    '\u01B3': 'Y',
2690    '\u024E': 'Y',
2691    '\u1EFE': 'Y',
2692    '\u24CF': 'Z',
2693    '\uFF3A': 'Z',
2694    '\u0179': 'Z',
2695    '\u1E90': 'Z',
2696    '\u017B': 'Z',
2697    '\u017D': 'Z',
2698    '\u1E92': 'Z',
2699    '\u1E94': 'Z',
2700    '\u01B5': 'Z',
2701    '\u0224': 'Z',
2702    '\u2C7F': 'Z',
2703    '\u2C6B': 'Z',
2704    '\uA762': 'Z',
2705    '\u24D0': 'a',
2706    '\uFF41': 'a',
2707    '\u1E9A': 'a',
2708    '\u00E0': 'a',
2709    '\u00E1': 'a',
2710    '\u00E2': 'a',
2711    '\u1EA7': 'a',
2712    '\u1EA5': 'a',
2713    '\u1EAB': 'a',
2714    '\u1EA9': 'a',
2715    '\u00E3': 'a',
2716    '\u0101': 'a',
2717    '\u0103': 'a',
2718    '\u1EB1': 'a',
2719    '\u1EAF': 'a',
2720    '\u1EB5': 'a',
2721    '\u1EB3': 'a',
2722    '\u0227': 'a',
2723    '\u01E1': 'a',
2724    '\u00E4': 'a',
2725    '\u01DF': 'a',
2726    '\u1EA3': 'a',
2727    '\u00E5': 'a',
2728    '\u01FB': 'a',
2729    '\u01CE': 'a',
2730    '\u0201': 'a',
2731    '\u0203': 'a',
2732    '\u1EA1': 'a',
2733    '\u1EAD': 'a',
2734    '\u1EB7': 'a',
2735    '\u1E01': 'a',
2736    '\u0105': 'a',
2737    '\u2C65': 'a',
2738    '\u0250': 'a',
2739    '\uA733': 'aa',
2740    '\u00E6': 'ae',
2741    '\u01FD': 'ae',
2742    '\u01E3': 'ae',
2743    '\uA735': 'ao',
2744    '\uA737': 'au',
2745    '\uA739': 'av',
2746    '\uA73B': 'av',
2747    '\uA73D': 'ay',
2748    '\u24D1': 'b',
2749    '\uFF42': 'b',
2750    '\u1E03': 'b',
2751    '\u1E05': 'b',
2752    '\u1E07': 'b',
2753    '\u0180': 'b',
2754    '\u0183': 'b',
2755    '\u0253': 'b',
2756    '\u24D2': 'c',
2757    '\uFF43': 'c',
2758    '\u0107': 'c',
2759    '\u0109': 'c',
2760    '\u010B': 'c',
2761    '\u010D': 'c',
2762    '\u00E7': 'c',
2763    '\u1E09': 'c',
2764    '\u0188': 'c',
2765    '\u023C': 'c',
2766    '\uA73F': 'c',
2767    '\u2184': 'c',
2768    '\u24D3': 'd',
2769    '\uFF44': 'd',
2770    '\u1E0B': 'd',
2771    '\u010F': 'd',
2772    '\u1E0D': 'd',
2773    '\u1E11': 'd',
2774    '\u1E13': 'd',
2775    '\u1E0F': 'd',
2776    '\u0111': 'd',
2777    '\u018C': 'd',
2778    '\u0256': 'd',
2779    '\u0257': 'd',
2780    '\uA77A': 'd',
2781    '\u01F3': 'dz',
2782    '\u01C6': 'dz',
2783    '\u24D4': 'e',
2784    '\uFF45': 'e',
2785    '\u00E8': 'e',
2786    '\u00E9': 'e',
2787    '\u00EA': 'e',
2788    '\u1EC1': 'e',
2789    '\u1EBF': 'e',
2790    '\u1EC5': 'e',
2791    '\u1EC3': 'e',
2792    '\u1EBD': 'e',
2793    '\u0113': 'e',
2794    '\u1E15': 'e',
2795    '\u1E17': 'e',
2796    '\u0115': 'e',
2797    '\u0117': 'e',
2798    '\u00EB': 'e',
2799    '\u1EBB': 'e',
2800    '\u011B': 'e',
2801    '\u0205': 'e',
2802    '\u0207': 'e',
2803    '\u1EB9': 'e',
2804    '\u1EC7': 'e',
2805    '\u0229': 'e',
2806    '\u1E1D': 'e',
2807    '\u0119': 'e',
2808    '\u1E19': 'e',
2809    '\u1E1B': 'e',
2810    '\u0247': 'e',
2811    '\u025B': 'e',
2812    '\u01DD': 'e',
2813    '\u24D5': 'f',
2814    '\uFF46': 'f',
2815    '\u1E1F': 'f',
2816    '\u0192': 'f',
2817    '\uA77C': 'f',
2818    '\u24D6': 'g',
2819    '\uFF47': 'g',
2820    '\u01F5': 'g',
2821    '\u011D': 'g',
2822    '\u1E21': 'g',
2823    '\u011F': 'g',
2824    '\u0121': 'g',
2825    '\u01E7': 'g',
2826    '\u0123': 'g',
2827    '\u01E5': 'g',
2828    '\u0260': 'g',
2829    '\uA7A1': 'g',
2830    '\u1D79': 'g',
2831    '\uA77F': 'g',
2832    '\u24D7': 'h',
2833    '\uFF48': 'h',
2834    '\u0125': 'h',
2835    '\u1E23': 'h',
2836    '\u1E27': 'h',
2837    '\u021F': 'h',
2838    '\u1E25': 'h',
2839    '\u1E29': 'h',
2840    '\u1E2B': 'h',
2841    '\u1E96': 'h',
2842    '\u0127': 'h',
2843    '\u2C68': 'h',
2844    '\u2C76': 'h',
2845    '\u0265': 'h',
2846    '\u0195': 'hv',
2847    '\u24D8': 'i',
2848    '\uFF49': 'i',
2849    '\u00EC': 'i',
2850    '\u00ED': 'i',
2851    '\u00EE': 'i',
2852    '\u0129': 'i',
2853    '\u012B': 'i',
2854    '\u012D': 'i',
2855    '\u00EF': 'i',
2856    '\u1E2F': 'i',
2857    '\u1EC9': 'i',
2858    '\u01D0': 'i',
2859    '\u0209': 'i',
2860    '\u020B': 'i',
2861    '\u1ECB': 'i',
2862    '\u012F': 'i',
2863    '\u1E2D': 'i',
2864    '\u0268': 'i',
2865    '\u0131': 'i',
2866    '\u24D9': 'j',
2867    '\uFF4A': 'j',
2868    '\u0135': 'j',
2869    '\u01F0': 'j',
2870    '\u0249': 'j',
2871    '\u24DA': 'k',
2872    '\uFF4B': 'k',
2873    '\u1E31': 'k',
2874    '\u01E9': 'k',
2875    '\u1E33': 'k',
2876    '\u0137': 'k',
2877    '\u1E35': 'k',
2878    '\u0199': 'k',
2879    '\u2C6A': 'k',
2880    '\uA741': 'k',
2881    '\uA743': 'k',
2882    '\uA745': 'k',
2883    '\uA7A3': 'k',
2884    '\u24DB': 'l',
2885    '\uFF4C': 'l',
2886    '\u0140': 'l',
2887    '\u013A': 'l',
2888    '\u013E': 'l',
2889    '\u1E37': 'l',
2890    '\u1E39': 'l',
2891    '\u013C': 'l',
2892    '\u1E3D': 'l',
2893    '\u1E3B': 'l',
2894    '\u017F': 'l',
2895    '\u0142': 'l',
2896    '\u019A': 'l',
2897    '\u026B': 'l',
2898    '\u2C61': 'l',
2899    '\uA749': 'l',
2900    '\uA781': 'l',
2901    '\uA747': 'l',
2902    '\u01C9': 'lj',
2903    '\u24DC': 'm',
2904    '\uFF4D': 'm',
2905    '\u1E3F': 'm',
2906    '\u1E41': 'm',
2907    '\u1E43': 'm',
2908    '\u0271': 'm',
2909    '\u026F': 'm',
2910    '\u24DD': 'n',
2911    '\uFF4E': 'n',
2912    '\u01F9': 'n',
2913    '\u0144': 'n',
2914    '\u00F1': 'n',
2915    '\u1E45': 'n',
2916    '\u0148': 'n',
2917    '\u1E47': 'n',
2918    '\u0146': 'n',
2919    '\u1E4B': 'n',
2920    '\u1E49': 'n',
2921    '\u019E': 'n',
2922    '\u0272': 'n',
2923    '\u0149': 'n',
2924    '\uA791': 'n',
2925    '\uA7A5': 'n',
2926    '\u01CC': 'nj',
2927    '\u24DE': 'o',
2928    '\uFF4F': 'o',
2929    '\u00F2': 'o',
2930    '\u00F3': 'o',
2931    '\u00F4': 'o',
2932    '\u1ED3': 'o',
2933    '\u1ED1': 'o',
2934    '\u1ED7': 'o',
2935    '\u1ED5': 'o',
2936    '\u00F5': 'o',
2937    '\u1E4D': 'o',
2938    '\u022D': 'o',
2939    '\u1E4F': 'o',
2940    '\u014D': 'o',
2941    '\u1E51': 'o',
2942    '\u1E53': 'o',
2943    '\u014F': 'o',
2944    '\u022F': 'o',
2945    '\u0231': 'o',
2946    '\u00F6': 'o',
2947    '\u022B': 'o',
2948    '\u1ECF': 'o',
2949    '\u0151': 'o',
2950    '\u01D2': 'o',
2951    '\u020D': 'o',
2952    '\u020F': 'o',
2953    '\u01A1': 'o',
2954    '\u1EDD': 'o',
2955    '\u1EDB': 'o',
2956    '\u1EE1': 'o',
2957    '\u1EDF': 'o',
2958    '\u1EE3': 'o',
2959    '\u1ECD': 'o',
2960    '\u1ED9': 'o',
2961    '\u01EB': 'o',
2962    '\u01ED': 'o',
2963    '\u00F8': 'o',
2964    '\u01FF': 'o',
2965    '\u0254': 'o',
2966    '\uA74B': 'o',
2967    '\uA74D': 'o',
2968    '\u0275': 'o',
2969    '\u0153': 'oe',
2970    '\u01A3': 'oi',
2971    '\u0223': 'ou',
2972    '\uA74F': 'oo',
2973    '\u24DF': 'p',
2974    '\uFF50': 'p',
2975    '\u1E55': 'p',
2976    '\u1E57': 'p',
2977    '\u01A5': 'p',
2978    '\u1D7D': 'p',
2979    '\uA751': 'p',
2980    '\uA753': 'p',
2981    '\uA755': 'p',
2982    '\u24E0': 'q',
2983    '\uFF51': 'q',
2984    '\u024B': 'q',
2985    '\uA757': 'q',
2986    '\uA759': 'q',
2987    '\u24E1': 'r',
2988    '\uFF52': 'r',
2989    '\u0155': 'r',
2990    '\u1E59': 'r',
2991    '\u0159': 'r',
2992    '\u0211': 'r',
2993    '\u0213': 'r',
2994    '\u1E5B': 'r',
2995    '\u1E5D': 'r',
2996    '\u0157': 'r',
2997    '\u1E5F': 'r',
2998    '\u024D': 'r',
2999    '\u027D': 'r',
3000    '\uA75B': 'r',
3001    '\uA7A7': 'r',
3002    '\uA783': 'r',
3003    '\u24E2': 's',
3004    '\uFF53': 's',
3005    '\u00DF': 's',
3006    '\u015B': 's',
3007    '\u1E65': 's',
3008    '\u015D': 's',
3009    '\u1E61': 's',
3010    '\u0161': 's',
3011    '\u1E67': 's',
3012    '\u1E63': 's',
3013    '\u1E69': 's',
3014    '\u0219': 's',
3015    '\u015F': 's',
3016    '\u023F': 's',
3017    '\uA7A9': 's',
3018    '\uA785': 's',
3019    '\u1E9B': 's',
3020    '\u24E3': 't',
3021    '\uFF54': 't',
3022    '\u1E6B': 't',
3023    '\u1E97': 't',
3024    '\u0165': 't',
3025    '\u1E6D': 't',
3026    '\u021B': 't',
3027    '\u0163': 't',
3028    '\u1E71': 't',
3029    '\u1E6F': 't',
3030    '\u0167': 't',
3031    '\u01AD': 't',
3032    '\u0288': 't',
3033    '\u2C66': 't',
3034    '\uA787': 't',
3035    '\uA729': 'tz',
3036    '\u24E4': 'u',
3037    '\uFF55': 'u',
3038    '\u00F9': 'u',
3039    '\u00FA': 'u',
3040    '\u00FB': 'u',
3041    '\u0169': 'u',
3042    '\u1E79': 'u',
3043    '\u016B': 'u',
3044    '\u1E7B': 'u',
3045    '\u016D': 'u',
3046    '\u00FC': 'u',
3047    '\u01DC': 'u',
3048    '\u01D8': 'u',
3049    '\u01D6': 'u',
3050    '\u01DA': 'u',
3051    '\u1EE7': 'u',
3052    '\u016F': 'u',
3053    '\u0171': 'u',
3054    '\u01D4': 'u',
3055    '\u0215': 'u',
3056    '\u0217': 'u',
3057    '\u01B0': 'u',
3058    '\u1EEB': 'u',
3059    '\u1EE9': 'u',
3060    '\u1EEF': 'u',
3061    '\u1EED': 'u',
3062    '\u1EF1': 'u',
3063    '\u1EE5': 'u',
3064    '\u1E73': 'u',
3065    '\u0173': 'u',
3066    '\u1E77': 'u',
3067    '\u1E75': 'u',
3068    '\u0289': 'u',
3069    '\u24E5': 'v',
3070    '\uFF56': 'v',
3071    '\u1E7D': 'v',
3072    '\u1E7F': 'v',
3073    '\u028B': 'v',
3074    '\uA75F': 'v',
3075    '\u028C': 'v',
3076    '\uA761': 'vy',
3077    '\u24E6': 'w',
3078    '\uFF57': 'w',
3079    '\u1E81': 'w',
3080    '\u1E83': 'w',
3081    '\u0175': 'w',
3082    '\u1E87': 'w',
3083    '\u1E85': 'w',
3084    '\u1E98': 'w',
3085    '\u1E89': 'w',
3086    '\u2C73': 'w',
3087    '\u24E7': 'x',
3088    '\uFF58': 'x',
3089    '\u1E8B': 'x',
3090    '\u1E8D': 'x',
3091    '\u24E8': 'y',
3092    '\uFF59': 'y',
3093    '\u1EF3': 'y',
3094    '\u00FD': 'y',
3095    '\u0177': 'y',
3096    '\u1EF9': 'y',
3097    '\u0233': 'y',
3098    '\u1E8F': 'y',
3099    '\u00FF': 'y',
3100    '\u1EF7': 'y',
3101    '\u1E99': 'y',
3102    '\u1EF5': 'y',
3103    '\u01B4': 'y',
3104    '\u024F': 'y',
3105    '\u1EFF': 'y',
3106    '\u24E9': 'z',
3107    '\uFF5A': 'z',
3108    '\u017A': 'z',
3109    '\u1E91': 'z',
3110    '\u017C': 'z',
3111    '\u017E': 'z',
3112    '\u1E93': 'z',
3113    '\u1E95': 'z',
3114    '\u01B6': 'z',
3115    '\u0225': 'z',
3116    '\u0240': 'z',
3117    '\u2C6C': 'z',
3118    '\uA763': 'z',
3119    '\u0386': '\u0391',
3120    '\u0388': '\u0395',
3121    '\u0389': '\u0397',
3122    '\u038A': '\u0399',
3123    '\u03AA': '\u0399',
3124    '\u038C': '\u039F',
3125    '\u038E': '\u03A5',
3126    '\u03AB': '\u03A5',
3127    '\u038F': '\u03A9',
3128    '\u03AC': '\u03B1',
3129    '\u03AD': '\u03B5',
3130    '\u03AE': '\u03B7',
3131    '\u03AF': '\u03B9',
3132    '\u03CA': '\u03B9',
3133    '\u0390': '\u03B9',
3134    '\u03CC': '\u03BF',
3135    '\u03CD': '\u03C5',
3136    '\u03CB': '\u03C5',
3137    '\u03B0': '\u03C5',
3138    '\u03CE': '\u03C9',
3139    '\u03C2': '\u03C3',
3140    '\u2019': '\''
3141  };
3142
3143  return diacritics;
3144});
3145
3146S2.define('select2/data/base',[
3147  '../utils'
3148], function (Utils) {
3149  function BaseAdapter ($element, options) {
3150    BaseAdapter.__super__.constructor.call(this);
3151  }
3152
3153  Utils.Extend(BaseAdapter, Utils.Observable);
3154
3155  BaseAdapter.prototype.current = function (callback) {
3156    throw new Error('The `current` method must be defined in child classes.');
3157  };
3158
3159  BaseAdapter.prototype.query = function (params, callback) {
3160    throw new Error('The `query` method must be defined in child classes.');
3161  };
3162
3163  BaseAdapter.prototype.bind = function (container, $container) {
3164    // Can be implemented in subclasses
3165  };
3166
3167  BaseAdapter.prototype.destroy = function () {
3168    // Can be implemented in subclasses
3169  };
3170
3171  BaseAdapter.prototype.generateResultId = function (container, data) {
3172    var id = container.id + '-result-';
3173
3174    id += Utils.generateChars(4);
3175
3176    if (data.id != null) {
3177      id += '-' + data.id.toString();
3178    } else {
3179      id += '-' + Utils.generateChars(4);
3180    }
3181    return id;
3182  };
3183
3184  return BaseAdapter;
3185});
3186
3187S2.define('select2/data/select',[
3188  './base',
3189  '../utils',
3190  'jquery'
3191], function (BaseAdapter, Utils, $) {
3192  function SelectAdapter ($element, options) {
3193    this.$element = $element;
3194    this.options = options;
3195
3196    SelectAdapter.__super__.constructor.call(this);
3197  }
3198
3199  Utils.Extend(SelectAdapter, BaseAdapter);
3200
3201  SelectAdapter.prototype.current = function (callback) {
3202    var data = [];
3203    var self = this;
3204
3205    this.$element.find(':selected').each(function () {
3206      var $option = $(this);
3207
3208      var option = self.item($option);
3209
3210      data.push(option);
3211    });
3212
3213    callback(data);
3214  };
3215
3216  SelectAdapter.prototype.select = function (data) {
3217    var self = this;
3218
3219    data.selected = true;
3220
3221    // If data.element is a DOM node, use it instead
3222    if ($(data.element).is('option')) {
3223      data.element.selected = true;
3224
3225      this.$element.trigger('input').trigger('change');
3226
3227      return;
3228    }
3229
3230    if (this.$element.prop('multiple')) {
3231      this.current(function (currentData) {
3232        var val = [];
3233
3234        data = [data];
3235        data.push.apply(data, currentData);
3236
3237        for (var d = 0; d < data.length; d++) {
3238          var id = data[d].id;
3239
3240          if ($.inArray(id, val) === -1) {
3241            val.push(id);
3242          }
3243        }
3244
3245        self.$element.val(val);
3246        self.$element.trigger('input').trigger('change');
3247      });
3248    } else {
3249      var val = data.id;
3250
3251      this.$element.val(val);
3252      this.$element.trigger('input').trigger('change');
3253    }
3254  };
3255
3256  SelectAdapter.prototype.unselect = function (data) {
3257    var self = this;
3258
3259    if (!this.$element.prop('multiple')) {
3260      return;
3261    }
3262
3263    data.selected = false;
3264
3265    if ($(data.element).is('option')) {
3266      data.element.selected = false;
3267
3268      this.$element.trigger('input').trigger('change');
3269
3270      return;
3271    }
3272
3273    this.current(function (currentData) {
3274      var val = [];
3275
3276      for (var d = 0; d < currentData.length; d++) {
3277        var id = currentData[d].id;
3278
3279        if (id !== data.id && $.inArray(id, val) === -1) {
3280          val.push(id);
3281        }
3282      }
3283
3284      self.$element.val(val);
3285
3286      self.$element.trigger('input').trigger('change');
3287    });
3288  };
3289
3290  SelectAdapter.prototype.bind = function (container, $container) {
3291    var self = this;
3292
3293    this.container = container;
3294
3295    container.on('select', function (params) {
3296      self.select(params.data);
3297    });
3298
3299    container.on('unselect', function (params) {
3300      self.unselect(params.data);
3301    });
3302  };
3303
3304  SelectAdapter.prototype.destroy = function () {
3305    // Remove anything added to child elements
3306    this.$element.find('*').each(function () {
3307      // Remove any custom data set by Select2
3308      Utils.RemoveData(this);
3309    });
3310  };
3311
3312  SelectAdapter.prototype.query = function (params, callback) {
3313    var data = [];
3314    var self = this;
3315
3316    var $options = this.$element.children();
3317
3318    $options.each(function () {
3319      var $option = $(this);
3320
3321      if (!$option.is('option') && !$option.is('optgroup')) {
3322        return;
3323      }
3324
3325      var option = self.item($option);
3326
3327      var matches = self.matches(params, option);
3328
3329      if (matches !== null) {
3330        data.push(matches);
3331      }
3332    });
3333
3334    callback({
3335      results: data
3336    });
3337  };
3338
3339  SelectAdapter.prototype.addOptions = function ($options) {
3340    Utils.appendMany(this.$element, $options);
3341  };
3342
3343  SelectAdapter.prototype.option = function (data) {
3344    var option;
3345
3346    if (data.children) {
3347      option = document.createElement('optgroup');
3348      option.label = data.text;
3349    } else {
3350      option = document.createElement('option');
3351
3352      if (option.textContent !== undefined) {
3353        option.textContent = data.text;
3354      } else {
3355        option.innerText = data.text;
3356      }
3357    }
3358
3359    if (data.id !== undefined) {
3360      option.value = data.id;
3361    }
3362
3363    if (data.disabled) {
3364      option.disabled = true;
3365    }
3366
3367    if (data.selected) {
3368      option.selected = true;
3369    }
3370
3371    if (data.title) {
3372      option.title = data.title;
3373    }
3374
3375    var $option = $(option);
3376
3377    var normalizedData = this._normalizeItem(data);
3378    normalizedData.element = option;
3379
3380    // Override the option's data with the combined data
3381    Utils.StoreData(option, 'data', normalizedData);
3382
3383    return $option;
3384  };
3385
3386  SelectAdapter.prototype.item = function ($option) {
3387    var data = {};
3388
3389    data = Utils.GetData($option[0], 'data');
3390
3391    if (data != null) {
3392      return data;
3393    }
3394
3395    if ($option.is('option')) {
3396      data = {
3397        id: $option.val(),
3398        text: $option.text(),
3399        disabled: $option.prop('disabled'),
3400        selected: $option.prop('selected'),
3401        title: $option.prop('title')
3402      };
3403    } else if ($option.is('optgroup')) {
3404      data = {
3405        text: $option.prop('label'),
3406        children: [],
3407        title: $option.prop('title')
3408      };
3409
3410      var $children = $option.children('option');
3411      var children = [];
3412
3413      for (var c = 0; c < $children.length; c++) {
3414        var $child = $($children[c]);
3415
3416        var child = this.item($child);
3417
3418        children.push(child);
3419      }
3420
3421      data.children = children;
3422    }
3423
3424    data = this._normalizeItem(data);
3425    data.element = $option[0];
3426
3427    Utils.StoreData($option[0], 'data', data);
3428
3429    return data;
3430  };
3431
3432  SelectAdapter.prototype._normalizeItem = function (item) {
3433    if (item !== Object(item)) {
3434      item = {
3435        id: item,
3436        text: item
3437      };
3438    }
3439
3440    item = $.extend({}, {
3441      text: ''
3442    }, item);
3443
3444    var defaults = {
3445      selected: false,
3446      disabled: false
3447    };
3448
3449    if (item.id != null) {
3450      item.id = item.id.toString();
3451    }
3452
3453    if (item.text != null) {
3454      item.text = item.text.toString();
3455    }
3456
3457    if (item._resultId == null && item.id && this.container != null) {
3458      item._resultId = this.generateResultId(this.container, item);
3459    }
3460
3461    return $.extend({}, defaults, item);
3462  };
3463
3464  SelectAdapter.prototype.matches = function (params, data) {
3465    var matcher = this.options.get('matcher');
3466
3467    return matcher(params, data);
3468  };
3469
3470  return SelectAdapter;
3471});
3472
3473S2.define('select2/data/array',[
3474  './select',
3475  '../utils',
3476  'jquery'
3477], function (SelectAdapter, Utils, $) {
3478  function ArrayAdapter ($element, options) {
3479    this._dataToConvert = options.get('data') || [];
3480
3481    ArrayAdapter.__super__.constructor.call(this, $element, options);
3482  }
3483
3484  Utils.Extend(ArrayAdapter, SelectAdapter);
3485
3486  ArrayAdapter.prototype.bind = function (container, $container) {
3487    ArrayAdapter.__super__.bind.call(this, container, $container);
3488
3489    this.addOptions(this.convertToOptions(this._dataToConvert));
3490  };
3491
3492  ArrayAdapter.prototype.select = function (data) {
3493    var $option = this.$element.find('option').filter(function (i, elm) {
3494      return elm.value == data.id.toString();
3495    });
3496
3497    if ($option.length === 0) {
3498      $option = this.option(data);
3499
3500      this.addOptions($option);
3501    }
3502
3503    ArrayAdapter.__super__.select.call(this, data);
3504  };
3505
3506  ArrayAdapter.prototype.convertToOptions = function (data) {
3507    var self = this;
3508
3509    var $existing = this.$element.find('option');
3510    var existingIds = $existing.map(function () {
3511      return self.item($(this)).id;
3512    }).get();
3513
3514    var $options = [];
3515
3516    // Filter out all items except for the one passed in the argument
3517    function onlyItem (item) {
3518      return function () {
3519        return $(this).val() == item.id;
3520      };
3521    }
3522
3523    for (var d = 0; d < data.length; d++) {
3524      var item = this._normalizeItem(data[d]);
3525
3526      // Skip items which were pre-loaded, only merge the data
3527      if ($.inArray(item.id, existingIds) >= 0) {
3528        var $existingOption = $existing.filter(onlyItem(item));
3529
3530        var existingData = this.item($existingOption);
3531        var newData = $.extend(true, {}, item, existingData);
3532
3533        var $newOption = this.option(newData);
3534
3535        $existingOption.replaceWith($newOption);
3536
3537        continue;
3538      }
3539
3540      var $option = this.option(item);
3541
3542      if (item.children) {
3543        var $children = this.convertToOptions(item.children);
3544
3545        Utils.appendMany($option, $children);
3546      }
3547
3548      $options.push($option);
3549    }
3550
3551    return $options;
3552  };
3553
3554  return ArrayAdapter;
3555});
3556
3557S2.define('select2/data/ajax',[
3558  './array',
3559  '../utils',
3560  'jquery'
3561], function (ArrayAdapter, Utils, $) {
3562  function AjaxAdapter ($element, options) {
3563    this.ajaxOptions = this._applyDefaults(options.get('ajax'));
3564
3565    if (this.ajaxOptions.processResults != null) {
3566      this.processResults = this.ajaxOptions.processResults;
3567    }
3568
3569    AjaxAdapter.__super__.constructor.call(this, $element, options);
3570  }
3571
3572  Utils.Extend(AjaxAdapter, ArrayAdapter);
3573
3574  AjaxAdapter.prototype._applyDefaults = function (options) {
3575    var defaults = {
3576      data: function (params) {
3577        return $.extend({}, params, {
3578          q: params.term
3579        });
3580      },
3581      transport: function (params, success, failure) {
3582        var $request = $.ajax(params);
3583
3584        $request.then(success);
3585        $request.fail(failure);
3586
3587        return $request;
3588      }
3589    };
3590
3591    return $.extend({}, defaults, options, true);
3592  };
3593
3594  AjaxAdapter.prototype.processResults = function (results) {
3595    return results;
3596  };
3597
3598  AjaxAdapter.prototype.query = function (params, callback) {
3599    var matches = [];
3600    var self = this;
3601
3602    if (this._request != null) {
3603      // JSONP requests cannot always be aborted
3604      if ($.isFunction(this._request.abort)) {
3605        this._request.abort();
3606      }
3607
3608      this._request = null;
3609    }
3610
3611    var options = $.extend({
3612      type: 'GET'
3613    }, this.ajaxOptions);
3614
3615    if (typeof options.url === 'function') {
3616      options.url = options.url.call(this.$element, params);
3617    }
3618
3619    if (typeof options.data === 'function') {
3620      options.data = options.data.call(this.$element, params);
3621    }
3622
3623    function request () {
3624      var $request = options.transport(options, function (data) {
3625        var results = self.processResults(data, params);
3626
3627        if (self.options.get('debug') && window.console && console.error) {
3628          // Check to make sure that the response included a `results` key.
3629          if (!results || !results.results || !$.isArray(results.results)) {
3630            console.error(
3631              'Select2: The AJAX results did not return an array in the ' +
3632              '`results` key of the response.'
3633            );
3634          }
3635        }
3636
3637        callback(results);
3638      }, function () {
3639        // Attempt to detect if a request was aborted
3640        // Only works if the transport exposes a status property
3641        if ('status' in $request &&
3642            ($request.status === 0 || $request.status === '0')) {
3643          return;
3644        }
3645
3646        self.trigger('results:message', {
3647          message: 'errorLoading'
3648        });
3649      });
3650
3651      self._request = $request;
3652    }
3653
3654    if (this.ajaxOptions.delay && params.term != null) {
3655      if (this._queryTimeout) {
3656        window.clearTimeout(this._queryTimeout);
3657      }
3658
3659      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
3660    } else {
3661      request();
3662    }
3663  };
3664
3665  return AjaxAdapter;
3666});
3667
3668S2.define('select2/data/tags',[
3669  'jquery'
3670], function ($) {
3671  function Tags (decorated, $element, options) {
3672    var tags = options.get('tags');
3673
3674    var createTag = options.get('createTag');
3675
3676    if (createTag !== undefined) {
3677      this.createTag = createTag;
3678    }
3679
3680    var insertTag = options.get('insertTag');
3681
3682    if (insertTag !== undefined) {
3683        this.insertTag = insertTag;
3684    }
3685
3686    decorated.call(this, $element, options);
3687
3688    if ($.isArray(tags)) {
3689      for (var t = 0; t < tags.length; t++) {
3690        var tag = tags[t];
3691        var item = this._normalizeItem(tag);
3692
3693        var $option = this.option(item);
3694
3695        this.$element.append($option);
3696      }
3697    }
3698  }
3699
3700  Tags.prototype.query = function (decorated, params, callback) {
3701    var self = this;
3702
3703    this._removeOldTags();
3704
3705    if (params.term == null || params.page != null) {
3706      decorated.call(this, params, callback);
3707      return;
3708    }
3709
3710    function wrapper (obj, child) {
3711      var data = obj.results;
3712
3713      for (var i = 0; i < data.length; i++) {
3714        var option = data[i];
3715
3716        var checkChildren = (
3717          option.children != null &&
3718          !wrapper({
3719            results: option.children
3720          }, true)
3721        );
3722
3723        var optionText = (option.text || '').toUpperCase();
3724        var paramsTerm = (params.term || '').toUpperCase();
3725
3726        var checkText = optionText === paramsTerm;
3727
3728        if (checkText || checkChildren) {
3729          if (child) {
3730            return false;
3731          }
3732
3733          obj.data = data;
3734          callback(obj);
3735
3736          return;
3737        }
3738      }
3739
3740      if (child) {
3741        return true;
3742      }
3743
3744      var tag = self.createTag(params);
3745
3746      if (tag != null) {
3747        var $option = self.option(tag);
3748        $option.attr('data-select2-tag', true);
3749
3750        self.addOptions([$option]);
3751
3752        self.insertTag(data, tag);
3753      }
3754
3755      obj.results = data;
3756
3757      callback(obj);
3758    }
3759
3760    decorated.call(this, params, wrapper);
3761  };
3762
3763  Tags.prototype.createTag = function (decorated, params) {
3764    var term = $.trim(params.term);
3765
3766    if (term === '') {
3767      return null;
3768    }
3769
3770    return {
3771      id: term,
3772      text: term
3773    };
3774  };
3775
3776  Tags.prototype.insertTag = function (_, data, tag) {
3777    data.unshift(tag);
3778  };
3779
3780  Tags.prototype._removeOldTags = function (_) {
3781    var $options = this.$element.find('option[data-select2-tag]');
3782
3783    $options.each(function () {
3784      if (this.selected) {
3785        return;
3786      }
3787
3788      $(this).remove();
3789    });
3790  };
3791
3792  return Tags;
3793});
3794
3795S2.define('select2/data/tokenizer',[
3796  'jquery'
3797], function ($) {
3798  function Tokenizer (decorated, $element, options) {
3799    var tokenizer = options.get('tokenizer');
3800
3801    if (tokenizer !== undefined) {
3802      this.tokenizer = tokenizer;
3803    }
3804
3805    decorated.call(this, $element, options);
3806  }
3807
3808  Tokenizer.prototype.bind = function (decorated, container, $container) {
3809    decorated.call(this, container, $container);
3810
3811    this.$search =  container.dropdown.$search || container.selection.$search ||
3812      $container.find('.select2-search__field');
3813  };
3814
3815  Tokenizer.prototype.query = function (decorated, params, callback) {
3816    var self = this;
3817
3818    function createAndSelect (data) {
3819      // Normalize the data object so we can use it for checks
3820      var item = self._normalizeItem(data);
3821
3822      // Check if the data object already exists as a tag
3823      // Select it if it doesn't
3824      var $existingOptions = self.$element.find('option').filter(function () {
3825        return $(this).val() === item.id;
3826      });
3827
3828      // If an existing option wasn't found for it, create the option
3829      if (!$existingOptions.length) {
3830        var $option = self.option(item);
3831        $option.attr('data-select2-tag', true);
3832
3833        self._removeOldTags();
3834        self.addOptions([$option]);
3835      }
3836
3837      // Select the item, now that we know there is an option for it
3838      select(item);
3839    }
3840
3841    function select (data) {
3842      self.trigger('select', {
3843        data: data
3844      });
3845    }
3846
3847    params.term = params.term || '';
3848
3849    var tokenData = this.tokenizer(params, this.options, createAndSelect);
3850
3851    if (tokenData.term !== params.term) {
3852      // Replace the search term if we have the search box
3853      if (this.$search.length) {
3854        this.$search.val(tokenData.term);
3855        this.$search.trigger('focus');
3856      }
3857
3858      params.term = tokenData.term;
3859    }
3860
3861    decorated.call(this, params, callback);
3862  };
3863
3864  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {
3865    var separators = options.get('tokenSeparators') || [];
3866    var term = params.term;
3867    var i = 0;
3868
3869    var createTag = this.createTag || function (params) {
3870      return {
3871        id: params.term,
3872        text: params.term
3873      };
3874    };
3875
3876    while (i < term.length) {
3877      var termChar = term[i];
3878
3879      if ($.inArray(termChar, separators) === -1) {
3880        i++;
3881
3882        continue;
3883      }
3884
3885      var part = term.substr(0, i);
3886      var partParams = $.extend({}, params, {
3887        term: part
3888      });
3889
3890      var data = createTag(partParams);
3891
3892      if (data == null) {
3893        i++;
3894        continue;
3895      }
3896
3897      callback(data);
3898
3899      // Reset the term to not include the tokenized portion
3900      term = term.substr(i + 1) || '';
3901      i = 0;
3902    }
3903
3904    return {
3905      term: term
3906    };
3907  };
3908
3909  return Tokenizer;
3910});
3911
3912S2.define('select2/data/minimumInputLength',[
3913
3914], function () {
3915  function MinimumInputLength (decorated, $e, options) {
3916    this.minimumInputLength = options.get('minimumInputLength');
3917
3918    decorated.call(this, $e, options);
3919  }
3920
3921  MinimumInputLength.prototype.query = function (decorated, params, callback) {
3922    params.term = params.term || '';
3923
3924    if (params.term.length < this.minimumInputLength) {
3925      this.trigger('results:message', {
3926        message: 'inputTooShort',
3927        args: {
3928          minimum: this.minimumInputLength,
3929          input: params.term,
3930          params: params
3931        }
3932      });
3933
3934      return;
3935    }
3936
3937    decorated.call(this, params, callback);
3938  };
3939
3940  return MinimumInputLength;
3941});
3942
3943S2.define('select2/data/maximumInputLength',[
3944
3945], function () {
3946  function MaximumInputLength (decorated, $e, options) {
3947    this.maximumInputLength = options.get('maximumInputLength');
3948
3949    decorated.call(this, $e, options);
3950  }
3951
3952  MaximumInputLength.prototype.query = function (decorated, params, callback) {
3953    params.term = params.term || '';
3954
3955    if (this.maximumInputLength > 0 &&
3956        params.term.length > this.maximumInputLength) {
3957      this.trigger('results:message', {
3958        message: 'inputTooLong',
3959        args: {
3960          maximum: this.maximumInputLength,
3961          input: params.term,
3962          params: params
3963        }
3964      });
3965
3966      return;
3967    }
3968
3969    decorated.call(this, params, callback);
3970  };
3971
3972  return MaximumInputLength;
3973});
3974
3975S2.define('select2/data/maximumSelectionLength',[
3976
3977], function (){
3978  function MaximumSelectionLength (decorated, $e, options) {
3979    this.maximumSelectionLength = options.get('maximumSelectionLength');
3980
3981    decorated.call(this, $e, options);
3982  }
3983
3984  MaximumSelectionLength.prototype.bind =
3985    function (decorated, container, $container) {
3986      var self = this;
3987
3988      decorated.call(this, container, $container);
3989
3990      container.on('select', function () {
3991        self._checkIfMaximumSelected();
3992      });
3993  };
3994
3995  MaximumSelectionLength.prototype.query =
3996    function (decorated, params, callback) {
3997      var self = this;
3998
3999      this._checkIfMaximumSelected(function () {
4000        decorated.call(self, params, callback);
4001      });
4002  };
4003
4004  MaximumSelectionLength.prototype._checkIfMaximumSelected =
4005    function (_, successCallback) {
4006      var self = this;
4007
4008      this.current(function (currentData) {
4009        var count = currentData != null ? currentData.length : 0;
4010        if (self.maximumSelectionLength > 0 &&
4011          count >= self.maximumSelectionLength) {
4012          self.trigger('results:message', {
4013            message: 'maximumSelected',
4014            args: {
4015              maximum: self.maximumSelectionLength
4016            }
4017          });
4018          return;
4019        }
4020
4021        if (successCallback) {
4022          successCallback();
4023        }
4024      });
4025  };
4026
4027  return MaximumSelectionLength;
4028});
4029
4030S2.define('select2/dropdown',[
4031  'jquery',
4032  './utils'
4033], function ($, Utils) {
4034  function Dropdown ($element, options) {
4035    this.$element = $element;
4036    this.options = options;
4037
4038    Dropdown.__super__.constructor.call(this);
4039  }
4040
4041  Utils.Extend(Dropdown, Utils.Observable);
4042
4043  Dropdown.prototype.render = function () {
4044    var $dropdown = $(
4045      '<span class="select2-dropdown">' +
4046        '<span class="select2-results"></span>' +
4047      '</span>'
4048    );
4049
4050    $dropdown.attr('dir', this.options.get('dir'));
4051
4052    this.$dropdown = $dropdown;
4053
4054    return $dropdown;
4055  };
4056
4057  Dropdown.prototype.bind = function () {
4058    // Should be implemented in subclasses
4059  };
4060
4061  Dropdown.prototype.position = function ($dropdown, $container) {
4062    // Should be implemented in subclasses
4063  };
4064
4065  Dropdown.prototype.destroy = function () {
4066    // Remove the dropdown from the DOM
4067    this.$dropdown.remove();
4068  };
4069
4070  return Dropdown;
4071});
4072
4073S2.define('select2/dropdown/search',[
4074  'jquery',
4075  '../utils'
4076], function ($, Utils) {
4077  function Search () { }
4078
4079  Search.prototype.render = function (decorated) {
4080    var $rendered = decorated.call(this);
4081
4082    var $search = $(
4083      '<span class="select2-search select2-search--dropdown">' +
4084        '<input class="select2-search__field" type="search" tabindex="-1"' +
4085        ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
4086        ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
4087      '</span>'
4088    );
4089
4090    this.$searchContainer = $search;
4091    this.$search = $search.find('input');
4092
4093    $rendered.prepend($search);
4094
4095    return $rendered;
4096  };
4097
4098  Search.prototype.bind = function (decorated, container, $container) {
4099    var self = this;
4100
4101    var resultsId = container.id + '-results';
4102
4103    decorated.call(this, container, $container);
4104
4105    this.$search.on('keydown', function (evt) {
4106      self.trigger('keypress', evt);
4107
4108      self._keyUpPrevented = evt.isDefaultPrevented();
4109    });
4110
4111    // Workaround for browsers which do not support the `input` event
4112    // This will prevent double-triggering of events for browsers which support
4113    // both the `keyup` and `input` events.
4114    this.$search.on('input', function (evt) {
4115      // Unbind the duplicated `keyup` event
4116      $(this).off('keyup');
4117    });
4118
4119    this.$search.on('keyup input', function (evt) {
4120      self.handleSearch(evt);
4121    });
4122
4123    container.on('open', function () {
4124      self.$search.attr('tabindex', 0);
4125      self.$search.attr('aria-controls', resultsId);
4126
4127      self.$search.trigger('focus');
4128
4129      window.setTimeout(function () {
4130        self.$search.trigger('focus');
4131      }, 0);
4132    });
4133
4134    container.on('close', function () {
4135      self.$search.attr('tabindex', -1);
4136      self.$search.removeAttr('aria-controls');
4137      self.$search.removeAttr('aria-activedescendant');
4138
4139      self.$search.val('');
4140      self.$search.trigger('blur');
4141    });
4142
4143    container.on('focus', function () {
4144      if (!container.isOpen()) {
4145        self.$search.trigger('focus');
4146      }
4147    });
4148
4149    container.on('results:all', function (params) {
4150      if (params.query.term == null || params.query.term === '') {
4151        var showSearch = self.showSearch(params);
4152
4153        if (showSearch) {
4154          self.$searchContainer.removeClass('select2-search--hide');
4155        } else {
4156          self.$searchContainer.addClass('select2-search--hide');
4157        }
4158      }
4159    });
4160
4161    container.on('results:focus', function (params) {
4162      if (params.data._resultId) {
4163        self.$search.attr('aria-activedescendant', params.data._resultId);
4164      } else {
4165        self.$search.removeAttr('aria-activedescendant');
4166      }
4167    });
4168  };
4169
4170  Search.prototype.handleSearch = function (evt) {
4171    if (!this._keyUpPrevented) {
4172      var input = this.$search.val();
4173
4174      this.trigger('query', {
4175        term: input
4176      });
4177    }
4178
4179    this._keyUpPrevented = false;
vendor: 18,179 bytes, lines 4180-4905
4180  };
4181
4182  Search.prototype.showSearch = function (_, params) {
4183    return true;
4184  };
4185
4186  return Search;
4187});
4188
4189S2.define('select2/dropdown/hidePlaceholder',[
4190
4191], function () {
4192  function HidePlaceholder (decorated, $element, options, dataAdapter) {
4193    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
4194
4195    decorated.call(this, $element, options, dataAdapter);
4196  }
4197
4198  HidePlaceholder.prototype.append = function (decorated, data) {
4199    data.results = this.removePlaceholder(data.results);
4200
4201    decorated.call(this, data);
4202  };
4203
4204  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {
4205    if (typeof placeholder === 'string') {
4206      placeholder = {
4207        id: '',
4208        text: placeholder
4209      };
4210    }
4211
4212    return placeholder;
4213  };
4214
4215  HidePlaceholder.prototype.removePlaceholder = function (_, data) {
4216    var modifiedData = data.slice(0);
4217
4218    for (var d = data.length - 1; d >= 0; d--) {
4219      var item = data[d];
4220
4221      if (this.placeholder.id === item.id) {
4222        modifiedData.splice(d, 1);
4223      }
4224    }
4225
4226    return modifiedData;
4227  };
4228
4229  return HidePlaceholder;
4230});
4231
4232S2.define('select2/dropdown/infiniteScroll',[
4233  'jquery'
4234], function ($) {
4235  function InfiniteScroll (decorated, $element, options, dataAdapter) {
4236    this.lastParams = {};
4237
4238    decorated.call(this, $element, options, dataAdapter);
4239
4240    this.$loadingMore = this.createLoadingMore();
4241    this.loading = false;
4242  }
4243
4244  InfiniteScroll.prototype.append = function (decorated, data) {
4245    this.$loadingMore.remove();
4246    this.loading = false;
4247
4248    decorated.call(this, data);
4249
4250    if (this.showLoadingMore(data)) {
4251      this.$results.append(this.$loadingMore);
4252      this.loadMoreIfNeeded();
4253    }
4254  };
4255
4256  InfiniteScroll.prototype.bind = function (decorated, container, $container) {
4257    var self = this;
4258
4259    decorated.call(this, container, $container);
4260
4261    container.on('query', function (params) {
4262      self.lastParams = params;
4263      self.loading = true;
4264    });
4265
4266    container.on('query:append', function (params) {
4267      self.lastParams = params;
4268      self.loading = true;
4269    });
4270
4271    this.$results.on('scroll', this.loadMoreIfNeeded.bind(this));
4272  };
4273
4274  InfiniteScroll.prototype.loadMoreIfNeeded = function () {
4275    var isLoadMoreVisible = $.contains(
4276      document.documentElement,
4277      this.$loadingMore[0]
4278    );
4279
4280    if (this.loading || !isLoadMoreVisible) {
4281      return;
4282    }
4283
4284    var currentOffset = this.$results.offset().top +
4285      this.$results.outerHeight(false);
4286    var loadingMoreOffset = this.$loadingMore.offset().top +
4287      this.$loadingMore.outerHeight(false);
4288
4289    if (currentOffset + 50 >= loadingMoreOffset) {
4290      this.loadMore();
4291    }
4292  };
4293
4294  InfiniteScroll.prototype.loadMore = function () {
4295    this.loading = true;
4296
4297    var params = $.extend({}, {page: 1}, this.lastParams);
4298
4299    params.page++;
4300
4301    this.trigger('query:append', params);
4302  };
4303
4304  InfiniteScroll.prototype.showLoadingMore = function (_, data) {
4305    return data.pagination && data.pagination.more;
4306  };
4307
4308  InfiniteScroll.prototype.createLoadingMore = function () {
4309    var $option = $(
4310      '<li ' +
4311      'class="select2-results__option select2-results__option--load-more"' +
4312      'role="option" aria-disabled="true"></li>'
4313    );
4314
4315    var message = this.options.get('translations').get('loadingMore');
4316
4317    $option.html(message(this.lastParams));
4318
4319    return $option;
4320  };
4321
4322  return InfiniteScroll;
4323});
4324
4325S2.define('select2/dropdown/attachBody',[
4326  'jquery',
4327  '../utils'
4328], function ($, Utils) {
4329  function AttachBody (decorated, $element, options) {
4330    this.$dropdownParent = $(options.get('dropdownParent') || document.body);
4331
4332    decorated.call(this, $element, options);
4333  }
4334
4335  AttachBody.prototype.bind = function (decorated, container, $container) {
4336    var self = this;
4337
4338    decorated.call(this, container, $container);
4339
4340    container.on('open', function () {
4341      self._showDropdown();
4342      self._attachPositioningHandler(container);
4343
4344      // Must bind after the results handlers to ensure correct sizing
4345      self._bindContainerResultHandlers(container);
4346    });
4347
4348    container.on('close', function () {
4349      self._hideDropdown();
4350      self._detachPositioningHandler(container);
4351    });
4352
4353    this.$dropdownContainer.on('mousedown', function (evt) {
4354      evt.stopPropagation();
4355    });
4356  };
4357
4358  AttachBody.prototype.destroy = function (decorated) {
4359    decorated.call(this);
4360
4361    this.$dropdownContainer.remove();
4362  };
4363
4364  AttachBody.prototype.position = function (decorated, $dropdown, $container) {
4365    // Clone all of the container classes
4366    $dropdown.attr('class', $container.attr('class'));
4367
4368    $dropdown.removeClass('select2');
4369    $dropdown.addClass('select2-container--open');
4370
4371    $dropdown.css({
4372      position: 'absolute',
4373      top: -999999
4374    });
4375
4376    this.$container = $container;
4377  };
4378
4379  AttachBody.prototype.render = function (decorated) {
4380    var $container = $('<span></span>');
4381
4382    var $dropdown = decorated.call(this);
4383    $container.append($dropdown);
4384
4385    this.$dropdownContainer = $container;
4386
4387    return $container;
4388  };
4389
4390  AttachBody.prototype._hideDropdown = function (decorated) {
4391    this.$dropdownContainer.detach();
4392  };
4393
4394  AttachBody.prototype._bindContainerResultHandlers =
4395      function (decorated, container) {
4396
4397    // These should only be bound once
4398    if (this._containerResultsHandlersBound) {
4399      return;
4400    }
4401
4402    var self = this;
4403
4404    container.on('results:all', function () {
4405      self._positionDropdown();
4406      self._resizeDropdown();
4407    });
4408
4409    container.on('results:append', function () {
4410      self._positionDropdown();
4411      self._resizeDropdown();
4412    });
4413
4414    container.on('results:message', function () {
4415      self._positionDropdown();
4416      self._resizeDropdown();
4417    });
4418
4419    container.on('select', function () {
4420      self._positionDropdown();
4421      self._resizeDropdown();
4422    });
4423
4424    container.on('unselect', function () {
4425      self._positionDropdown();
4426      self._resizeDropdown();
4427    });
4428
4429    this._containerResultsHandlersBound = true;
4430  };
4431
4432  AttachBody.prototype._attachPositioningHandler =
4433      function (decorated, container) {
4434    var self = this;
4435
4436    var scrollEvent = 'scroll.select2.' + container.id;
4437    var resizeEvent = 'resize.select2.' + container.id;
4438    var orientationEvent = 'orientationchange.select2.' + container.id;
4439
4440    var $watchers = this.$container.parents().filter(Utils.hasScroll);
4441    $watchers.each(function () {
4442      Utils.StoreData(this, 'select2-scroll-position', {
4443        x: $(this).scrollLeft(),
4444        y: $(this).scrollTop()
4445      });
4446    });
4447
4448    $watchers.on(scrollEvent, function (ev) {
4449      var position = Utils.GetData(this, 'select2-scroll-position');
4450      $(this).scrollTop(position.y);
4451    });
4452
4453    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,
4454      function (e) {
4455      self._positionDropdown();
4456      self._resizeDropdown();
4457    });
4458  };
4459
4460  AttachBody.prototype._detachPositioningHandler =
4461      function (decorated, container) {
4462    var scrollEvent = 'scroll.select2.' + container.id;
4463    var resizeEvent = 'resize.select2.' + container.id;
4464    var orientationEvent = 'orientationchange.select2.' + container.id;
4465
4466    var $watchers = this.$container.parents().filter(Utils.hasScroll);
4467    $watchers.off(scrollEvent);
4468
4469    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);
4470  };
4471
4472  AttachBody.prototype._positionDropdown = function () {
4473    var $window = $(window);
4474
4475    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
4476    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
4477
4478    var newDirection = null;
4479
4480    var offset = this.$container.offset();
4481
4482    offset.bottom = offset.top + this.$container.outerHeight(false);
4483
4484    var container = {
4485      height: this.$container.outerHeight(false)
4486    };
4487
4488    container.top = offset.top;
4489    container.bottom = offset.top + container.height;
4490
4491    var dropdown = {
4492      height: this.$dropdown.outerHeight(false)
4493    };
4494
4495    var viewport = {
4496      top: $window.scrollTop(),
4497      bottom: $window.scrollTop() + $window.height()
4498    };
4499
4500    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
4501    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
4502
4503    var css = {
4504      left: offset.left,
4505      top: container.bottom
4506    };
4507
4508    // Determine what the parent element is to use for calculating the offset
4509    var $offsetParent = this.$dropdownParent;
4510
4511    // For statically positioned elements, we need to get the element
4512    // that is determining the offset
4513    if ($offsetParent.css('position') === 'static') {
4514      $offsetParent = $offsetParent.offsetParent();
4515    }
4516
4517    var parentOffset = {
4518      top: 0,
4519      left: 0
4520    };
4521
4522    if (
4523      $.contains(document.body, $offsetParent[0]) ||
4524      $offsetParent[0].isConnected
4525      ) {
4526      parentOffset = $offsetParent.offset();
4527    }
4528
4529    css.top -= parentOffset.top;
4530    css.left -= parentOffset.left;
4531
4532    if (!isCurrentlyAbove && !isCurrentlyBelow) {
4533      newDirection = 'below';
4534    }
4535
4536    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
4537      newDirection = 'above';
4538    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
4539      newDirection = 'below';
4540    }
4541
4542    if (newDirection == 'above' ||
4543      (isCurrentlyAbove && newDirection !== 'below')) {
4544      css.top = container.top - parentOffset.top - dropdown.height;
4545    }
4546
4547    if (newDirection != null) {
4548      this.$dropdown
4549        .removeClass('select2-dropdown--below select2-dropdown--above')
4550        .addClass('select2-dropdown--' + newDirection);
4551      this.$container
4552        .removeClass('select2-container--below select2-container--above')
4553        .addClass('select2-container--' + newDirection);
4554    }
4555
4556    this.$dropdownContainer.css(css);
4557  };
4558
4559  AttachBody.prototype._resizeDropdown = function () {
4560    var css = {
4561      width: this.$container.outerWidth(false) + 'px'
4562    };
4563
4564    if (this.options.get('dropdownAutoWidth')) {
4565      css.minWidth = css.width;
4566      css.position = 'relative';
4567      css.width = 'auto';
4568    }
4569
4570    this.$dropdown.css(css);
4571  };
4572
4573  AttachBody.prototype._showDropdown = function (decorated) {
4574    this.$dropdownContainer.appendTo(this.$dropdownParent);
4575
4576    this._positionDropdown();
4577    this._resizeDropdown();
4578  };
4579
4580  return AttachBody;
4581});
4582
4583S2.define('select2/dropdown/minimumResultsForSearch',[
4584
4585], function () {
4586  function countResults (data) {
4587    var count = 0;
4588
4589    for (var d = 0; d < data.length; d++) {
4590      var item = data[d];
4591
4592      if (item.children) {
4593        count += countResults(item.children);
4594      } else {
4595        count++;
4596      }
4597    }
4598
4599    return count;
4600  }
4601
4602  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {
4603    this.minimumResultsForSearch = options.get('minimumResultsForSearch');
4604
4605    if (this.minimumResultsForSearch < 0) {
4606      this.minimumResultsForSearch = Infinity;
4607    }
4608
4609    decorated.call(this, $element, options, dataAdapter);
4610  }
4611
4612  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {
4613    if (countResults(params.data.results) < this.minimumResultsForSearch) {
4614      return false;
4615    }
4616
4617    return decorated.call(this, params);
4618  };
4619
4620  return MinimumResultsForSearch;
4621});
4622
4623S2.define('select2/dropdown/selectOnClose',[
4624  '../utils'
4625], function (Utils) {
4626  function SelectOnClose () { }
4627
4628  SelectOnClose.prototype.bind = function (decorated, container, $container) {
4629    var self = this;
4630
4631    decorated.call(this, container, $container);
4632
4633    container.on('close', function (params) {
4634      self._handleSelectOnClose(params);
4635    });
4636  };
4637
4638  SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
4639    if (params && params.originalSelect2Event != null) {
4640      var event = params.originalSelect2Event;
4641
4642      // Don't select an item if the close event was triggered from a select or
4643      // unselect event
4644      if (event._type === 'select' || event._type === 'unselect') {
4645        return;
4646      }
4647    }
4648
4649    var $highlightedResults = this.getHighlightedResults();
4650
4651    // Only select highlighted results
4652    if ($highlightedResults.length < 1) {
4653      return;
4654    }
4655
4656    var data = Utils.GetData($highlightedResults[0], 'data');
4657
4658    // Don't re-select already selected resulte
4659    if (
4660      (data.element != null && data.element.selected) ||
4661      (data.element == null && data.selected)
4662    ) {
4663      return;
4664    }
4665
4666    this.trigger('select', {
4667        data: data
4668    });
4669  };
4670
4671  return SelectOnClose;
4672});
4673
4674S2.define('select2/dropdown/closeOnSelect',[
4675
4676], function () {
4677  function CloseOnSelect () { }
4678
4679  CloseOnSelect.prototype.bind = function (decorated, container, $container) {
4680    var self = this;
4681
4682    decorated.call(this, container, $container);
4683
4684    container.on('select', function (evt) {
4685      self._selectTriggered(evt);
4686    });
4687
4688    container.on('unselect', function (evt) {
4689      self._selectTriggered(evt);
4690    });
4691  };
4692
4693  CloseOnSelect.prototype._selectTriggered = function (_, evt) {
4694    var originalEvent = evt.originalEvent;
4695
4696    // Don't close if the control key is being held
4697    if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) {
4698      return;
4699    }
4700
4701    this.trigger('close', {
4702      originalEvent: originalEvent,
4703      originalSelect2Event: evt
4704    });
4705  };
4706
4707  return CloseOnSelect;
4708});
4709
4710S2.define('select2/i18n/en',[],function () {
4711  // English
4712  return {
4713    errorLoading: function () {
4714      return 'The results could not be loaded.';
4715    },
4716    inputTooLong: function (args) {
4717      var overChars = args.input.length - args.maximum;
4718
4719      var message = 'Please delete ' + overChars + ' character';
4720
4721      if (overChars != 1) {
4722        message += 's';
4723      }
4724
4725      return message;
4726    },
4727    inputTooShort: function (args) {
4728      var remainingChars = args.minimum - args.input.length;
4729
4730      var message = 'Please enter ' + remainingChars + ' or more characters';
4731
4732      return message;
4733    },
4734    loadingMore: function () {
4735      return 'Loading more results…';
4736    },
4737    maximumSelected: function (args) {
4738      var message = 'You can only select ' + args.maximum + ' item';
4739
4740      if (args.maximum != 1) {
4741        message += 's';
4742      }
4743
4744      return message;
4745    },
4746    noResults: function () {
4747      return 'No results found';
4748    },
4749    searching: function () {
4750      return 'Searching…';
4751    },
4752    removeAllItems: function () {
4753      return 'Remove all items';
4754    }
4755  };
4756});
4757
4758S2.define('select2/defaults',[
4759  'jquery',
4760  'require',
4761
4762  './results',
4763
4764  './selection/single',
4765  './selection/multiple',
4766  './selection/placeholder',
4767  './selection/allowClear',
4768  './selection/search',
4769  './selection/eventRelay',
4770
4771  './utils',
4772  './translation',
4773  './diacritics',
4774
4775  './data/select',
4776  './data/array',
4777  './data/ajax',
4778  './data/tags',
4779  './data/tokenizer',
4780  './data/minimumInputLength',
4781  './data/maximumInputLength',
4782  './data/maximumSelectionLength',
4783
4784  './dropdown',
4785  './dropdown/search',
4786  './dropdown/hidePlaceholder',
4787  './dropdown/infiniteScroll',
4788  './dropdown/attachBody',
4789  './dropdown/minimumResultsForSearch',
4790  './dropdown/selectOnClose',
4791  './dropdown/closeOnSelect',
4792
4793  './i18n/en'
4794], function ($, require,
4795
4796             ResultsList,
4797
4798             SingleSelection, MultipleSelection, Placeholder, AllowClear,
4799             SelectionSearch, EventRelay,
4800
4801             Utils, Translation, DIACRITICS,
4802
4803             SelectData, ArrayData, AjaxData, Tags, Tokenizer,
4804             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,
4805
4806             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,
4807             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,
4808
4809             EnglishTranslation) {
4810  function Defaults () {
4811    this.reset();
4812  }
4813
4814  Defaults.prototype.apply = function (options) {
4815    options = $.extend(true, {}, this.defaults, options);
4816
4817    if (options.dataAdapter == null) {
4818      if (options.ajax != null) {
4819        options.dataAdapter = AjaxData;
4820      } else if (options.data != null) {
4821        options.dataAdapter = ArrayData;
4822      } else {
4823        options.dataAdapter = SelectData;
4824      }
4825
4826      if (options.minimumInputLength > 0) {
4827        options.dataAdapter = Utils.Decorate(
4828          options.dataAdapter,
4829          MinimumInputLength
4830        );
4831      }
4832
4833      if (options.maximumInputLength > 0) {
4834        options.dataAdapter = Utils.Decorate(
4835          options.dataAdapter,
4836          MaximumInputLength
4837        );
4838      }
4839
4840      if (options.maximumSelectionLength > 0) {
4841        options.dataAdapter = Utils.Decorate(
4842          options.dataAdapter,
4843          MaximumSelectionLength
4844        );
4845      }
4846
4847      if (options.tags) {
4848        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
4849      }
4850
4851      if (options.tokenSeparators != null || options.tokenizer != null) {
4852        options.dataAdapter = Utils.Decorate(
4853          options.dataAdapter,
4854          Tokenizer
4855        );
4856      }
4857
4858      if (options.query != null) {
4859        var Query = require(options.amdBase + 'compat/query');
4860
4861        options.dataAdapter = Utils.Decorate(
4862          options.dataAdapter,
4863          Query
4864        );
4865      }
4866
4867      if (options.initSelection != null) {
4868        var InitSelection = require(options.amdBase + 'compat/initSelection');
4869
4870        options.dataAdapter = Utils.Decorate(
4871          options.dataAdapter,
4872          InitSelection
4873        );
4874      }
4875    }
4876
4877    if (options.resultsAdapter == null) {
4878      options.resultsAdapter = ResultsList;
4879
4880      if (options.ajax != null) {
4881        options.resultsAdapter = Utils.Decorate(
4882          options.resultsAdapter,
4883          InfiniteScroll
4884        );
4885      }
4886
4887      if (options.placeholder != null) {
4888        options.resultsAdapter = Utils.Decorate(
4889          options.resultsAdapter,
4890          HidePlaceholder
4891        );
4892      }
4893
4894      if (options.selectOnClose) {
4895        options.resultsAdapter = Utils.Decorate(
4896          options.resultsAdapter,
4897          SelectOnClose
4898        );
4899      }
4900    }
4901
4902    if (options.dropdownAdapter == null) {
4903      if (options.multiple) {
4904        options.dropdownAdapter = Dropdown;
4905      } else {
vendor: 3,154 bytes, lines 4906-5025
4906        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);
4907
4908        options.dropdownAdapter = SearchableDropdown;
4909      }
4910
4911      if (options.minimumResultsForSearch !== 0) {
4912        options.dropdownAdapter = Utils.Decorate(
4913          options.dropdownAdapter,
4914          MinimumResultsForSearch
4915        );
4916      }
4917
4918      if (options.closeOnSelect) {
4919        options.dropdownAdapter = Utils.Decorate(
4920          options.dropdownAdapter,
4921          CloseOnSelect
4922        );
4923      }
4924
4925      if (
4926        options.dropdownCssClass != null ||
4927        options.dropdownCss != null ||
4928        options.adaptDropdownCssClass != null
4929      ) {
4930        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');
4931
4932        options.dropdownAdapter = Utils.Decorate(
4933          options.dropdownAdapter,
4934          DropdownCSS
4935        );
4936      }
4937
4938      options.dropdownAdapter = Utils.Decorate(
4939        options.dropdownAdapter,
4940        AttachBody
4941      );
4942    }
4943
4944    if (options.selectionAdapter == null) {
4945      if (options.multiple) {
4946        options.selectionAdapter = MultipleSelection;
4947      } else {
4948        options.selectionAdapter = SingleSelection;
4949      }
4950
4951      // Add the placeholder mixin if a placeholder was specified
4952      if (options.placeholder != null) {
4953        options.selectionAdapter = Utils.Decorate(
4954          options.selectionAdapter,
4955          Placeholder
4956        );
4957      }
4958
4959      if (options.allowClear) {
4960        options.selectionAdapter = Utils.Decorate(
4961          options.selectionAdapter,
4962          AllowClear
4963        );
4964      }
4965
4966      if (options.multiple) {
4967        options.selectionAdapter = Utils.Decorate(
4968          options.selectionAdapter,
4969          SelectionSearch
4970        );
4971      }
4972
4973      if (
4974        options.containerCssClass != null ||
4975        options.containerCss != null ||
4976        options.adaptContainerCssClass != null
4977      ) {
4978        var ContainerCSS = require(options.amdBase + 'compat/containerCss');
4979
4980        options.selectionAdapter = Utils.Decorate(
4981          options.selectionAdapter,
4982          ContainerCSS
4983        );
4984      }
4985
4986      options.selectionAdapter = Utils.Decorate(
4987        options.selectionAdapter,
4988        EventRelay
4989      );
4990    }
4991
4992    // If the defaults were not previously applied from an element, it is
4993    // possible for the language option to have not been resolved
4994    options.language = this._resolveLanguage(options.language);
4995
4996    // Always fall back to English since it will always be complete
4997    options.language.push('en');
4998
4999    var uniqueLanguages = [];
5000
5001    for (var l = 0; l < options.language.length; l++) {
5002      var language = options.language[l];
5003
5004      if (uniqueLanguages.indexOf(language) === -1) {
5005        uniqueLanguages.push(language);
5006      }
5007    }
5008
5009    options.language = uniqueLanguages;
5010
5011    options.translations = this._processTranslations(
5012      options.language,
5013      options.debug
5014    );
5015
5016    return options;
5017  };
5018
5019  Defaults.prototype.reset = function () {
5020    function stripDiacritics (text) {
5021      // Used 'uni range + named function' from http://jsperf.com/diacritics/18
5022      function match(a) {
5023        return DIACRITICS[a] || a;
5024      }
5025
vendor: 16,384 bytes, lines 5026-5628
5026      return text.replace(/[^\u0000-\u007E]/g, match);
5027    }
5028
5029    function matcher (params, data) {
5030      // Always return the object if there is nothing to compare
5031      if ($.trim(params.term) === '') {
5032        return data;
5033      }
5034
5035      // Do a recursive check for options with children
5036      if (data.children && data.children.length > 0) {
5037        // Clone the data object if there are children
5038        // This is required as we modify the object to remove any non-matches
5039        var match = $.extend(true, {}, data);
5040
5041        // Check each child of the option
5042        for (var c = data.children.length - 1; c >= 0; c--) {
5043          var child = data.children[c];
5044
5045          var matches = matcher(params, child);
5046
5047          // If there wasn't a match, remove the object in the array
5048          if (matches == null) {
5049            match.children.splice(c, 1);
5050          }
5051        }
5052
5053        // If any children matched, return the new object
5054        if (match.children.length > 0) {
5055          return match;
5056        }
5057
5058        // If there were no matching children, check just the plain object
5059        return matcher(params, match);
5060      }
5061
5062      var original = stripDiacritics(data.text).toUpperCase();
5063      var term = stripDiacritics(params.term).toUpperCase();
5064
5065      // Check if the text contains the term
5066      if (original.indexOf(term) > -1) {
5067        return data;
5068      }
5069
5070      // If it doesn't contain the term, don't return anything
5071      return null;
5072    }
5073
5074    this.defaults = {
5075      amdBase: './',
5076      amdLanguageBase: './i18n/',
5077      closeOnSelect: true,
5078      debug: false,
5079      dropdownAutoWidth: false,
5080      escapeMarkup: Utils.escapeMarkup,
5081      language: {},
5082      matcher: matcher,
5083      minimumInputLength: 0,
5084      maximumInputLength: 0,
5085      maximumSelectionLength: 0,
5086      minimumResultsForSearch: 0,
5087      selectOnClose: false,
5088      scrollAfterSelect: false,
5089      sorter: function (data) {
5090        return data;
5091      },
5092      templateResult: function (result) {
5093        return result.text;
5094      },
5095      templateSelection: function (selection) {
5096        return selection.text;
5097      },
5098      theme: 'default',
5099      width: 'resolve'
5100    };
5101  };
5102
5103  Defaults.prototype.applyFromElement = function (options, $element) {
5104    var optionLanguage = options.language;
5105    var defaultLanguage = this.defaults.language;
5106    var elementLanguage = $element.prop('lang');
5107    var parentLanguage = $element.closest('[lang]').prop('lang');
5108
5109    var languages = Array.prototype.concat.call(
5110      this._resolveLanguage(elementLanguage),
5111      this._resolveLanguage(optionLanguage),
5112      this._resolveLanguage(defaultLanguage),
5113      this._resolveLanguage(parentLanguage)
5114    );
5115
5116    options.language = languages;
5117
5118    return options;
5119  };
5120
5121  Defaults.prototype._resolveLanguage = function (language) {
5122    if (!language) {
5123      return [];
5124    }
5125
5126    if ($.isEmptyObject(language)) {
5127      return [];
5128    }
5129
5130    if ($.isPlainObject(language)) {
5131      return [language];
5132    }
5133
5134    var languages;
5135
5136    if (!$.isArray(language)) {
5137      languages = [language];
5138    } else {
5139      languages = language;
5140    }
5141
5142    var resolvedLanguages = [];
5143
5144    for (var l = 0; l < languages.length; l++) {
5145      resolvedLanguages.push(languages[l]);
5146
5147      if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) {
5148        // Extract the region information if it is included
5149        var languageParts = languages[l].split('-');
5150        var baseLanguage = languageParts[0];
5151
5152        resolvedLanguages.push(baseLanguage);
5153      }
5154    }
5155
5156    return resolvedLanguages;
5157  };
5158
5159  Defaults.prototype._processTranslations = function (languages, debug) {
5160    var translations = new Translation();
5161
5162    for (var l = 0; l < languages.length; l++) {
5163      var languageData = new Translation();
5164
5165      var language = languages[l];
5166
5167      if (typeof language === 'string') {
5168        try {
5169          // Try to load it with the original name
5170          languageData = Translation.loadPath(language);
5171        } catch (e) {
5172          try {
5173            // If we couldn't load it, check if it wasn't the full path
5174            language = this.defaults.amdLanguageBase + language;
5175            languageData = Translation.loadPath(language);
5176          } catch (ex) {
5177            // The translation could not be loaded at all. Sometimes this is
5178            // because of a configuration problem, other times this can be
5179            // because of how Select2 helps load all possible translation files
5180            if (debug && window.console && console.warn) {
5181              console.warn(
5182                'Select2: The language file for "' + language + '" could ' +
5183                'not be automatically loaded. A fallback will be used instead.'
5184              );
5185            }
5186          }
5187        }
5188      } else if ($.isPlainObject(language)) {
5189        languageData = new Translation(language);
5190      } else {
5191        languageData = language;
5192      }
5193
5194      translations.extend(languageData);
5195    }
5196
5197    return translations;
5198  };
5199
5200  Defaults.prototype.set = function (key, value) {
5201    var camelKey = $.camelCase(key);
5202
5203    var data = {};
5204    data[camelKey] = value;
5205
5206    var convertedData = Utils._convertData(data);
5207
5208    $.extend(true, this.defaults, convertedData);
5209  };
5210
5211  var defaults = new Defaults();
5212
5213  return defaults;
5214});
5215
5216S2.define('select2/options',[
5217  'require',
5218  'jquery',
5219  './defaults',
5220  './utils'
5221], function (require, $, Defaults, Utils) {
5222  function Options (options, $element) {
5223    this.options = options;
5224
5225    if ($element != null) {
5226      this.fromElement($element);
5227    }
5228
5229    if ($element != null) {
5230      this.options = Defaults.applyFromElement(this.options, $element);
5231    }
5232
5233    this.options = Defaults.apply(this.options);
5234
5235    if ($element && $element.is('input')) {
5236      var InputCompat = require(this.get('amdBase') + 'compat/inputData');
5237
5238      this.options.dataAdapter = Utils.Decorate(
5239        this.options.dataAdapter,
5240        InputCompat
5241      );
5242    }
5243  }
5244
5245  Options.prototype.fromElement = function ($e) {
5246    var excludedData = ['select2'];
5247
5248    if (this.options.multiple == null) {
5249      this.options.multiple = $e.prop('multiple');
5250    }
5251
5252    if (this.options.disabled == null) {
5253      this.options.disabled = $e.prop('disabled');
5254    }
5255
5256    if (this.options.dir == null) {
5257      if ($e.prop('dir')) {
5258        this.options.dir = $e.prop('dir');
5259      } else if ($e.closest('[dir]').prop('dir')) {
5260        this.options.dir = $e.closest('[dir]').prop('dir');
5261      } else {
5262        this.options.dir = 'ltr';
5263      }
5264    }
5265
5266    $e.prop('disabled', this.options.disabled);
5267    $e.prop('multiple', this.options.multiple);
5268
5269    if (Utils.GetData($e[0], 'select2Tags')) {
5270      if (this.options.debug && window.console && console.warn) {
5271        console.warn(
5272          'Select2: The `data-select2-tags` attribute has been changed to ' +
5273          'use the `data-data` and `data-tags="true"` attributes and will be ' +
5274          'removed in future versions of Select2.'
5275        );
5276      }
5277
5278      Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags'));
5279      Utils.StoreData($e[0], 'tags', true);
5280    }
5281
5282    if (Utils.GetData($e[0], 'ajaxUrl')) {
5283      if (this.options.debug && window.console && console.warn) {
5284        console.warn(
5285          'Select2: The `data-ajax-url` attribute has been changed to ' +
5286          '`data-ajax--url` and support for the old attribute will be removed' +
5287          ' in future versions of Select2.'
5288        );
5289      }
5290
5291      $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl'));
5292      Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl'));
5293    }
5294
5295    var dataset = {};
5296
5297    function upperCaseLetter(_, letter) {
5298      return letter.toUpperCase();
5299    }
5300
5301    // Pre-load all of the attributes which are prefixed with `data-`
5302    for (var attr = 0; attr < $e[0].attributes.length; attr++) {
5303      var attributeName = $e[0].attributes[attr].name;
5304      var prefix = 'data-';
5305
5306      if (attributeName.substr(0, prefix.length) == prefix) {
5307        // Get the contents of the attribute after `data-`
5308        var dataName = attributeName.substring(prefix.length);
5309
5310        // Get the data contents from the consistent source
5311        // This is more than likely the jQuery data helper
5312        var dataValue = Utils.GetData($e[0], dataName);
5313
5314        // camelCase the attribute name to match the spec
5315        var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter);
5316
5317        // Store the data attribute contents into the dataset since
5318        dataset[camelDataName] = dataValue;
5319      }
5320    }
5321
5322    // Prefer the element's `dataset` attribute if it exists
5323    // jQuery 1.x does not correctly handle data attributes with multiple dashes
5324    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
5325      dataset = $.extend(true, {}, $e[0].dataset, dataset);
5326    }
5327
5328    // Prefer our internal data cache if it exists
5329    var data = $.extend(true, {}, Utils.GetData($e[0]), dataset);
5330
5331    data = Utils._convertData(data);
5332
5333    for (var key in data) {
5334      if ($.inArray(key, excludedData) > -1) {
5335        continue;
5336      }
5337
5338      if ($.isPlainObject(this.options[key])) {
5339        $.extend(this.options[key], data[key]);
5340      } else {
5341        this.options[key] = data[key];
5342      }
5343    }
5344
5345    return this;
5346  };
5347
5348  Options.prototype.get = function (key) {
5349    return this.options[key];
5350  };
5351
5352  Options.prototype.set = function (key, val) {
5353    this.options[key] = val;
5354  };
5355
5356  return Options;
5357});
5358
5359S2.define('select2/core',[
5360  'jquery',
5361  './options',
5362  './utils',
5363  './keys'
5364], function ($, Options, Utils, KEYS) {
5365  var Select2 = function ($element, options) {
5366    if (Utils.GetData($element[0], 'select2') != null) {
5367      Utils.GetData($element[0], 'select2').destroy();
5368    }
5369
5370    this.$element = $element;
5371
5372    this.id = this._generateId($element);
5373
5374    options = options || {};
5375
5376    this.options = new Options(options, $element);
5377
5378    Select2.__super__.constructor.call(this);
5379
5380    // Set up the tabindex
5381
5382    var tabindex = $element.attr('tabindex') || 0;
5383    Utils.StoreData($element[0], 'old-tabindex', tabindex);
5384    $element.attr('tabindex', '-1');
5385
5386    // Set up containers and adapters
5387
5388    var DataAdapter = this.options.get('dataAdapter');
5389    this.dataAdapter = new DataAdapter($element, this.options);
5390
5391    var $container = this.render();
5392
5393    this._placeContainer($container);
5394
5395    var SelectionAdapter = this.options.get('selectionAdapter');
5396    this.selection = new SelectionAdapter($element, this.options);
5397    this.$selection = this.selection.render();
5398
5399    this.selection.position(this.$selection, $container);
5400
5401    var DropdownAdapter = this.options.get('dropdownAdapter');
5402    this.dropdown = new DropdownAdapter($element, this.options);
5403    this.$dropdown = this.dropdown.render();
5404
5405    this.dropdown.position(this.$dropdown, $container);
5406
5407    var ResultsAdapter = this.options.get('resultsAdapter');
5408    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);
5409    this.$results = this.results.render();
5410
5411    this.results.position(this.$results, this.$dropdown);
5412
5413    // Bind events
5414
5415    var self = this;
5416
5417    // Bind the container to all of the adapters
5418    this._bindAdapters();
5419
5420    // Register any DOM event handlers
5421    this._registerDomEvents();
5422
5423    // Register any internal event handlers
5424    this._registerDataEvents();
5425    this._registerSelectionEvents();
5426    this._registerDropdownEvents();
5427    this._registerResultsEvents();
5428    this._registerEvents();
5429
5430    // Set the initial state
5431    this.dataAdapter.current(function (initialData) {
5432      self.trigger('selection:update', {
5433        data: initialData
5434      });
5435    });
5436
5437    // Hide the original select
5438    $element.addClass('select2-hidden-accessible');
5439    $element.attr('aria-hidden', 'true');
5440
5441    // Synchronize any monitored attributes
5442    this._syncAttributes();
5443
5444    Utils.StoreData($element[0], 'select2', this);
5445
5446    // Ensure backwards compatibility with $element.data('select2').
5447    $element.data('select2', this);
5448  };
5449
5450  Utils.Extend(Select2, Utils.Observable);
5451
5452  Select2.prototype._generateId = function ($element) {
5453    var id = '';
5454
5455    if ($element.attr('id') != null) {
5456      id = $element.attr('id');
5457    } else if ($element.attr('name') != null) {
5458      id = $element.attr('name') + '-' + Utils.generateChars(2);
5459    } else {
5460      id = Utils.generateChars(4);
5461    }
5462
5463    id = id.replace(/(:|\.|\[|\]|,)/g, '');
5464    id = 'select2-' + id;
5465
5466    return id;
5467  };
5468
5469  Select2.prototype._placeContainer = function ($container) {
5470    $container.insertAfter(this.$element);
5471
5472    var width = this._resolveWidth(this.$element, this.options.get('width'));
5473
5474    if (width != null) {
5475      $container.css('width', width);
5476    }
5477  };
5478
5479  Select2.prototype._resolveWidth = function ($element, method) {
5480    var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;
5481
5482    if (method == 'resolve') {
5483      var styleWidth = this._resolveWidth($element, 'style');
5484
5485      if (styleWidth != null) {
5486        return styleWidth;
5487      }
5488
5489      return this._resolveWidth($element, 'element');
5490    }
5491
5492    if (method == 'element') {
5493      var elementWidth = $element.outerWidth(false);
5494
5495      if (elementWidth <= 0) {
5496        return 'auto';
5497      }
5498
5499      return elementWidth + 'px';
5500    }
5501
5502    if (method == 'style') {
5503      var style = $element.attr('style');
5504
5505      if (typeof(style) !== 'string') {
5506        return null;
5507      }
5508
5509      var attrs = style.split(';');
5510
5511      for (var i = 0, l = attrs.length; i < l; i = i + 1) {
5512        var attr = attrs[i].replace(/\s/g, '');
5513        var matches = attr.match(WIDTH);
5514
5515        if (matches !== null && matches.length >= 1) {
5516          return matches[1];
5517        }
5518      }
5519
5520      return null;
5521    }
5522
5523    if (method == 'computedstyle') {
5524      var computedStyle = window.getComputedStyle($element[0]);
5525
5526      return computedStyle.width;
5527    }
5528
5529    return method;
5530  };
5531
5532  Select2.prototype._bindAdapters = function () {
5533    this.dataAdapter.bind(this, this.$container);
5534    this.selection.bind(this, this.$container);
5535
5536    this.dropdown.bind(this, this.$container);
5537    this.results.bind(this, this.$container);
5538  };
5539
5540  Select2.prototype._registerDomEvents = function () {
5541    var self = this;
5542
5543    this.$element.on('change.select2', function () {
5544      self.dataAdapter.current(function (data) {
5545        self.trigger('selection:update', {
5546          data: data
5547        });
5548      });
5549    });
5550
5551    this.$element.on('focus.select2', function (evt) {
5552      self.trigger('focus', evt);
5553    });
5554
5555    this._syncA = Utils.bind(this._syncAttributes, this);
5556    this._syncS = Utils.bind(this._syncSubtree, this);
5557
5558    if (this.$element[0].attachEvent) {
5559      this.$element[0].attachEvent('onpropertychange', this._syncA);
5560    }
5561
5562    var observer = window.MutationObserver ||
5563      window.WebKitMutationObserver ||
5564      window.MozMutationObserver
5565    ;
5566
5567    if (observer != null) {
5568      this._observer = new observer(function (mutations) {
5569        self._syncA();
5570        self._syncS(null, mutations);
5571      });
5572      this._observer.observe(this.$element[0], {
5573        attributes: true,
5574        childList: true,
5575        subtree: false
5576      });
5577    } else if (this.$element[0].addEventListener) {
5578      this.$element[0].addEventListener(
5579        'DOMAttrModified',
5580        self._syncA,
5581        false
5582      );
5583      this.$element[0].addEventListener(
5584        'DOMNodeInserted',
5585        self._syncS,
5586        false
5587      );
5588      this.$element[0].addEventListener(
5589        'DOMNodeRemoved',
5590        self._syncS,
5591        false
5592      );
5593    }
5594  };
5595
5596  Select2.prototype._registerDataEvents = function () {
5597    var self = this;
5598
5599    this.dataAdapter.on('*', function (name, params) {
5600      self.trigger(name, params);
5601    });
5602  };
5603
5604  Select2.prototype._registerSelectionEvents = function () {
5605    var self = this;
5606    var nonRelayEvents = ['toggle', 'focus'];
5607
5608    this.selection.on('toggle', function () {
5609      self.toggleDropdown();
5610    });
5611
5612    this.selection.on('focus', function (params) {
5613      self.focus(params);
5614    });
5615
5616    this.selection.on('*', function (name, params) {
5617      if ($.inArray(name, nonRelayEvents) !== -1) {
5618        return;
5619      }
5620
5621      self.trigger(name, params);
5622    });
5623  };
5624
5625  Select2.prototype._registerDropdownEvents = function () {
5626    var self = this;
5627
5628    this.dropdown.on('*', fu
vendor: 32,305 bytes, lines 5628-6820
5628nction (name, params) {
5629      self.trigger(name, params);
5630    });
5631  };
5632
5633  Select2.prototype._registerResultsEvents = function () {
5634    var self = this;
5635
5636    this.results.on('*', function (name, params) {
5637      self.trigger(name, params);
5638    });
5639  };
5640
5641  Select2.prototype._registerEvents = function () {
5642    var self = this;
5643
5644    this.on('open', function () {
5645      self.$container.addClass('select2-container--open');
5646    });
5647
5648    this.on('close', function () {
5649      self.$container.removeClass('select2-container--open');
5650    });
5651
5652    this.on('enable', function () {
5653      self.$container.removeClass('select2-container--disabled');
5654    });
5655
5656    this.on('disable', function () {
5657      self.$container.addClass('select2-container--disabled');
5658    });
5659
5660    this.on('blur', function () {
5661      self.$container.removeClass('select2-container--focus');
5662    });
5663
5664    this.on('query', function (params) {
5665      if (!self.isOpen()) {
5666        self.trigger('open', {});
5667      }
5668
5669      this.dataAdapter.query(params, function (data) {
5670        self.trigger('results:all', {
5671          data: data,
5672          query: params
5673        });
5674      });
5675    });
5676
5677    this.on('query:append', function (params) {
5678      this.dataAdapter.query(params, function (data) {
5679        self.trigger('results:append', {
5680          data: data,
5681          query: params
5682        });
5683      });
5684    });
5685
5686    this.on('keypress', function (evt) {
5687      var key = evt.which;
5688
5689      if (self.isOpen()) {
5690        if (key === KEYS.ESC || key === KEYS.TAB ||
5691            (key === KEYS.UP && evt.altKey)) {
5692          self.close(evt);
5693
5694          evt.preventDefault();
5695        } else if (key === KEYS.ENTER) {
5696          self.trigger('results:select', {});
5697
5698          evt.preventDefault();
5699        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {
5700          self.trigger('results:toggle', {});
5701
5702          evt.preventDefault();
5703        } else if (key === KEYS.UP) {
5704          self.trigger('results:previous', {});
5705
5706          evt.preventDefault();
5707        } else if (key === KEYS.DOWN) {
5708          self.trigger('results:next', {});
5709
5710          evt.preventDefault();
5711        }
5712      } else {
5713        if (key === KEYS.ENTER || key === KEYS.SPACE ||
5714            (key === KEYS.DOWN && evt.altKey)) {
5715          self.open();
5716
5717          evt.preventDefault();
5718        }
5719      }
5720    });
5721  };
5722
5723  Select2.prototype._syncAttributes = function () {
5724    this.options.set('disabled', this.$element.prop('disabled'));
5725
5726    if (this.isDisabled()) {
5727      if (this.isOpen()) {
5728        this.close();
5729      }
5730
5731      this.trigger('disable', {});
5732    } else {
5733      this.trigger('enable', {});
5734    }
5735  };
5736
5737  Select2.prototype._isChangeMutation = function (evt, mutations) {
5738    var changed = false;
5739    var self = this;
5740
5741    // Ignore any mutation events raised for elements that aren't options or
5742    // optgroups. This handles the case when the select element is destroyed
5743    if (
5744      evt && evt.target && (
5745        evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP'
5746      )
5747    ) {
5748      return;
5749    }
5750
5751    if (!mutations) {
5752      // If mutation events aren't supported, then we can only assume that the
5753      // change affected the selections
5754      changed = true;
5755    } else if (mutations.addedNodes && mutations.addedNodes.length > 0) {
5756      for (var n = 0; n < mutations.addedNodes.length; n++) {
5757        var node = mutations.addedNodes[n];
5758
5759        if (node.selected) {
5760          changed = true;
5761        }
5762      }
5763    } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
5764      changed = true;
5765    } else if ($.isArray(mutations)) {
5766      $.each(mutations, function(evt, mutation) {
5767        if (self._isChangeMutation(evt, mutation)) {
5768          // We've found a change mutation.
5769          // Let's escape from the loop and continue
5770          changed = true;
5771          return false;
5772        }
5773      });
5774    }
5775    return changed;
5776  };
5777
5778  Select2.prototype._syncSubtree = function (evt, mutations) {
5779    var changed = this._isChangeMutation(evt, mutations);
5780    var self = this;
5781
5782    // Only re-pull the data if we think there is a change
5783    if (changed) {
5784      this.dataAdapter.current(function (currentData) {
5785        self.trigger('selection:update', {
5786          data: currentData
5787        });
5788      });
5789    }
5790  };
5791
5792  /**
5793   * Override the trigger method to automatically trigger pre-events when
5794   * there are events that can be prevented.
5795   */
5796  Select2.prototype.trigger = function (name, args) {
5797    var actualTrigger = Select2.__super__.trigger;
5798    var preTriggerMap = {
5799      'open': 'opening',
5800      'close': 'closing',
5801      'select': 'selecting',
5802      'unselect': 'unselecting',
5803      'clear': 'clearing'
5804    };
5805
5806    if (args === undefined) {
5807      args = {};
5808    }
5809
5810    if (name in preTriggerMap) {
5811      var preTriggerName = preTriggerMap[name];
5812      var preTriggerArgs = {
5813        prevented: false,
5814        name: name,
5815        args: args
5816      };
5817
5818      actualTrigger.call(this, preTriggerName, preTriggerArgs);
5819
5820      if (preTriggerArgs.prevented) {
5821        args.prevented = true;
5822
5823        return;
5824      }
5825    }
5826
5827    actualTrigger.call(this, name, args);
5828  };
5829
5830  Select2.prototype.toggleDropdown = function () {
5831    if (this.isDisabled()) {
5832      return;
5833    }
5834
5835    if (this.isOpen()) {
5836      this.close();
5837    } else {
5838      this.open();
5839    }
5840  };
5841
5842  Select2.prototype.open = function () {
5843    if (this.isOpen()) {
5844      return;
5845    }
5846
5847    if (this.isDisabled()) {
5848      return;
5849    }
5850
5851    this.trigger('query', {});
5852  };
5853
5854  Select2.prototype.close = function (evt) {
5855    if (!this.isOpen()) {
5856      return;
5857    }
5858
5859    this.trigger('close', { originalEvent : evt });
5860  };
5861
5862  /**
5863   * Helper method to abstract the "enabled" (not "disabled") state of this
5864   * object.
5865   *
5866   * @return {true} if the instance is not disabled.
5867   * @return {false} if the instance is disabled.
5868   */
5869  Select2.prototype.isEnabled = function () {
5870    return !this.isDisabled();
5871  };
5872
5873  /**
5874   * Helper method to abstract the "disabled" state of this object.
5875   *
5876   * @return {true} if the disabled option is true.
5877   * @return {false} if the disabled option is false.
5878   */
5879  Select2.prototype.isDisabled = function () {
5880    return this.options.get('disabled');
5881  };
5882
5883  Select2.prototype.isOpen = function () {
5884    return this.$container.hasClass('select2-container--open');
5885  };
5886
5887  Select2.prototype.hasFocus = function () {
5888    return this.$container.hasClass('select2-container--focus');
5889  };
5890
5891  Select2.prototype.focus = function (data) {
5892    // No need to re-trigger focus events if we are already focused
5893    if (this.hasFocus()) {
5894      return;
5895    }
5896
5897    this.$container.addClass('select2-container--focus');
5898    this.trigger('focus', {});
5899  };
5900
5901  Select2.prototype.enable = function (args) {
5902    if (this.options.get('debug') && window.console && console.warn) {
5903      console.warn(
5904        'Select2: The `select2("enable")` method has been deprecated and will' +
5905        ' be removed in later Select2 versions. Use $element.prop("disabled")' +
5906        ' instead.'
5907      );
5908    }
5909
5910    if (args == null || args.length === 0) {
5911      args = [true];
5912    }
5913
5914    var disabled = !args[0];
5915
5916    this.$element.prop('disabled', disabled);
5917  };
5918
5919  Select2.prototype.data = function () {
5920    if (this.options.get('debug') &&
5921        arguments.length > 0 && window.console && console.warn) {
5922      console.warn(
5923        'Select2: Data can no longer be set using `select2("data")`. You ' +
5924        'should consider setting the value instead using `$element.val()`.'
5925      );
5926    }
5927
5928    var data = [];
5929
5930    this.dataAdapter.current(function (currentData) {
5931      data = currentData;
5932    });
5933
5934    return data;
5935  };
5936
5937  Select2.prototype.val = function (args) {
5938    if (this.options.get('debug') && window.console && console.warn) {
5939      console.warn(
5940        'Select2: The `select2("val")` method has been deprecated and will be' +
5941        ' removed in later Select2 versions. Use $element.val() instead.'
5942      );
5943    }
5944
5945    if (args == null || args.length === 0) {
5946      return this.$element.val();
5947    }
5948
5949    var newVal = args[0];
5950
5951    if ($.isArray(newVal)) {
5952      newVal = $.map(newVal, function (obj) {
5953        return obj.toString();
5954      });
5955    }
5956
5957    this.$element.val(newVal).trigger('input').trigger('change');
5958  };
5959
5960  Select2.prototype.destroy = function () {
5961    this.$container.remove();
5962
5963    if (this.$element[0].detachEvent) {
5964      this.$element[0].detachEvent('onpropertychange', this._syncA);
5965    }
5966
5967    if (this._observer != null) {
5968      this._observer.disconnect();
5969      this._observer = null;
5970    } else if (this.$element[0].removeEventListener) {
5971      this.$element[0]
5972        .removeEventListener('DOMAttrModified', this._syncA, false);
5973      this.$element[0]
5974        .removeEventListener('DOMNodeInserted', this._syncS, false);
5975      this.$element[0]
5976        .removeEventListener('DOMNodeRemoved', this._syncS, false);
5977    }
5978
5979    this._syncA = null;
5980    this._syncS = null;
5981
5982    this.$element.off('.select2');
5983    this.$element.attr('tabindex',
5984    Utils.GetData(this.$element[0], 'old-tabindex'));
5985
5986    this.$element.removeClass('select2-hidden-accessible');
5987    this.$element.attr('aria-hidden', 'false');
5988    Utils.RemoveData(this.$element[0]);
5989    this.$element.removeData('select2');
5990
5991    this.dataAdapter.destroy();
5992    this.selection.destroy();
5993    this.dropdown.destroy();
5994    this.results.destroy();
5995
5996    this.dataAdapter = null;
5997    this.selection = null;
5998    this.dropdown = null;
5999    this.results = null;
6000  };
6001
6002  Select2.prototype.render = function () {
6003    var $container = $(
6004      '<span class="select2 select2-container">' +
6005        '<span class="selection"></span>' +
6006        '<span class="dropdown-wrapper" aria-hidden="true"></span>' +
6007      '</span>'
6008    );
6009
6010    $container.attr('dir', this.options.get('dir'));
6011
6012    this.$container = $container;
6013
6014    this.$container.addClass('select2-container--' + this.options.get('theme'));
6015
6016    Utils.StoreData($container[0], 'element', this.$element);
6017
6018    return $container;
6019  };
6020
6021  return Select2;
6022});
6023
6024S2.define('select2/compat/utils',[
6025  'jquery'
6026], function ($) {
6027  function syncCssClasses ($dest, $src, adapter) {
6028    var classes, replacements = [], adapted;
6029
6030    classes = $.trim($dest.attr('class'));
6031
6032    if (classes) {
6033      classes = '' + classes; // for IE which returns object
6034
6035      $(classes.split(/\s+/)).each(function () {
6036        // Save all Select2 classes
6037        if (this.indexOf('select2-') === 0) {
6038          replacements.push(this);
6039        }
6040      });
6041    }
6042
6043    classes = $.trim($src.attr('class'));
6044
6045    if (classes) {
6046      classes = '' + classes; // for IE which returns object
6047
6048      $(classes.split(/\s+/)).each(function () {
6049        // Only adapt non-Select2 classes
6050        if (this.indexOf('select2-') !== 0) {
6051          adapted = adapter(this);
6052
6053          if (adapted != null) {
6054            replacements.push(adapted);
6055          }
6056        }
6057      });
6058    }
6059
6060    $dest.attr('class', replacements.join(' '));
6061  }
6062
6063  return {
6064    syncCssClasses: syncCssClasses
6065  };
6066});
6067
6068S2.define('select2/compat/containerCss',[
6069  'jquery',
6070  './utils'
6071], function ($, CompatUtils) {
6072  // No-op CSS adapter that discards all classes by default
6073  function _containerAdapter (clazz) {
6074    return null;
6075  }
6076
6077  function ContainerCSS () { }
6078
6079  ContainerCSS.prototype.render = function (decorated) {
6080    var $container = decorated.call(this);
6081
6082    var containerCssClass = this.options.get('containerCssClass') || '';
6083
6084    if ($.isFunction(containerCssClass)) {
6085      containerCssClass = containerCssClass(this.$element);
6086    }
6087
6088    var containerCssAdapter = this.options.get('adaptContainerCssClass');
6089    containerCssAdapter = containerCssAdapter || _containerAdapter;
6090
6091    if (containerCssClass.indexOf(':all:') !== -1) {
6092      containerCssClass = containerCssClass.replace(':all:', '');
6093
6094      var _cssAdapter = containerCssAdapter;
6095
6096      containerCssAdapter = function (clazz) {
6097        var adapted = _cssAdapter(clazz);
6098
6099        if (adapted != null) {
6100          // Append the old one along with the adapted one
6101          return adapted + ' ' + clazz;
6102        }
6103
6104        return clazz;
6105      };
6106    }
6107
6108    var containerCss = this.options.get('containerCss') || {};
6109
6110    if ($.isFunction(containerCss)) {
6111      containerCss = containerCss(this.$element);
6112    }
6113
6114    CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter);
6115
6116    $container.css(containerCss);
6117    $container.addClass(containerCssClass);
6118
6119    return $container;
6120  };
6121
6122  return ContainerCSS;
6123});
6124
6125S2.define('select2/compat/dropdownCss',[
6126  'jquery',
6127  './utils'
6128], function ($, CompatUtils) {
6129  // No-op CSS adapter that discards all classes by default
6130  function _dropdownAdapter (clazz) {
6131    return null;
6132  }
6133
6134  function DropdownCSS () { }
6135
6136  DropdownCSS.prototype.render = function (decorated) {
6137    var $dropdown = decorated.call(this);
6138
6139    var dropdownCssClass = this.options.get('dropdownCssClass') || '';
6140
6141    if ($.isFunction(dropdownCssClass)) {
6142      dropdownCssClass = dropdownCssClass(this.$element);
6143    }
6144
6145    var dropdownCssAdapter = this.options.get('adaptDropdownCssClass');
6146    dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter;
6147
6148    if (dropdownCssClass.indexOf(':all:') !== -1) {
6149      dropdownCssClass = dropdownCssClass.replace(':all:', '');
6150
6151      var _cssAdapter = dropdownCssAdapter;
6152
6153      dropdownCssAdapter = function (clazz) {
6154        var adapted = _cssAdapter(clazz);
6155
6156        if (adapted != null) {
6157          // Append the old one along with the adapted one
6158          return adapted + ' ' + clazz;
6159        }
6160
6161        return clazz;
6162      };
6163    }
6164
6165    var dropdownCss = this.options.get('dropdownCss') || {};
6166
6167    if ($.isFunction(dropdownCss)) {
6168      dropdownCss = dropdownCss(this.$element);
6169    }
6170
6171    CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter);
6172
6173    $dropdown.css(dropdownCss);
6174    $dropdown.addClass(dropdownCssClass);
6175
6176    return $dropdown;
6177  };
6178
6179  return DropdownCSS;
6180});
6181
6182S2.define('select2/compat/initSelection',[
6183  'jquery'
6184], function ($) {
6185  function InitSelection (decorated, $element, options) {
6186    if (options.get('debug') && window.console && console.warn) {
6187      console.warn(
6188        'Select2: The `initSelection` option has been deprecated in favor' +
6189        ' of a custom data adapter that overrides the `current` method. ' +
6190        'This method is now called multiple times instead of a single ' +
6191        'time when the instance is initialized. Support will be removed ' +
6192        'for the `initSelection` option in future versions of Select2'
6193      );
6194    }
6195
6196    this.initSelection = options.get('initSelection');
6197    this._isInitialized = false;
6198
6199    decorated.call(this, $element, options);
6200  }
6201
6202  InitSelection.prototype.current = function (decorated, callback) {
6203    var self = this;
6204
6205    if (this._isInitialized) {
6206      decorated.call(this, callback);
6207
6208      return;
6209    }
6210
6211    this.initSelection.call(null, this.$element, function (data) {
6212      self._isInitialized = true;
6213
6214      if (!$.isArray(data)) {
6215        data = [data];
6216      }
6217
6218      callback(data);
6219    });
6220  };
6221
6222  return InitSelection;
6223});
6224
6225S2.define('select2/compat/inputData',[
6226  'jquery',
6227  '../utils'
6228], function ($, Utils) {
6229  function InputData (decorated, $element, options) {
6230    this._currentData = [];
6231    this._valueSeparator = options.get('valueSeparator') || ',';
6232
6233    if ($element.prop('type') === 'hidden') {
6234      if (options.get('debug') && console && console.warn) {
6235        console.warn(
6236          'Select2: Using a hidden input with Select2 is no longer ' +
6237          'supported and may stop working in the future. It is recommended ' +
6238          'to use a `<select>` element instead.'
6239        );
6240      }
6241    }
6242
6243    decorated.call(this, $element, options);
6244  }
6245
6246  InputData.prototype.current = function (_, callback) {
6247    function getSelected (data, selectedIds) {
6248      var selected = [];
6249
6250      if (data.selected || $.inArray(data.id, selectedIds) !== -1) {
6251        data.selected = true;
6252        selected.push(data);
6253      } else {
6254        data.selected = false;
6255      }
6256
6257      if (data.children) {
6258        selected.push.apply(selected, getSelected(data.children, selectedIds));
6259      }
6260
6261      return selected;
6262    }
6263
6264    var selected = [];
6265
6266    for (var d = 0; d < this._currentData.length; d++) {
6267      var data = this._currentData[d];
6268
6269      selected.push.apply(
6270        selected,
6271        getSelected(
6272          data,
6273          this.$element.val().split(
6274            this._valueSeparator
6275          )
6276        )
6277      );
6278    }
6279
6280    callback(selected);
6281  };
6282
6283  InputData.prototype.select = function (_, data) {
6284    if (!this.options.get('multiple')) {
6285      this.current(function (allData) {
6286        $.map(allData, function (data) {
6287          data.selected = false;
6288        });
6289      });
6290
6291      this.$element.val(data.id);
6292      this.$element.trigger('input').trigger('change');
6293    } else {
6294      var value = this.$element.val();
6295      value += this._valueSeparator + data.id;
6296
6297      this.$element.val(value);
6298      this.$element.trigger('input').trigger('change');
6299    }
6300  };
6301
6302  InputData.prototype.unselect = function (_, data) {
6303    var self = this;
6304
6305    data.selected = false;
6306
6307    this.current(function (allData) {
6308      var values = [];
6309
6310      for (var d = 0; d < allData.length; d++) {
6311        var item = allData[d];
6312
6313        if (data.id == item.id) {
6314          continue;
6315        }
6316
6317        values.push(item.id);
6318      }
6319
6320      self.$element.val(values.join(self._valueSeparator));
6321      self.$element.trigger('input').trigger('change');
6322    });
6323  };
6324
6325  InputData.prototype.query = function (_, params, callback) {
6326    var results = [];
6327
6328    for (var d = 0; d < this._currentData.length; d++) {
6329      var data = this._currentData[d];
6330
6331      var matches = this.matches(params, data);
6332
6333      if (matches !== null) {
6334        results.push(matches);
6335      }
6336    }
6337
6338    callback({
6339      results: results
6340    });
6341  };
6342
6343  InputData.prototype.addOptions = function (_, $options) {
6344    var options = $.map($options, function ($option) {
6345      return Utils.GetData($option[0], 'data');
6346    });
6347
6348    this._currentData.push.apply(this._currentData, options);
6349  };
6350
6351  return InputData;
6352});
6353
6354S2.define('select2/compat/matcher',[
6355  'jquery'
6356], function ($) {
6357  function oldMatcher (matcher) {
6358    function wrappedMatcher (params, data) {
6359      var match = $.extend(true, {}, data);
6360
6361      if (params.term == null || $.trim(params.term) === '') {
6362        return match;
6363      }
6364
6365      if (data.children) {
6366        for (var c = data.children.length - 1; c >= 0; c--) {
6367          var child = data.children[c];
6368
6369          // Check if the child object matches
6370          // The old matcher returned a boolean true or false
6371          var doesMatch = matcher(params.term, child.text, child);
6372
6373          // If the child didn't match, pop it off
6374          if (!doesMatch) {
6375            match.children.splice(c, 1);
6376          }
6377        }
6378
6379        if (match.children.length > 0) {
6380          return match;
6381        }
6382      }
6383
6384      if (matcher(params.term, data.text, data)) {
6385        return match;
6386      }
6387
6388      return null;
6389    }
6390
6391    return wrappedMatcher;
6392  }
6393
6394  return oldMatcher;
6395});
6396
6397S2.define('select2/compat/query',[
6398
6399], function () {
6400  function Query (decorated, $element, options) {
6401    if (options.get('debug') && window.console && console.warn) {
6402      console.warn(
6403        'Select2: The `query` option has been deprecated in favor of a ' +
6404        'custom data adapter that overrides the `query` method. Support ' +
6405        'will be removed for the `query` option in future versions of ' +
6406        'Select2.'
6407      );
6408    }
6409
6410    decorated.call(this, $element, options);
6411  }
6412
6413  Query.prototype.query = function (_, params, callback) {
6414    params.callback = callback;
6415
6416    var query = this.options.get('query');
6417
6418    query.call(null, params);
6419  };
6420
6421  return Query;
6422});
6423
6424S2.define('select2/dropdown/attachContainer',[
6425
6426], function () {
6427  function AttachContainer (decorated, $element, options) {
6428    decorated.call(this, $element, options);
6429  }
6430
6431  AttachContainer.prototype.position =
6432    function (decorated, $dropdown, $container) {
6433    var $dropdownContainer = $container.find('.dropdown-wrapper');
6434    $dropdownContainer.append($dropdown);
6435
6436    $dropdown.addClass('select2-dropdown--below');
6437    $container.addClass('select2-container--below');
6438  };
6439
6440  return AttachContainer;
6441});
6442
6443S2.define('select2/dropdown/stopPropagation',[
6444
6445], function () {
6446  function StopPropagation () { }
6447
6448  StopPropagation.prototype.bind = function (decorated, container, $container) {
6449    decorated.call(this, container, $container);
6450
6451    var stoppedEvents = [
6452    'blur',
6453    'change',
6454    'click',
6455    'dblclick',
6456    'focus',
6457    'focusin',
6458    'focusout',
6459    'input',
6460    'keydown',
6461    'keyup',
6462    'keypress',
6463    'mousedown',
6464    'mouseenter',
6465    'mouseleave',
6466    'mousemove',
6467    'mouseover',
6468    'mouseup',
6469    'search',
6470    'touchend',
6471    'touchstart'
6472    ];
6473
6474    this.$dropdown.on(stoppedEvents.join(' '), function (evt) {
6475      evt.stopPropagation();
6476    });
6477  };
6478
6479  return StopPropagation;
6480});
6481
6482S2.define('select2/selection/stopPropagation',[
6483
6484], function () {
6485  function StopPropagation () { }
6486
6487  StopPropagation.prototype.bind = function (decorated, container, $container) {
6488    decorated.call(this, container, $container);
6489
6490    var stoppedEvents = [
6491      'blur',
6492      'change',
6493      'click',
6494      'dblclick',
6495      'focus',
6496      'focusin',
6497      'focusout',
6498      'input',
6499      'keydown',
6500      'keyup',
6501      'keypress',
6502      'mousedown',
6503      'mouseenter',
6504      'mouseleave',
6505      'mousemove',
6506      'mouseover',
6507      'mouseup',
6508      'search',
6509      'touchend',
6510      'touchstart'
6511    ];
6512
6513    this.$selection.on(stoppedEvents.join(' '), function (evt) {
6514      evt.stopPropagation();
6515    });
6516  };
6517
6518  return StopPropagation;
6519});
6520
6521/*!
6522 * jQuery Mousewheel 3.1.13
6523 *
6524 * Copyright jQuery Foundation and other contributors
6525 * Released under the MIT license
6526 * http://jquery.org/license
6527 */
6528
6529(function (factory) {
6530    if ( typeof S2.define === 'function' && S2.define.amd ) {
6531        // AMD. Register as an anonymous module.
6532        S2.define('jquery-mousewheel',['jquery'], factory);
6533    } else if (typeof exports === 'object') {
6534        // Node/CommonJS style for Browserify
6535        module.exports = factory;
6536    } else {
6537        // Browser globals
6538        factory(jQuery);
6539    }
6540}(function ($) {
6541
6542    var toFix  = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
6543        toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
6544                    ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
6545        slice  = Array.prototype.slice,
6546        nullLowestDeltaTimeout, lowestDelta;
6547
6548    if ( $.event.fixHooks ) {
6549        for ( var i = toFix.length; i; ) {
6550            $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
6551        }
6552    }
6553
6554    var special = $.event.special.mousewheel = {
6555        version: '3.1.12',
6556
6557        setup: function() {
6558            if ( this.addEventListener ) {
6559                for ( var i = toBind.length; i; ) {
6560                    this.addEventListener( toBind[--i], handler, false );
6561                }
6562            } else {
6563                this.onmousewheel = handler;
6564            }
6565            // Store the line height and page height for this particular element
6566            $.data(this, 'mousewheel-line-height', special.getLineHeight(this));
6567            $.data(this, 'mousewheel-page-height', special.getPageHeight(this));
6568        },
6569
6570        teardown: function() {
6571            if ( this.removeEventListener ) {
6572                for ( var i = toBind.length; i; ) {
6573                    this.removeEventListener( toBind[--i], handler, false );
6574                }
6575            } else {
6576                this.onmousewheel = null;
6577            }
6578            // Clean up the data we added to the element
6579            $.removeData(this, 'mousewheel-line-height');
6580            $.removeData(this, 'mousewheel-page-height');
6581        },
6582
6583        getLineHeight: function(elem) {
6584            var $elem = $(elem),
6585                $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();
6586            if (!$parent.length) {
6587                $parent = $('body');
6588            }
6589            return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;
6590        },
6591
6592        getPageHeight: function(elem) {
6593            return $(elem).height();
6594        },
6595
6596        settings: {
6597            adjustOldDeltas: true, // see shouldAdjustOldDeltas() below
6598            normalizeOffset: true  // calls getBoundingClientRect for each event
6599        }
6600    };
6601
6602    $.fn.extend({
6603        mousewheel: function(fn) {
6604            return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
6605        },
6606
6607        unmousewheel: function(fn) {
6608            return this.unbind('mousewheel', fn);
6609        }
6610    });
6611
6612
6613    function handler(event) {
6614        var orgEvent   = event || window.event,
6615            args       = slice.call(arguments, 1),
6616            delta      = 0,
6617            deltaX     = 0,
6618            deltaY     = 0,
6619            absDelta   = 0,
6620            offsetX    = 0,
6621            offsetY    = 0;
6622        event = $.event.fix(orgEvent);
6623        event.type = 'mousewheel';
6624
6625        // Old school scrollwheel delta
6626        if ( 'detail'      in orgEvent ) { deltaY = orgEvent.detail * -1;      }
6627        if ( 'wheelDelta'  in orgEvent ) { deltaY = orgEvent.wheelDelta;       }
6628        if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY;      }
6629        if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
6630
6631        // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
6632        if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
6633            deltaX = deltaY * -1;
6634            deltaY = 0;
6635        }
6636
6637        // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
6638        delta = deltaY === 0 ? deltaX : deltaY;
6639
6640        // New school wheel delta (wheel event)
6641        if ( 'deltaY' in orgEvent ) {
6642            deltaY = orgEvent.deltaY * -1;
6643            delta  = deltaY;
6644        }
6645        if ( 'deltaX' in orgEvent ) {
6646            deltaX = orgEvent.deltaX;
6647            if ( deltaY === 0 ) { delta  = deltaX * -1; }
6648        }
6649
6650        // No change actually happened, no reason to go any further
6651        if ( deltaY === 0 && deltaX === 0 ) { return; }
6652
6653        // Need to convert lines and pages to pixels if we aren't already in pixels
6654        // There are three delta modes:
6655        //   * deltaMode 0 is by pixels, nothing to do
6656        //   * deltaMode 1 is by lines
6657        //   * deltaMode 2 is by pages
6658        if ( orgEvent.deltaMode === 1 ) {
6659            var lineHeight = $.data(this, 'mousewheel-line-height');
6660            delta  *= lineHeight;
6661            deltaY *= lineHeight;
6662            deltaX *= lineHeight;
6663        } else if ( orgEvent.deltaMode === 2 ) {
6664            var pageHeight = $.data(this, 'mousewheel-page-height');
6665            delta  *= pageHeight;
6666            deltaY *= pageHeight;
6667            deltaX *= pageHeight;
6668        }
6669
6670        // Store lowest absolute delta to normalize the delta values
6671        absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
6672
6673        if ( !lowestDelta || absDelta < lowestDelta ) {
6674            lowestDelta = absDelta;
6675
6676            // Adjust older deltas if necessary
6677            if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
6678                lowestDelta /= 40;
6679            }
6680        }
6681
6682        // Adjust older deltas if necessary
6683        if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
6684            // Divide all the things by 40!
6685            delta  /= 40;
6686            deltaX /= 40;
6687            deltaY /= 40;
6688        }
6689
6690        // Get a whole, normalized value for the deltas
6691        delta  = Math[ delta  >= 1 ? 'floor' : 'ceil' ](delta  / lowestDelta);
6692        deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
6693        deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
6694
6695        // Normalise offsetX and offsetY properties
6696        if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {
6697            var boundingRect = this.getBoundingClientRect();
6698            offsetX = event.clientX - boundingRect.left;
6699            offsetY = event.clientY - boundingRect.top;
6700        }
6701
6702        // Add information to the event object
6703        event.deltaX = deltaX;
6704        event.deltaY = deltaY;
6705        event.deltaFactor = lowestDelta;
6706        event.offsetX = offsetX;
6707        event.offsetY = offsetY;
6708        // Go ahead and set deltaMode to 0 since we converted to pixels
6709        // Although this is a little odd since we overwrite the deltaX/Y
6710        // properties with normalized deltas.
6711        event.deltaMode = 0;
6712
6713        // Add event and delta to the front of the arguments
6714        args.unshift(event, delta, deltaX, deltaY);
6715
6716        // Clearout lowestDelta after sometime to better
6717        // handle multiple device types that give different
6718        // a different lowestDelta
6719        // Ex: trackpad = 3 and mouse wheel = 120
6720        if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
6721        nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
6722
6723        return ($.event.dispatch || $.event.handle).apply(this, args);
6724    }
6725
6726    function nullLowestDelta() {
6727        lowestDelta = null;
6728    }
6729
6730    function shouldAdjustOldDeltas(orgEvent, absDelta) {
6731        // If this is an older event and the delta is divisable by 120,
6732        // then we are assuming that the browser is treating this as an
6733        // older mouse wheel event and that we should divide the deltas
6734        // by 40 to try and get a more usable deltaFactor.
6735        // Side note, this actually impacts the reported scroll distance
6736        // in older browsers and can cause scrolling to be slower than native.
6737        // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.
6738        return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;
6739    }
6740
6741}));
6742
6743S2.define('jquery.select2',[
6744  'jquery',
6745  'jquery-mousewheel',
6746
6747  './select2/core',
6748  './select2/defaults',
6749  './select2/utils'
6750], function ($, _, Select2, Defaults, Utils) {
6751  if ($.fn.select2 == null) {
6752    // All methods that should return the element
6753    var thisMethods = ['open', 'close', 'destroy'];
6754
6755    $.fn.select2 = function (options) {
6756      options = options || {};
6757
6758      if (typeof options === 'object') {
6759        this.each(function () {
6760          var instanceOptions = $.extend(true, {}, options);
6761
6762          var instance = new Select2($(this), instanceOptions);
6763        });
6764
6765        return this;
6766      } else if (typeof options === 'string') {
6767        var ret;
6768        var args = Array.prototype.slice.call(arguments, 1);
6769
6770        this.each(function () {
6771          var instance = Utils.GetData(this, 'select2');
6772
6773          if (instance == null && window.console && console.error) {
6774            console.error(
6775              'The select2(\'' + options + '\') method was called on an ' +
6776              'element that is not using Select2.'
6777            );
6778          }
6779
6780          ret = instance[options].apply(instance, args);
6781        });
6782
6783        // Check if we should be returning `this`
6784        if ($.inArray(options, thisMethods) > -1) {
6785          return this;
6786        }
6787
6788        return ret;
6789      } else {
6790        throw new Error('Invalid arguments for Select2: ' + options);
6791      }
6792    };
6793  }
6794
6795  if ($.fn.select2.defaults == null) {
6796    $.fn.select2.defaults = Defaults;
6797  }
6798
6799  return Select2;
6800});
6801
6802  // Return the AMD loader configuration so it can be used outside of this file
6803  return {
6804    define: S2.define,
6805    require: S2.require
6806  };
6807}());
6808
6809  // Autoload the jQuery bindings
6810  // We know that all of the modules exist above this, so we're safe
6811  var select2 = S2.require('jquery.select2');
6812
6813  // Hold the AMD module references on the jQuery function that was just loaded
6814  // This allows Select2 to use the internal loader outside of this file, such
6815  // as in the language files.
6816  jQuery.fn.select2.amd = S2;
6817
6818  // Return the Select2 instance for anyone who is importing it.
6819  return select2;
6820}));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.