Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/elementor/assets/lib/e-select2/js/e-select2.full.js

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