overleaf/services/web/public/js/libs/select/select.min.js.map

1 line
No EOL
141 KiB
Text
Executable file

{"version":3,"sources":["select.js","select_without_templates.js","templates.js"],"names":["isNil","value","angular","isUndefined","KEY","TAB","ENTER","ESC","SPACE","LEFT","UP","RIGHT","DOWN","SHIFT","CTRL","ALT","PAGE_UP","PAGE_DOWN","HOME","END","BACKSPACE","DELETE","COMMAND","MAP","91","8","9","13","16","17","18","19","20","27","32","33","34","35","36","37","38","39","40","43","44","45","46","48","49","50","51","52","53","54","55","56","57","59","61","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","96","97","98","99","100","101","102","103","104","105","106","107","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","144","145","186","187","188","189","190","191","192","219","220","221","222","isControl","e","k","which","metaKey","ctrlKey","altKey","isFunctionKey","isVerticalMovement","indexOf","isHorizontalMovement","toSeparator","sep","undefined","element","prototype","querySelectorAll","selector","this","closest","elem","matchesSelector","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","bind","parentElement","latestId","uis","module","constant","theme","searchEnabled","sortable","placeholder","refreshDelay","closeOnSelect","skipFocusser","dropdownPosition","removeSelected","resetSearchInput","generateId","appendToBody","spinnerEnabled","spinnerClass","backspaceReset","service","minErr","$$minErr","error","apply","arguments","message","replace","RegExp","Error","directive","link","scope","attrs","ctrl","transclude","clone","append","filter","escapeRegexp","queryToEscape","matchItem","query","factory","$document","$window","boundingClientRect","getBoundingClientRect","width","prop","height","top","pageYOffset","documentElement","scrollTop","left","pageXOffset","scrollLeft","$timeout","callback","debounceTime","timeoutPromise","self","args","Array","slice","call","cancel","uiSelectConfig","RepeatParser","uiSelectMinErr","$compile","restrict","require","templateUrl","tElement","addClass","parent","attr","compile","tAttrs","repeat","groupByExp","groupBy","groupFilterExp","groupFilter","groups","length","getGroupNgRepeatExpression","parserResult","parse","choices","repeatExpression","rowsInner","clickTarget","document","addEventListener","itemName","$select","parseRepeatAttr","disableChoiceExpression","uiDisableChoice","onHighlightCallback","onHighlight","minimumInputLength","parseInt","position","toLowerCase","$watch","newValue","open","multiple","activate","activeIndex","tagging","isActivated","search","refresh","items","$observe","$eval","removeAttr","controller","$scope","$element","$filter","$$uisDebounce","$parse","$injector","_findIndex","collection","predicate","thisArg","findIndex","list","Object","i","_resetSearchInput","EMPTY_SEARCH","selected","item","equals","_groupsFilter","groupNames","j","result","name","push","_updateItemDisabled","isDisabled","disabledItemIndex","disabledItems","splice","_isItemDisabled","_initaliseLockedChoices","doInitalise","_updateItemLocked","isLocked","lockedItemIndex","lockedItems","_isItemlocked","itemScope","itemIndex","lockChoiceExpression","_handleDropDownSelection","key","processed","idx","minActiveIndex","idxmin","select","close","_ensureHighlightVisible","container","highlighted","posY","offsetTop","clientHeight","offsetHeight","isGrouped","paste","refreshing","focus","disabled","focusser","fct","taggingTokens","tokens","clickTriggeredSelect","$animate","get","err","searchInput","isEmpty","initSearchValue","avoidReset","$broadcast","taggingLabel","on","enabled","animateHandler","phase","off","focusSearchInput","findGroupByName","group","repeatAttr","updateGroups","groupFn","forEach","groupName","isFunction","groupFilterFn","isArray","concat","setPlainItems","setItemsFn","itemProperty","originalSource","source","createArrayFromObject","origSrc","$uisSource","keys","map","v","keyName","filters","newVal","oldVal","refreshItems","data","selectedItems","filteredItems","every","selectedItem","calculateDropdownPos","$watchCollection","isDefined","ngModel","$modelValue","_refreshDelayPromise","refreshAttr","refreshPromise","then","isActive","_isItemSelected","selection","isTag","$event","type","trim","$setTouched","setFocus","focusInput","clear","stopPropagation","toggle","preventDefault","sizeWatch","updaterScheduled","sizeSearchInput","input","calculateContainerWidth","clientWidth","offsetParent","updateIfVisible","containerWidth","inputWidth","offsetLeft","css","$$postDigest","noop","$apply","tagged","keyCode","triggerHandler","newItem","window","clipboardData","getData","originalEvent","separator","split","oldsearch","onResize","$on","find","generatedId","uisOffset","controllerAs","match","exec","ngClass","combined","inputId","id","ctrls","transcludeFn","onDocumentClick","contains","jQuery","target","focusableControls","targetController","tagName","$digest","positionDropdown","offset","style","after","originalWidth","resetDropdown","replaceWith","baseTitle","title","focusserTitle","focusserId","onSelectCallback","onSelect","onRemoveCallback","onRemove","choiceGrouped","tabindex","limit","taggingEval","autofocus","focusOn","transcluded","transcludedMatch","transcludedChoices","transcludedNoChoice","isOpen","dropdown","directionUpClassName","setDropdownPosUp","offsetDropdown","setDropdownPosDown","removeClass","calculateDropdownPosAfterAnimation","body","opacity","opened","needsCalculated","getAttribute","attribute","hasAttribute","multi","setAllowClear","allow","allowClear","uiLockChoice","$evalAsync","activeMatchIndex","updateModel","$setViewValue","Date","now","refreshComponent","removeChoice","index","removedChoice","locals","$item","$model","modelMapper","getPlaceholder","_getCaretPosition","el","isNumber","selectionStart","_handleMatchSelection","getNewActiveMatchIndex","$selectMultiple","prev","last","curr","next","caretPosition","first","newIndex","Math","min","max","_findCaseInsensitiveDupe","arr","hasDupe","origItem","toUpperCase","_findApproxDupe","haystack","needle","dupeIndex","tempArr","copy","mockObj","isObject","$isEmpty","$parsers","unshift","resultMultiple","$formatters","inputValue","checkFnMultiple","p","trackByExp","propsItemNameMatches","oldValue","$render","$viewValue","event","tagItems","tagItem","stashArr","hasTag","some","itemsWithoutTag","checkFnSingle","d","val","uiSelectSort","$ngModel","options","extend","axis","uiSelectSortOptions","draggingClassName","droppingClassName","droppingBeforeClassName","droppingAfterClassName","dataTransfer","setData","$index","toString","dropTimeout","move","from","to","className","dragOverHandler","offsetY","layerY","offsetX","layerX","dropHandler","droppedItemIndex","_dropHandler","theList","itemToMove","hasClass","$emit","array","onOpenCloseCallback","uisOpenClose","previousState","expression","filterMatch","grouped","run","$templateCache","put"],"mappings":"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","file":"select.min.js","sourcesContent":["/*!\n * ui-select\n * http://github.com/angular-ui/ui-select\n * Version: 0.19.7 - 2017-04-15T14:28:36.649Z\n * License: MIT\n */\n\n\n(function () { \n\"use strict\";\nvar KEY = {\n TAB: 9,\n ENTER: 13,\n ESC: 27,\n SPACE: 32,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n SHIFT: 16,\n CTRL: 17,\n ALT: 18,\n PAGE_UP: 33,\n PAGE_DOWN: 34,\n HOME: 36,\n END: 35,\n BACKSPACE: 8,\n DELETE: 46,\n COMMAND: 91,\n\n MAP: { 91 : \"COMMAND\", 8 : \"BACKSPACE\" , 9 : \"TAB\" , 13 : \"ENTER\" , 16 : \"SHIFT\" , 17 : \"CTRL\" , 18 : \"ALT\" , 19 : \"PAUSEBREAK\" , 20 : \"CAPSLOCK\" , 27 : \"ESC\" , 32 : \"SPACE\" , 33 : \"PAGE_UP\", 34 : \"PAGE_DOWN\" , 35 : \"END\" , 36 : \"HOME\" , 37 : \"LEFT\" , 38 : \"UP\" , 39 : \"RIGHT\" , 40 : \"DOWN\" , 43 : \"+\" , 44 : \"PRINTSCREEN\" , 45 : \"INSERT\" , 46 : \"DELETE\", 48 : \"0\" , 49 : \"1\" , 50 : \"2\" , 51 : \"3\" , 52 : \"4\" , 53 : \"5\" , 54 : \"6\" , 55 : \"7\" , 56 : \"8\" , 57 : \"9\" , 59 : \";\", 61 : \"=\" , 65 : \"A\" , 66 : \"B\" , 67 : \"C\" , 68 : \"D\" , 69 : \"E\" , 70 : \"F\" , 71 : \"G\" , 72 : \"H\" , 73 : \"I\" , 74 : \"J\" , 75 : \"K\" , 76 : \"L\", 77 : \"M\" , 78 : \"N\" , 79 : \"O\" , 80 : \"P\" , 81 : \"Q\" , 82 : \"R\" , 83 : \"S\" , 84 : \"T\" , 85 : \"U\" , 86 : \"V\" , 87 : \"W\" , 88 : \"X\" , 89 : \"Y\" , 90 : \"Z\", 96 : \"0\" , 97 : \"1\" , 98 : \"2\" , 99 : \"3\" , 100 : \"4\" , 101 : \"5\" , 102 : \"6\" , 103 : \"7\" , 104 : \"8\" , 105 : \"9\", 106 : \"*\" , 107 : \"+\" , 109 : \"-\" , 110 : \".\" , 111 : \"/\", 112 : \"F1\" , 113 : \"F2\" , 114 : \"F3\" , 115 : \"F4\" , 116 : \"F5\" , 117 : \"F6\" , 118 : \"F7\" , 119 : \"F8\" , 120 : \"F9\" , 121 : \"F10\" , 122 : \"F11\" , 123 : \"F12\", 144 : \"NUMLOCK\" , 145 : \"SCROLLLOCK\" , 186 : \";\" , 187 : \"=\" , 188 : \",\" , 189 : \"-\" , 190 : \".\" , 191 : \"/\" , 192 : \"`\" , 219 : \"[\" , 220 : \"\\\\\" , 221 : \"]\" , 222 : \"'\"\n },\n\n isControl: function (e) {\n var k = e.which;\n switch (k) {\n case KEY.COMMAND:\n case KEY.SHIFT:\n case KEY.CTRL:\n case KEY.ALT:\n return true;\n }\n\n if (e.metaKey || e.ctrlKey || e.altKey) return true;\n\n return false;\n },\n isFunctionKey: function (k) {\n k = k.which ? k.which : k;\n return k >= 112 && k <= 123;\n },\n isVerticalMovement: function (k){\n return ~[KEY.UP, KEY.DOWN].indexOf(k);\n },\n isHorizontalMovement: function (k){\n return ~[KEY.LEFT,KEY.RIGHT,KEY.BACKSPACE,KEY.DELETE].indexOf(k);\n },\n toSeparator: function (k) {\n var sep = {ENTER:\"\\n\",TAB:\"\\t\",SPACE:\" \"}[k];\n if (sep) return sep;\n // return undefined for special keys other than enter, tab or space.\n // no way to use them to cut strings.\n return KEY[k] ? undefined : k;\n }\n };\n\nfunction isNil(value) {\n return angular.isUndefined(value) || value === null;\n}\n\n/**\n * Add querySelectorAll() to jqLite.\n *\n * jqLite find() is limited to lookups by tag name.\n * TODO This will change with future versions of AngularJS, to be removed when this happens\n *\n * See jqLite.find - why not use querySelectorAll? https://github.com/angular/angular.js/issues/3586\n * See feat(jqLite): use querySelectorAll instead of getElementsByTagName in jqLite.find https://github.com/angular/angular.js/pull/3598\n */\nif (angular.element.prototype.querySelectorAll === undefined) {\n angular.element.prototype.querySelectorAll = function(selector) {\n return angular.element(this[0].querySelectorAll(selector));\n };\n}\n\n/**\n * Add closest() to jqLite.\n */\nif (angular.element.prototype.closest === undefined) {\n angular.element.prototype.closest = function( selector) {\n var elem = this[0];\n var matchesSelector = elem.matches || elem.webkitMatchesSelector || elem.mozMatchesSelector || elem.msMatchesSelector;\n\n while (elem) {\n if (matchesSelector.bind(elem)(selector)) {\n return elem;\n } else {\n elem = elem.parentElement;\n }\n }\n return false;\n };\n}\n\nvar latestId = 0;\n\nvar uis = angular.module('ui.select', [])\n\n.constant('uiSelectConfig', {\n theme: 'bootstrap',\n searchEnabled: true,\n sortable: false,\n placeholder: '', // Empty by default, like HTML tag <select>\n refreshDelay: 1000, // In milliseconds\n closeOnSelect: true,\n skipFocusser: false,\n dropdownPosition: 'auto',\n removeSelected: true,\n resetSearchInput: true,\n generateId: function() {\n return latestId++;\n },\n appendToBody: false,\n spinnerEnabled: false,\n spinnerClass: 'glyphicon glyphicon-refresh ui-select-spin',\n backspaceReset: true\n})\n\n// See Rename minErr and make it accessible from outside https://github.com/angular/angular.js/issues/6913\n.service('uiSelectMinErr', function() {\n var minErr = angular.$$minErr('ui.select');\n return function() {\n var error = minErr.apply(this, arguments);\n var message = error.message.replace(new RegExp('\\nhttp://errors.angularjs.org/.*'), '');\n return new Error(message);\n };\n})\n\n// Recreates old behavior of ng-transclude. Used internally.\n.directive('uisTranscludeAppend', function () {\n return {\n link: function (scope, element, attrs, ctrl, transclude) {\n transclude(scope, function (clone) {\n element.append(clone);\n });\n }\n };\n})\n\n/**\n * Highlights text that matches $select.search.\n *\n * Taken from AngularUI Bootstrap Typeahead\n * See https://github.com/angular-ui/bootstrap/blob/0.10.0/src/typeahead/typeahead.js#L340\n */\n.filter('highlight', function() {\n function escapeRegexp(queryToEscape) {\n return ('' + queryToEscape).replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n }\n\n return function(matchItem, query) {\n return query && matchItem ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '<span class=\"ui-select-highlight\">$&</span>') : matchItem;\n };\n})\n\n/**\n * A read-only equivalent of jQuery's offset function: http://api.jquery.com/offset/\n *\n * Taken from AngularUI Bootstrap Position:\n * See https://github.com/angular-ui/bootstrap/blob/master/src/position/position.js#L70\n */\n.factory('uisOffset',\n ['$document', '$window',\n function ($document, $window) {\n\n return function(element) {\n var boundingClientRect = element[0].getBoundingClientRect();\n return {\n width: boundingClientRect.width || element.prop('offsetWidth'),\n height: boundingClientRect.height || element.prop('offsetHeight'),\n top: boundingClientRect.top + ($window.pageYOffset || $document[0].documentElement.scrollTop),\n left: boundingClientRect.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft)\n };\n };\n}]);\n\n/**\n * Debounces functions\n *\n * Taken from UI Bootstrap $$debounce source code\n * See https://github.com/angular-ui/bootstrap/blob/master/src/debounce/debounce.js\n *\n */\nuis.factory('$$uisDebounce', ['$timeout', function($timeout) {\n return function(callback, debounceTime) {\n var timeoutPromise;\n\n return function() {\n var self = this;\n var args = Array.prototype.slice.call(arguments);\n if (timeoutPromise) {\n $timeout.cancel(timeoutPromise);\n }\n\n timeoutPromise = $timeout(function() {\n callback.apply(self, args);\n }, debounceTime);\n };\n };\n}]);\n\nuis.directive('uiSelectChoices',\n ['uiSelectConfig', 'uisRepeatParser', 'uiSelectMinErr', '$compile', '$window',\n function(uiSelectConfig, RepeatParser, uiSelectMinErr, $compile, $window) {\n\n return {\n restrict: 'EA',\n require: '^uiSelect',\n replace: true,\n transclude: true,\n templateUrl: function(tElement) {\n // Needed so the uiSelect can detect the transcluded content\n tElement.addClass('ui-select-choices');\n\n // Gets theme attribute from parent (ui-select)\n var theme = tElement.parent().attr('theme') || uiSelectConfig.theme;\n return theme + '/choices.tpl.html';\n },\n\n compile: function(tElement, tAttrs) {\n\n if (!tAttrs.repeat) throw uiSelectMinErr('repeat', \"Expected 'repeat' expression.\");\n\n // var repeat = RepeatParser.parse(attrs.repeat);\n var groupByExp = tAttrs.groupBy;\n var groupFilterExp = tAttrs.groupFilter;\n\n if (groupByExp) {\n var groups = tElement.querySelectorAll('.ui-select-choices-group');\n if (groups.length !== 1) throw uiSelectMinErr('rows', \"Expected 1 .ui-select-choices-group but got '{0}'.\", groups.length);\n groups.attr('ng-repeat', RepeatParser.getGroupNgRepeatExpression());\n }\n\n var parserResult = RepeatParser.parse(tAttrs.repeat);\n\n var choices = tElement.querySelectorAll('.ui-select-choices-row');\n if (choices.length !== 1) {\n throw uiSelectMinErr('rows', \"Expected 1 .ui-select-choices-row but got '{0}'.\", choices.length);\n }\n\n choices.attr('ng-repeat', parserResult.repeatExpression(groupByExp))\n .attr('ng-if', '$select.open'); //Prevent unnecessary watches when dropdown is closed\n\n\n var rowsInner = tElement.querySelectorAll('.ui-select-choices-row-inner');\n if (rowsInner.length !== 1) {\n throw uiSelectMinErr('rows', \"Expected 1 .ui-select-choices-row-inner but got '{0}'.\", rowsInner.length);\n }\n rowsInner.attr('uis-transclude-append', ''); //Adding uisTranscludeAppend directive to row element after choices element has ngRepeat\n\n // If IE8 then need to target rowsInner to apply the ng-click attr as choices will not capture the event.\n var clickTarget = $window.document.addEventListener ? choices : rowsInner;\n clickTarget.attr('ng-click', '$select.select(' + parserResult.itemName + ',$select.skipFocusser,$event)');\n\n return function link(scope, element, attrs, $select) {\n\n\n $select.parseRepeatAttr(attrs.repeat, groupByExp, groupFilterExp); //Result ready at $select.parserResult\n $select.disableChoiceExpression = attrs.uiDisableChoice;\n $select.onHighlightCallback = attrs.onHighlight;\n $select.minimumInputLength = parseInt(attrs.minimumInputLength) || 0;\n $select.dropdownPosition = attrs.position ? attrs.position.toLowerCase() : uiSelectConfig.dropdownPosition;\n\n scope.$watch('$select.search', function(newValue) {\n if(newValue && !$select.open && $select.multiple) $select.activate(false, true);\n $select.activeIndex = $select.tagging.isActivated ? -1 : 0;\n if (!attrs.minimumInputLength || $select.search.length >= attrs.minimumInputLength) {\n $select.refresh(attrs.refresh);\n } else {\n $select.items = [];\n }\n });\n\n attrs.$observe('refreshDelay', function() {\n // $eval() is needed otherwise we get a string instead of a number\n var refreshDelay = scope.$eval(attrs.refreshDelay);\n $select.refreshDelay = refreshDelay !== undefined ? refreshDelay : uiSelectConfig.refreshDelay;\n });\n\n scope.$watch('$select.open', function(open) {\n if (open) {\n tElement.attr('role', 'listbox');\n $select.refresh(attrs.refresh);\n } else {\n element.removeAttr('role');\n }\n });\n };\n }\n };\n}]);\n\n/**\n * Contains ui-select \"intelligence\".\n *\n * The goal is to limit dependency on the DOM whenever possible and\n * put as much logic in the controller (instead of the link functions) as possible so it can be easily tested.\n */\nuis.controller('uiSelectCtrl',\n ['$scope', '$element', '$timeout', '$filter', '$$uisDebounce', 'uisRepeatParser', 'uiSelectMinErr', 'uiSelectConfig', '$parse', '$injector', '$window',\n function($scope, $element, $timeout, $filter, $$uisDebounce, RepeatParser, uiSelectMinErr, uiSelectConfig, $parse, $injector, $window) {\n\n var ctrl = this;\n\n var EMPTY_SEARCH = '';\n\n ctrl.placeholder = uiSelectConfig.placeholder;\n ctrl.searchEnabled = uiSelectConfig.searchEnabled;\n ctrl.sortable = uiSelectConfig.sortable;\n ctrl.refreshDelay = uiSelectConfig.refreshDelay;\n ctrl.paste = uiSelectConfig.paste;\n ctrl.resetSearchInput = uiSelectConfig.resetSearchInput;\n ctrl.refreshing = false;\n ctrl.spinnerEnabled = uiSelectConfig.spinnerEnabled;\n ctrl.spinnerClass = uiSelectConfig.spinnerClass;\n ctrl.removeSelected = uiSelectConfig.removeSelected; //If selected item(s) should be removed from dropdown list\n ctrl.closeOnSelect = true; //Initialized inside uiSelect directive link function\n ctrl.skipFocusser = false; //Set to true to avoid returning focus to ctrl when item is selected\n ctrl.search = EMPTY_SEARCH;\n\n ctrl.activeIndex = 0; //Dropdown of choices\n ctrl.items = []; //All available choices\n\n ctrl.open = false;\n ctrl.focus = false;\n ctrl.disabled = false;\n ctrl.selected = undefined;\n\n ctrl.dropdownPosition = 'auto';\n\n ctrl.focusser = undefined; //Reference to input element used to handle focus events\n ctrl.multiple = undefined; // Initialized inside uiSelect directive link function\n ctrl.disableChoiceExpression = undefined; // Initialized inside uiSelectChoices directive link function\n ctrl.tagging = {isActivated: false, fct: undefined};\n ctrl.taggingTokens = {isActivated: false, tokens: undefined};\n ctrl.lockChoiceExpression = undefined; // Initialized inside uiSelectMatch directive link function\n ctrl.clickTriggeredSelect = false;\n ctrl.$filter = $filter;\n ctrl.$element = $element;\n\n // Use $injector to check for $animate and store a reference to it\n ctrl.$animate = (function () {\n try {\n return $injector.get('$animate');\n } catch (err) {\n // $animate does not exist\n return null;\n }\n })();\n\n ctrl.searchInput = $element.querySelectorAll('input.ui-select-search');\n if (ctrl.searchInput.length !== 1) {\n throw uiSelectMinErr('searchInput', \"Expected 1 input.ui-select-search but got '{0}'.\", ctrl.searchInput.length);\n }\n\n ctrl.isEmpty = function() {\n return isNil(ctrl.selected) || ctrl.selected === '' || (ctrl.multiple && ctrl.selected.length === 0);\n };\n\n function _findIndex(collection, predicate, thisArg){\n if (collection.findIndex){\n return collection.findIndex(predicate, thisArg);\n } else {\n var list = Object(collection);\n var length = list.length >>> 0;\n var value;\n\n for (var i = 0; i < length; i++) {\n value = list[i];\n if (predicate.call(thisArg, value, i, list)) {\n return i;\n }\n }\n return -1;\n }\n }\n\n // Most of the time the user does not want to empty the search input when in typeahead mode\n function _resetSearchInput() {\n if (ctrl.resetSearchInput) {\n ctrl.search = EMPTY_SEARCH;\n //reset activeIndex\n if (ctrl.selected && ctrl.items.length && !ctrl.multiple) {\n ctrl.activeIndex = _findIndex(ctrl.items, function(item){\n return angular.equals(this, item);\n }, ctrl.selected);\n }\n }\n }\n\n function _groupsFilter(groups, groupNames) {\n var i, j, result = [];\n for(i = 0; i < groupNames.length ;i++){\n for(j = 0; j < groups.length ;j++){\n if(groups[j].name == [groupNames[i]]){\n result.push(groups[j]);\n }\n }\n }\n return result;\n }\n\n // When the user clicks on ui-select, displays the dropdown list\n ctrl.activate = function(initSearchValue, avoidReset) {\n if (!ctrl.disabled && !ctrl.open) {\n if(!avoidReset) _resetSearchInput();\n\n $scope.$broadcast('uis:activate');\n ctrl.open = true;\n ctrl.activeIndex = ctrl.activeIndex >= ctrl.items.length ? 0 : ctrl.activeIndex;\n // ensure that the index is set to zero for tagging variants\n // that where first option is auto-selected\n if ( ctrl.activeIndex === -1 && ctrl.taggingLabel !== false ) {\n ctrl.activeIndex = 0;\n }\n\n var container = $element.querySelectorAll('.ui-select-choices-content');\n var searchInput = $element.querySelectorAll('.ui-select-search');\n if (ctrl.$animate && ctrl.$animate.on && ctrl.$animate.enabled(container[0])) {\n var animateHandler = function(elem, phase) {\n if (phase === 'start' && ctrl.items.length === 0) {\n // Only focus input after the animation has finished\n ctrl.$animate.off('removeClass', searchInput[0], animateHandler);\n $timeout(function () {\n ctrl.focusSearchInput(initSearchValue);\n });\n } else if (phase === 'close') {\n // Only focus input after the animation has finished\n ctrl.$animate.off('enter', container[0], animateHandler);\n $timeout(function () {\n ctrl.focusSearchInput(initSearchValue);\n });\n }\n };\n\n if (ctrl.items.length > 0) {\n ctrl.$animate.on('enter', container[0], animateHandler);\n } else {\n ctrl.$animate.on('removeClass', searchInput[0], animateHandler);\n }\n } else {\n $timeout(function () {\n ctrl.focusSearchInput(initSearchValue);\n if(!ctrl.tagging.isActivated && ctrl.items.length > 1) {\n _ensureHighlightVisible();\n }\n });\n }\n }\n else if (ctrl.open && !ctrl.searchEnabled) {\n // Close the selection if we don't have search enabled, and we click on the select again\n ctrl.close();\n }\n };\n\n ctrl.focusSearchInput = function (initSearchValue) {\n ctrl.search = initSearchValue || ctrl.search;\n ctrl.searchInput[0].focus();\n };\n\n ctrl.findGroupByName = function(name) {\n return ctrl.groups && ctrl.groups.filter(function(group) {\n return group.name === name;\n })[0];\n };\n\n ctrl.parseRepeatAttr = function(repeatAttr, groupByExp, groupFilterExp) {\n function updateGroups(items) {\n var groupFn = $scope.$eval(groupByExp);\n ctrl.groups = [];\n angular.forEach(items, function(item) {\n var groupName = angular.isFunction(groupFn) ? groupFn(item) : item[groupFn];\n var group = ctrl.findGroupByName(groupName);\n if(group) {\n group.items.push(item);\n }\n else {\n ctrl.groups.push({name: groupName, items: [item]});\n }\n });\n if(groupFilterExp){\n var groupFilterFn = $scope.$eval(groupFilterExp);\n if( angular.isFunction(groupFilterFn)){\n ctrl.groups = groupFilterFn(ctrl.groups);\n } else if(angular.isArray(groupFilterFn)){\n ctrl.groups = _groupsFilter(ctrl.groups, groupFilterFn);\n }\n }\n ctrl.items = [];\n ctrl.groups.forEach(function(group) {\n ctrl.items = ctrl.items.concat(group.items);\n });\n }\n\n function setPlainItems(items) {\n ctrl.items = items || [];\n }\n\n ctrl.setItemsFn = groupByExp ? updateGroups : setPlainItems;\n\n ctrl.parserResult = RepeatParser.parse(repeatAttr);\n\n ctrl.isGrouped = !!groupByExp;\n ctrl.itemProperty = ctrl.parserResult.itemName;\n\n //If collection is an Object, convert it to Array\n\n var originalSource = ctrl.parserResult.source;\n\n //When an object is used as source, we better create an array and use it as 'source'\n var createArrayFromObject = function(){\n var origSrc = originalSource($scope);\n $scope.$uisSource = Object.keys(origSrc).map(function(v){\n var result = {};\n result[ctrl.parserResult.keyName] = v;\n result.value = origSrc[v];\n return result;\n });\n };\n\n if (ctrl.parserResult.keyName){ // Check for (key,value) syntax\n createArrayFromObject();\n ctrl.parserResult.source = $parse('$uisSource' + ctrl.parserResult.filters);\n $scope.$watch(originalSource, function(newVal, oldVal){\n if (newVal !== oldVal) createArrayFromObject();\n }, true);\n }\n\n ctrl.refreshItems = function (data){\n data = data || ctrl.parserResult.source($scope);\n var selectedItems = ctrl.selected;\n //TODO should implement for single mode removeSelected\n if (ctrl.isEmpty() || (angular.isArray(selectedItems) && !selectedItems.length) || !ctrl.multiple || !ctrl.removeSelected) {\n ctrl.setItemsFn(data);\n }else{\n if ( data !== undefined && data !== null ) {\n var filteredItems = data.filter(function(i) {\n return angular.isArray(selectedItems) ? selectedItems.every(function(selectedItem) {\n return !angular.equals(i, selectedItem);\n }) : !angular.equals(i, selectedItems);\n });\n ctrl.setItemsFn(filteredItems);\n }\n }\n if (ctrl.dropdownPosition === 'auto' || ctrl.dropdownPosition === 'up'){\n $scope.calculateDropdownPos();\n }\n $scope.$broadcast('uis:refresh');\n };\n\n // See https://github.com/angular/angular.js/blob/v1.2.15/src/ng/directive/ngRepeat.js#L259\n $scope.$watchCollection(ctrl.parserResult.source, function(items) {\n if (items === undefined || items === null) {\n // If the user specifies undefined or null => reset the collection\n // Special case: items can be undefined if the user did not initialized the collection on the scope\n // i.e $scope.addresses = [] is missing\n ctrl.items = [];\n } else {\n if (!angular.isArray(items)) {\n throw uiSelectMinErr('items', \"Expected an array but got '{0}'.\", items);\n } else {\n //Remove already selected items (ex: while searching)\n //TODO Should add a test\n ctrl.refreshItems(items);\n\n //update the view value with fresh data from items, if there is a valid model value\n if(angular.isDefined(ctrl.ngModel.$modelValue)) {\n ctrl.ngModel.$modelValue = null; //Force scope model value and ngModel value to be out of sync to re-run formatters\n }\n }\n }\n });\n\n };\n\n var _refreshDelayPromise;\n\n /**\n * Typeahead mode: lets the user refresh the collection using his own function.\n *\n * See Expose $select.search for external / remote filtering https://github.com/angular-ui/ui-select/pull/31\n */\n ctrl.refresh = function(refreshAttr) {\n if (refreshAttr !== undefined) {\n // Debounce\n // See https://github.com/angular-ui/bootstrap/blob/0.10.0/src/typeahead/typeahead.js#L155\n // FYI AngularStrap typeahead does not have debouncing: https://github.com/mgcrea/angular-strap/blob/v2.0.0-rc.4/src/typeahead/typeahead.js#L177\n if (_refreshDelayPromise) {\n $timeout.cancel(_refreshDelayPromise);\n }\n _refreshDelayPromise = $timeout(function() {\n if ($scope.$select.search.length >= $scope.$select.minimumInputLength) {\n var refreshPromise = $scope.$eval(refreshAttr);\n if (refreshPromise && angular.isFunction(refreshPromise.then) && !ctrl.refreshing) {\n ctrl.refreshing = true;\n refreshPromise.finally(function() {\n ctrl.refreshing = false;\n });\n }\n }\n }, ctrl.refreshDelay);\n }\n };\n\n ctrl.isActive = function(itemScope) {\n if ( !ctrl.open ) {\n return false;\n }\n var itemIndex = ctrl.items.indexOf(itemScope[ctrl.itemProperty]);\n var isActive = itemIndex == ctrl.activeIndex;\n\n if ( !isActive || itemIndex < 0 ) {\n return false;\n }\n\n if (isActive && !angular.isUndefined(ctrl.onHighlightCallback)) {\n itemScope.$eval(ctrl.onHighlightCallback);\n }\n\n return isActive;\n };\n\n var _isItemSelected = function (item) {\n return (ctrl.selected && angular.isArray(ctrl.selected) &&\n ctrl.selected.filter(function (selection) { return angular.equals(selection, item); }).length > 0);\n };\n\n var disabledItems = [];\n\n function _updateItemDisabled(item, isDisabled) {\n var disabledItemIndex = disabledItems.indexOf(item);\n if (isDisabled && disabledItemIndex === -1) {\n disabledItems.push(item);\n }\n\n if (!isDisabled && disabledItemIndex > -1) {\n disabledItems.splice(disabledItemIndex, 1);\n }\n }\n\n function _isItemDisabled(item) {\n return disabledItems.indexOf(item) > -1;\n }\n\n ctrl.isDisabled = function(itemScope) {\n\n if (!ctrl.open) return;\n\n var item = itemScope[ctrl.itemProperty];\n var itemIndex = ctrl.items.indexOf(item);\n var isDisabled = false;\n\n if (itemIndex >= 0 && (angular.isDefined(ctrl.disableChoiceExpression) || ctrl.multiple)) {\n\n if (item.isTag) return false;\n\n if (ctrl.multiple) {\n isDisabled = _isItemSelected(item);\n }\n\n if (!isDisabled && angular.isDefined(ctrl.disableChoiceExpression)) {\n isDisabled = !!(itemScope.$eval(ctrl.disableChoiceExpression));\n }\n\n _updateItemDisabled(item, isDisabled);\n }\n\n return isDisabled;\n };\n\n\n // When the user selects an item with ENTER or clicks the dropdown\n ctrl.select = function(item, skipFocusser, $event) {\n if (isNil(item) || !_isItemDisabled(item)) {\n\n if ( ! ctrl.items && ! ctrl.search && ! ctrl.tagging.isActivated) return;\n\n if (!item || !_isItemDisabled(item)) {\n // if click is made on existing item, prevent from tagging, ctrl.search does not matter\n ctrl.clickTriggeredSelect = false;\n if($event && ($event.type === 'click' || $event.type === 'touchend') && item)\n ctrl.clickTriggeredSelect = true;\n\n if(ctrl.tagging.isActivated && ctrl.clickTriggeredSelect === false) {\n // if taggingLabel is disabled and item is undefined we pull from ctrl.search\n if ( ctrl.taggingLabel === false ) {\n if ( ctrl.activeIndex < 0 ) {\n if (item === undefined) {\n item = ctrl.tagging.fct !== undefined ? ctrl.tagging.fct(ctrl.search) : ctrl.search;\n }\n if (!item || angular.equals( ctrl.items[0], item ) ) {\n return;\n }\n } else {\n // keyboard nav happened first, user selected from dropdown\n item = ctrl.items[ctrl.activeIndex];\n }\n } else {\n // tagging always operates at index zero, taggingLabel === false pushes\n // the ctrl.search value without having it injected\n if ( ctrl.activeIndex === 0 ) {\n // ctrl.tagging pushes items to ctrl.items, so we only have empty val\n // for `item` if it is a detected duplicate\n if ( item === undefined ) return;\n\n // create new item on the fly if we don't already have one;\n // use tagging function if we have one\n if ( ctrl.tagging.fct !== undefined && typeof item === 'string' ) {\n item = ctrl.tagging.fct(item);\n if (!item) return;\n // if item type is 'string', apply the tagging label\n } else if ( typeof item === 'string' ) {\n // trim the trailing space\n item = item.replace(ctrl.taggingLabel,'').trim();\n }\n }\n }\n // search ctrl.selected for dupes potentially caused by tagging and return early if found\n if (_isItemSelected(item)) {\n ctrl.close(skipFocusser);\n return;\n }\n }\n _resetSearchInput();\n $scope.$broadcast('uis:select', item);\n\n if (ctrl.closeOnSelect) {\n ctrl.close(skipFocusser);\n }\n }\n }\n };\n\n // Closes the dropdown\n ctrl.close = function(skipFocusser) {\n if (!ctrl.open) return;\n if (ctrl.ngModel && ctrl.ngModel.$setTouched) ctrl.ngModel.$setTouched();\n ctrl.open = false;\n _resetSearchInput();\n $scope.$broadcast('uis:close', skipFocusser);\n\n };\n\n ctrl.setFocus = function(){\n if (!ctrl.focus) ctrl.focusInput[0].focus();\n };\n\n ctrl.clear = function($event) {\n ctrl.select(null);\n $event.stopPropagation();\n $timeout(function() {\n ctrl.focusser[0].focus();\n }, 0, false);\n };\n\n // Toggle dropdown\n ctrl.toggle = function(e) {\n if (ctrl.open) {\n ctrl.close();\n e.preventDefault();\n e.stopPropagation();\n } else {\n ctrl.activate();\n }\n };\n\n // Set default function for locked choices - avoids unnecessary\n // logic if functionality is not being used\n ctrl.isLocked = function () {\n return false;\n };\n\n $scope.$watch(function () {\n return angular.isDefined(ctrl.lockChoiceExpression) && ctrl.lockChoiceExpression !== \"\";\n }, _initaliseLockedChoices);\n\n function _initaliseLockedChoices(doInitalise) {\n if(!doInitalise) return;\n\n var lockedItems = [];\n\n function _updateItemLocked(item, isLocked) {\n var lockedItemIndex = lockedItems.indexOf(item);\n if (isLocked && lockedItemIndex === -1) {\n lockedItems.push(item);\n }\n\n if (!isLocked && lockedItemIndex > -1) {\n lockedItems.splice(lockedItemIndex, 1);\n }\n }\n\n function _isItemlocked(item) {\n return lockedItems.indexOf(item) > -1;\n }\n\n ctrl.isLocked = function (itemScope, itemIndex) {\n var isLocked = false,\n item = ctrl.selected[itemIndex];\n\n if(item) {\n if (itemScope) {\n isLocked = !!(itemScope.$eval(ctrl.lockChoiceExpression));\n _updateItemLocked(item, isLocked);\n } else {\n isLocked = _isItemlocked(item);\n }\n }\n\n return isLocked;\n };\n }\n\n\n var sizeWatch = null;\n var updaterScheduled = false;\n ctrl.sizeSearchInput = function() {\n\n var input = ctrl.searchInput[0],\n container = ctrl.$element[0],\n calculateContainerWidth = function() {\n // Return the container width only if the search input is visible\n return container.clientWidth * !!input.offsetParent;\n },\n updateIfVisible = function(containerWidth) {\n if (containerWidth === 0) {\n return false;\n }\n var inputWidth = containerWidth - input.offsetLeft;\n if (inputWidth < 50) inputWidth = containerWidth;\n ctrl.searchInput.css('width', inputWidth+'px');\n return true;\n };\n\n ctrl.searchInput.css('width', '10px');\n $timeout(function() { //Give tags time to render correctly\n if (sizeWatch === null && !updateIfVisible(calculateContainerWidth())) {\n sizeWatch = $scope.$watch(function() {\n if (!updaterScheduled) {\n updaterScheduled = true;\n $scope.$$postDigest(function() {\n updaterScheduled = false;\n if (updateIfVisible(calculateContainerWidth())) {\n sizeWatch();\n sizeWatch = null;\n }\n });\n }\n }, angular.noop);\n }\n });\n };\n\n function _handleDropDownSelection(key) {\n var processed = true;\n switch (key) {\n case KEY.DOWN:\n if (!ctrl.open && ctrl.multiple) ctrl.activate(false, true); //In case its the search input in 'multiple' mode\n else if (ctrl.activeIndex < ctrl.items.length - 1) {\n var idx = ++ctrl.activeIndex;\n while(_isItemDisabled(ctrl.items[idx]) && idx < ctrl.items.length) {\n ctrl.activeIndex = ++idx;\n }\n }\n break;\n case KEY.UP:\n var minActiveIndex = (ctrl.search.length === 0 && ctrl.tagging.isActivated) ? -1 : 0;\n if (!ctrl.open && ctrl.multiple) ctrl.activate(false, true); //In case its the search input in 'multiple' mode\n else if (ctrl.activeIndex > minActiveIndex) {\n var idxmin = --ctrl.activeIndex;\n while(_isItemDisabled(ctrl.items[idxmin]) && idxmin > minActiveIndex) {\n ctrl.activeIndex = --idxmin;\n }\n }\n break;\n case KEY.TAB:\n if (!ctrl.multiple || ctrl.open) ctrl.select(ctrl.items[ctrl.activeIndex], true);\n break;\n case KEY.ENTER:\n if(ctrl.open && (ctrl.tagging.isActivated || ctrl.activeIndex >= 0)){\n ctrl.select(ctrl.items[ctrl.activeIndex], ctrl.skipFocusser); // Make sure at least one dropdown item is highlighted before adding if not in tagging mode\n } else {\n ctrl.activate(false, true); //In case its the search input in 'multiple' mode\n }\n break;\n case KEY.ESC:\n ctrl.close();\n break;\n default:\n processed = false;\n }\n return processed;\n }\n\n // Bind to keyboard shortcuts\n ctrl.searchInput.on('keydown', function(e) {\n\n var key = e.which;\n\n if (~[KEY.ENTER,KEY.ESC].indexOf(key)){\n e.preventDefault();\n e.stopPropagation();\n }\n\n $scope.$apply(function() {\n\n var tagged = false;\n\n if (ctrl.items.length > 0 || ctrl.tagging.isActivated) {\n if(!_handleDropDownSelection(key) && !ctrl.searchEnabled) {\n e.preventDefault();\n e.stopPropagation();\n }\n if ( ctrl.taggingTokens.isActivated ) {\n for (var i = 0; i < ctrl.taggingTokens.tokens.length; i++) {\n if ( ctrl.taggingTokens.tokens[i] === KEY.MAP[e.keyCode] ) {\n // make sure there is a new value to push via tagging\n if ( ctrl.search.length > 0 ) {\n tagged = true;\n }\n }\n }\n if ( tagged ) {\n $timeout(function() {\n ctrl.searchInput.triggerHandler('tagged');\n var newItem = ctrl.search.replace(KEY.MAP[e.keyCode],'').trim();\n if ( ctrl.tagging.fct ) {\n newItem = ctrl.tagging.fct( newItem );\n }\n if (newItem) ctrl.select(newItem, true);\n });\n }\n }\n }\n\n });\n\n if(KEY.isVerticalMovement(key) && ctrl.items.length > 0){\n _ensureHighlightVisible();\n }\n\n if (key === KEY.ENTER || key === KEY.ESC) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n });\n\n ctrl.searchInput.on('paste', function (e) {\n var data;\n\n if (window.clipboardData && window.clipboardData.getData) { // IE\n data = window.clipboardData.getData('Text');\n } else {\n data = (e.originalEvent || e).clipboardData.getData('text/plain');\n }\n\n // Prepend the current input field text to the paste buffer.\n data = ctrl.search + data;\n\n if (data && data.length > 0) {\n // If tagging try to split by tokens and add items\n if (ctrl.taggingTokens.isActivated) {\n var items = [];\n for (var i = 0; i < ctrl.taggingTokens.tokens.length; i++) { // split by first token that is contained in data\n var separator = KEY.toSeparator(ctrl.taggingTokens.tokens[i]) || ctrl.taggingTokens.tokens[i];\n if (data.indexOf(separator) > -1) {\n items = data.split(separator);\n break; // only split by one token\n }\n }\n if (items.length === 0) {\n items = [data];\n }\n var oldsearch = ctrl.search;\n angular.forEach(items, function (item) {\n var newItem = ctrl.tagging.fct ? ctrl.tagging.fct(item) : item;\n if (newItem) {\n ctrl.select(newItem, true);\n }\n });\n ctrl.search = oldsearch || EMPTY_SEARCH;\n e.preventDefault();\n e.stopPropagation();\n } else if (ctrl.paste) {\n ctrl.paste(data);\n ctrl.search = EMPTY_SEARCH;\n e.preventDefault();\n e.stopPropagation();\n }\n }\n });\n\n ctrl.searchInput.on('tagged', function() {\n $timeout(function() {\n _resetSearchInput();\n });\n });\n\n // See https://github.com/ivaynberg/select2/blob/3.4.6/select2.js#L1431\n function _ensureHighlightVisible() {\n var container = $element.querySelectorAll('.ui-select-choices-content');\n var choices = container.querySelectorAll('.ui-select-choices-row');\n if (choices.length < 1) {\n throw uiSelectMinErr('choices', \"Expected multiple .ui-select-choices-row but got '{0}'.\", choices.length);\n }\n\n if (ctrl.activeIndex < 0) {\n return;\n }\n\n var highlighted = choices[ctrl.activeIndex];\n var posY = highlighted.offsetTop + highlighted.clientHeight - container[0].scrollTop;\n var height = container[0].offsetHeight;\n\n if (posY > height) {\n container[0].scrollTop += posY - height;\n } else if (posY < highlighted.clientHeight) {\n if (ctrl.isGrouped && ctrl.activeIndex === 0)\n container[0].scrollTop = 0; //To make group header visible when going all the way up\n else\n container[0].scrollTop -= highlighted.clientHeight - posY;\n }\n }\n\n var onResize = $$uisDebounce(function() {\n ctrl.sizeSearchInput();\n }, 50);\n\n angular.element($window).bind('resize', onResize);\n\n $scope.$on('$destroy', function() {\n ctrl.searchInput.off('keyup keydown tagged blur paste');\n angular.element($window).off('resize', onResize);\n });\n\n $scope.$watch('$select.activeIndex', function(activeIndex) {\n if (activeIndex)\n $element.find('input').attr(\n 'aria-activedescendant',\n 'ui-select-choices-row-' + ctrl.generatedId + '-' + activeIndex);\n });\n\n $scope.$watch('$select.open', function(open) {\n if (!open)\n $element.find('input').removeAttr('aria-activedescendant');\n });\n}]);\n\nuis.directive('uiSelect',\n ['$document', 'uiSelectConfig', 'uiSelectMinErr', 'uisOffset', '$compile', '$parse', '$timeout',\n function($document, uiSelectConfig, uiSelectMinErr, uisOffset, $compile, $parse, $timeout) {\n\n return {\n restrict: 'EA',\n templateUrl: function(tElement, tAttrs) {\n var theme = tAttrs.theme || uiSelectConfig.theme;\n return theme + (angular.isDefined(tAttrs.multiple) ? '/select-multiple.tpl.html' : '/select.tpl.html');\n },\n replace: true,\n transclude: true,\n require: ['uiSelect', '^ngModel'],\n scope: true,\n\n controller: 'uiSelectCtrl',\n controllerAs: '$select',\n compile: function(tElement, tAttrs) {\n\n // Allow setting ngClass on uiSelect\n var match = /{(.*)}\\s*{(.*)}/.exec(tAttrs.ngClass);\n if(match) {\n var combined = '{'+ match[1] +', '+ match[2] +'}';\n tAttrs.ngClass = combined;\n tElement.attr('ng-class', combined);\n }\n\n //Multiple or Single depending if multiple attribute presence\n if (angular.isDefined(tAttrs.multiple))\n tElement.append('<ui-select-multiple/>').removeAttr('multiple');\n else\n tElement.append('<ui-select-single/>');\n\n if (tAttrs.inputId)\n tElement.querySelectorAll('input.ui-select-search')[0].id = tAttrs.inputId;\n\n return function(scope, element, attrs, ctrls, transcludeFn) {\n\n var $select = ctrls[0];\n var ngModel = ctrls[1];\n\n $select.generatedId = uiSelectConfig.generateId();\n $select.baseTitle = attrs.title || 'Select box';\n $select.focusserTitle = $select.baseTitle + ' focus';\n $select.focusserId = 'focusser-' + $select.generatedId;\n\n $select.closeOnSelect = function() {\n if (angular.isDefined(attrs.closeOnSelect)) {\n return $parse(attrs.closeOnSelect)();\n } else {\n return uiSelectConfig.closeOnSelect;\n }\n }();\n\n scope.$watch('skipFocusser', function() {\n var skipFocusser = scope.$eval(attrs.skipFocusser);\n $select.skipFocusser = skipFocusser !== undefined ? skipFocusser : uiSelectConfig.skipFocusser;\n });\n\n $select.onSelectCallback = $parse(attrs.onSelect);\n $select.onRemoveCallback = $parse(attrs.onRemove);\n\n //Set reference to ngModel from uiSelectCtrl\n $select.ngModel = ngModel;\n\n $select.choiceGrouped = function(group){\n return $select.isGrouped && group && group.name;\n };\n\n if(attrs.tabindex){\n attrs.$observe('tabindex', function(value) {\n $select.focusInput.attr('tabindex', value);\n element.removeAttr('tabindex');\n });\n }\n\n scope.$watch(function () { return scope.$eval(attrs.searchEnabled); }, function(newVal) {\n $select.searchEnabled = newVal !== undefined ? newVal : uiSelectConfig.searchEnabled;\n });\n\n scope.$watch('sortable', function() {\n var sortable = scope.$eval(attrs.sortable);\n $select.sortable = sortable !== undefined ? sortable : uiSelectConfig.sortable;\n });\n\n attrs.$observe('backspaceReset', function() {\n // $eval() is needed otherwise we get a string instead of a boolean\n var backspaceReset = scope.$eval(attrs.backspaceReset);\n $select.backspaceReset = backspaceReset !== undefined ? backspaceReset : true;\n });\n\n attrs.$observe('limit', function() {\n //Limit the number of selections allowed\n $select.limit = (angular.isDefined(attrs.limit)) ? parseInt(attrs.limit, 10) : undefined;\n });\n\n scope.$watch('removeSelected', function() {\n var removeSelected = scope.$eval(attrs.removeSelected);\n $select.removeSelected = removeSelected !== undefined ? removeSelected : uiSelectConfig.removeSelected;\n });\n\n attrs.$observe('disabled', function() {\n // No need to use $eval() (thanks to ng-disabled) since we already get a boolean instead of a string\n $select.disabled = attrs.disabled !== undefined ? attrs.disabled : false;\n });\n\n attrs.$observe('resetSearchInput', function() {\n // $eval() is needed otherwise we get a string instead of a boolean\n var resetSearchInput = scope.$eval(attrs.resetSearchInput);\n $select.resetSearchInput = resetSearchInput !== undefined ? resetSearchInput : true;\n });\n\n attrs.$observe('paste', function() {\n $select.paste = scope.$eval(attrs.paste);\n });\n\n attrs.$observe('tagging', function() {\n if(attrs.tagging !== undefined)\n {\n // $eval() is needed otherwise we get a string instead of a boolean\n var taggingEval = scope.$eval(attrs.tagging);\n $select.tagging = {isActivated: true, fct: taggingEval !== true ? taggingEval : undefined};\n }\n else\n {\n $select.tagging = {isActivated: false, fct: undefined};\n }\n });\n\n attrs.$observe('taggingLabel', function() {\n if(attrs.tagging !== undefined )\n {\n // check eval for FALSE, in this case, we disable the labels\n // associated with tagging\n if ( attrs.taggingLabel === 'false' ) {\n $select.taggingLabel = false;\n }\n else\n {\n $select.taggingLabel = attrs.taggingLabel !== undefined ? attrs.taggingLabel : '(new)';\n }\n }\n });\n\n attrs.$observe('taggingTokens', function() {\n if (attrs.tagging !== undefined) {\n var tokens = attrs.taggingTokens !== undefined ? attrs.taggingTokens.split('|') : [',','ENTER'];\n $select.taggingTokens = {isActivated: true, tokens: tokens };\n }\n });\n\n attrs.$observe('spinnerEnabled', function() {\n // $eval() is needed otherwise we get a string instead of a boolean\n var spinnerEnabled = scope.$eval(attrs.spinnerEnabled);\n $select.spinnerEnabled = spinnerEnabled !== undefined ? spinnerEnabled : uiSelectConfig.spinnerEnabled;\n });\n\n attrs.$observe('spinnerClass', function() {\n var spinnerClass = attrs.spinnerClass;\n $select.spinnerClass = spinnerClass !== undefined ? attrs.spinnerClass : uiSelectConfig.spinnerClass;\n });\n\n //Automatically gets focus when loaded\n if (angular.isDefined(attrs.autofocus)){\n $timeout(function(){\n $select.setFocus();\n });\n }\n\n //Gets focus based on scope event name (e.g. focus-on='SomeEventName')\n if (angular.isDefined(attrs.focusOn)){\n scope.$on(attrs.focusOn, function() {\n $timeout(function(){\n $select.setFocus();\n });\n });\n }\n\n function onDocumentClick(e) {\n if (!$select.open) return; //Skip it if dropdown is close\n\n var contains = false;\n\n if (window.jQuery) {\n // Firefox 3.6 does not support element.contains()\n // See Node.contains https://developer.mozilla.org/en-US/docs/Web/API/Node.contains\n contains = window.jQuery.contains(element[0], e.target);\n } else {\n contains = element[0].contains(e.target);\n }\n\n if (!contains && !$select.clickTriggeredSelect) {\n var skipFocusser;\n if (!$select.skipFocusser) {\n //Will lose focus only with certain targets\n var focusableControls = ['input','button','textarea','select'];\n var targetController = angular.element(e.target).controller('uiSelect'); //To check if target is other ui-select\n skipFocusser = targetController && targetController !== $select; //To check if target is other ui-select\n if (!skipFocusser) skipFocusser = ~focusableControls.indexOf(e.target.tagName.toLowerCase()); //Check if target is input, button or textarea\n } else {\n skipFocusser = true;\n }\n $select.close(skipFocusser);\n scope.$digest();\n }\n $select.clickTriggeredSelect = false;\n }\n\n // See Click everywhere but here event http://stackoverflow.com/questions/12931369\n $document.on('click', onDocumentClick);\n\n scope.$on('$destroy', function() {\n $document.off('click', onDocumentClick);\n });\n\n // Move transcluded elements to their correct position in main template\n transcludeFn(scope, function(clone) {\n // See Transclude in AngularJS http://blog.omkarpatil.com/2012/11/transclude-in-angularjs.html\n\n // One day jqLite will be replaced by jQuery and we will be able to write:\n // var transcludedElement = clone.filter('.my-class')\n // instead of creating a hackish DOM element:\n var transcluded = angular.element('<div>').append(clone);\n\n var transcludedMatch = transcluded.querySelectorAll('.ui-select-match');\n transcludedMatch.removeAttr('ui-select-match'); //To avoid loop in case directive as attr\n transcludedMatch.removeAttr('data-ui-select-match'); // Properly handle HTML5 data-attributes\n if (transcludedMatch.length !== 1) {\n throw uiSelectMinErr('transcluded', \"Expected 1 .ui-select-match but got '{0}'.\", transcludedMatch.length);\n }\n element.querySelectorAll('.ui-select-match').replaceWith(transcludedMatch);\n\n var transcludedChoices = transcluded.querySelectorAll('.ui-select-choices');\n transcludedChoices.removeAttr('ui-select-choices'); //To avoid loop in case directive as attr\n transcludedChoices.removeAttr('data-ui-select-choices'); // Properly handle HTML5 data-attributes\n if (transcludedChoices.length !== 1) {\n throw uiSelectMinErr('transcluded', \"Expected 1 .ui-select-choices but got '{0}'.\", transcludedChoices.length);\n }\n element.querySelectorAll('.ui-select-choices').replaceWith(transcludedChoices);\n\n var transcludedNoChoice = transcluded.querySelectorAll('.ui-select-no-choice');\n transcludedNoChoice.removeAttr('ui-select-no-choice'); //To avoid loop in case directive as attr\n transcludedNoChoice.removeAttr('data-ui-select-no-choice'); // Properly handle HTML5 data-attributes\n if (transcludedNoChoice.length == 1) {\n element.querySelectorAll('.ui-select-no-choice').replaceWith(transcludedNoChoice);\n }\n });\n\n // Support for appending the select field to the body when its open\n var appendToBody = scope.$eval(attrs.appendToBody);\n if (appendToBody !== undefined ? appendToBody : uiSelectConfig.appendToBody) {\n scope.$watch('$select.open', function(isOpen) {\n if (isOpen) {\n positionDropdown();\n } else {\n resetDropdown();\n }\n });\n\n // Move the dropdown back to its original location when the scope is destroyed. Otherwise\n // it might stick around when the user routes away or the select field is otherwise removed\n scope.$on('$destroy', function() {\n resetDropdown();\n });\n }\n\n // Hold on to a reference to the .ui-select-container element for appendToBody support\n var placeholder = null,\n originalWidth = '';\n\n function positionDropdown() {\n // Remember the absolute position of the element\n var offset = uisOffset(element);\n\n // Clone the element into a placeholder element to take its original place in the DOM\n placeholder = angular.element('<div class=\"ui-select-placeholder\"></div>');\n placeholder[0].style.width = offset.width + 'px';\n placeholder[0].style.height = offset.height + 'px';\n element.after(placeholder);\n\n // Remember the original value of the element width inline style, so it can be restored\n // when the dropdown is closed\n originalWidth = element[0].style.width;\n\n // Now move the actual dropdown element to the end of the body\n $document.find('body').append(element);\n\n element[0].style.position = 'absolute';\n element[0].style.left = offset.left + 'px';\n element[0].style.top = offset.top + 'px';\n element[0].style.width = offset.width + 'px';\n }\n\n function resetDropdown() {\n if (placeholder === null) {\n // The dropdown has not actually been display yet, so there's nothing to reset\n return;\n }\n\n // Move the dropdown element back to its original location in the DOM\n placeholder.replaceWith(element);\n placeholder = null;\n\n element[0].style.position = '';\n element[0].style.left = '';\n element[0].style.top = '';\n element[0].style.width = originalWidth;\n\n // Set focus back on to the moved element\n $select.setFocus();\n }\n\n // Hold on to a reference to the .ui-select-dropdown element for direction support.\n var dropdown = null,\n directionUpClassName = 'direction-up';\n\n // Support changing the direction of the dropdown if there isn't enough space to render it.\n scope.$watch('$select.open', function() {\n\n if ($select.dropdownPosition === 'auto' || $select.dropdownPosition === 'up'){\n scope.calculateDropdownPos();\n }\n\n });\n\n var setDropdownPosUp = function(offset, offsetDropdown){\n\n offset = offset || uisOffset(element);\n offsetDropdown = offsetDropdown || uisOffset(dropdown);\n\n dropdown[0].style.position = 'absolute';\n dropdown[0].style.top = (offsetDropdown.height * -1) + 'px';\n element.addClass(directionUpClassName);\n\n };\n\n var setDropdownPosDown = function(offset, offsetDropdown){\n\n element.removeClass(directionUpClassName);\n\n offset = offset || uisOffset(element);\n offsetDropdown = offsetDropdown || uisOffset(dropdown);\n\n dropdown[0].style.position = '';\n dropdown[0].style.top = '';\n\n };\n\n var calculateDropdownPosAfterAnimation = function() {\n // Delay positioning the dropdown until all choices have been added so its height is correct.\n $timeout(function() {\n if ($select.dropdownPosition === 'up') {\n //Go UP\n setDropdownPosUp();\n } else {\n //AUTO\n element.removeClass(directionUpClassName);\n\n var offset = uisOffset(element);\n var offsetDropdown = uisOffset(dropdown);\n\n //https://code.google.com/p/chromium/issues/detail?id=342307#c4\n var scrollTop = $document[0].documentElement.scrollTop || $document[0].body.scrollTop; //To make it cross browser (blink, webkit, IE, Firefox).\n\n // Determine if the direction of the dropdown needs to be changed.\n if (offset.top + offset.height + offsetDropdown.height > scrollTop + $document[0].documentElement.clientHeight) {\n //Go UP\n setDropdownPosUp(offset, offsetDropdown);\n }else{\n //Go DOWN\n setDropdownPosDown(offset, offsetDropdown);\n }\n }\n\n // Display the dropdown once it has been positioned.\n dropdown[0].style.opacity = 1;\n });\n };\n\n var opened = false;\n \n scope.calculateDropdownPos = function() {\n if ($select.open) {\n dropdown = angular.element(element).querySelectorAll('.ui-select-dropdown');\n\n if (dropdown.length === 0) {\n return;\n }\n\n // Hide the dropdown so there is no flicker until $timeout is done executing.\n if ($select.search === '' && !opened) {\n dropdown[0].style.opacity = 0;\n opened = true;\n }\n\n if (!uisOffset(dropdown).height && $select.$animate && $select.$animate.on && $select.$animate.enabled(dropdown)) {\n var needsCalculated = true;\n\n $select.$animate.on('enter', dropdown, function (elem, phase) {\n if (phase === 'close' && needsCalculated) {\n calculateDropdownPosAfterAnimation();\n needsCalculated = false;\n }\n });\n } else {\n calculateDropdownPosAfterAnimation();\n }\n } else {\n if (dropdown === null || dropdown.length === 0) {\n return;\n }\n\n // Reset the position of the dropdown.\n dropdown[0].style.opacity = 0;\n dropdown[0].style.position = '';\n dropdown[0].style.top = '';\n element.removeClass(directionUpClassName);\n }\n };\n };\n }\n };\n}]);\n\nuis.directive('uiSelectMatch', ['uiSelectConfig', function(uiSelectConfig) {\n return {\n restrict: 'EA',\n require: '^uiSelect',\n replace: true,\n transclude: true,\n templateUrl: function(tElement) {\n // Needed so the uiSelect can detect the transcluded content\n tElement.addClass('ui-select-match');\n\n var parent = tElement.parent();\n // Gets theme attribute from parent (ui-select)\n var theme = getAttribute(parent, 'theme') || uiSelectConfig.theme;\n var multi = angular.isDefined(getAttribute(parent, 'multiple'));\n\n return theme + (multi ? '/match-multiple.tpl.html' : '/match.tpl.html'); \n },\n link: function(scope, element, attrs, $select) {\n $select.lockChoiceExpression = attrs.uiLockChoice;\n attrs.$observe('placeholder', function(placeholder) {\n $select.placeholder = placeholder !== undefined ? placeholder : uiSelectConfig.placeholder;\n });\n\n function setAllowClear(allow) {\n $select.allowClear = (angular.isDefined(allow)) ? (allow === '') ? true : (allow.toLowerCase() === 'true') : false;\n }\n\n attrs.$observe('allowClear', setAllowClear);\n setAllowClear(attrs.allowClear);\n\n if($select.multiple){\n $select.sizeSearchInput();\n }\n\n }\n };\n\n function getAttribute(elem, attribute) {\n if (elem[0].hasAttribute(attribute))\n return elem.attr(attribute);\n\n if (elem[0].hasAttribute('data-' + attribute))\n return elem.attr('data-' + attribute);\n\n if (elem[0].hasAttribute('x-' + attribute))\n return elem.attr('x-' + attribute);\n }\n}]);\n\nuis.directive('uiSelectMultiple', ['uiSelectMinErr','$timeout', function(uiSelectMinErr, $timeout) {\n return {\n restrict: 'EA',\n require: ['^uiSelect', '^ngModel'],\n\n controller: ['$scope','$timeout', function($scope, $timeout){\n\n var ctrl = this,\n $select = $scope.$select,\n ngModel;\n\n if (angular.isUndefined($select.selected))\n $select.selected = [];\n\n //Wait for link fn to inject it\n $scope.$evalAsync(function(){ ngModel = $scope.ngModel; });\n\n ctrl.activeMatchIndex = -1;\n\n ctrl.updateModel = function(){\n ngModel.$setViewValue(Date.now()); //Set timestamp as a unique string to force changes\n ctrl.refreshComponent();\n };\n\n ctrl.refreshComponent = function(){\n //Remove already selected items\n //e.g. When user clicks on a selection, the selected array changes and\n //the dropdown should remove that item\n if($select.refreshItems){\n $select.refreshItems();\n }\n if($select.sizeSearchInput){\n $select.sizeSearchInput();\n }\n };\n\n // Remove item from multiple select\n ctrl.removeChoice = function(index){\n\n // if the choice is locked, don't remove it\n if($select.isLocked(null, index)) return false;\n\n var removedChoice = $select.selected[index];\n\n var locals = {};\n locals[$select.parserResult.itemName] = removedChoice;\n\n $select.selected.splice(index, 1);\n ctrl.activeMatchIndex = -1;\n $select.sizeSearchInput();\n\n // Give some time for scope propagation.\n $timeout(function(){\n $select.onRemoveCallback($scope, {\n $item: removedChoice,\n $model: $select.parserResult.modelMapper($scope, locals)\n });\n });\n\n ctrl.updateModel();\n\n return true;\n };\n\n ctrl.getPlaceholder = function(){\n //Refactor single?\n if($select.selected && $select.selected.length) return;\n return $select.placeholder;\n };\n\n\n }],\n controllerAs: '$selectMultiple',\n\n link: function(scope, element, attrs, ctrls) {\n\n var $select = ctrls[0];\n var ngModel = scope.ngModel = ctrls[1];\n var $selectMultiple = scope.$selectMultiple;\n\n //$select.selected = raw selected objects (ignoring any property binding)\n\n $select.multiple = true;\n\n //Input that will handle focus\n $select.focusInput = $select.searchInput;\n\n //Properly check for empty if set to multiple\n ngModel.$isEmpty = function(value) {\n return !value || value.length === 0;\n };\n\n //From view --> model\n ngModel.$parsers.unshift(function () {\n var locals = {},\n result,\n resultMultiple = [];\n for (var j = $select.selected.length - 1; j >= 0; j--) {\n locals = {};\n locals[$select.parserResult.itemName] = $select.selected[j];\n result = $select.parserResult.modelMapper(scope, locals);\n resultMultiple.unshift(result);\n }\n return resultMultiple;\n });\n\n // From model --> view\n ngModel.$formatters.unshift(function (inputValue) {\n var data = $select.parserResult && $select.parserResult.source (scope, { $select : {search:''}}), //Overwrite $search\n locals = {},\n result;\n if (!data) return inputValue;\n var resultMultiple = [];\n var checkFnMultiple = function(list, value){\n if (!list || !list.length) return;\n for (var p = list.length - 1; p >= 0; p--) {\n locals[$select.parserResult.itemName] = list[p];\n result = $select.parserResult.modelMapper(scope, locals);\n if($select.parserResult.trackByExp){\n var propsItemNameMatches = /(\\w*)\\./.exec($select.parserResult.trackByExp);\n var matches = /\\.([^\\s]+)/.exec($select.parserResult.trackByExp);\n if(propsItemNameMatches && propsItemNameMatches.length > 0 && propsItemNameMatches[1] == $select.parserResult.itemName){\n if(matches && matches.length>0 && result[matches[1]] == value[matches[1]]){\n resultMultiple.unshift(list[p]);\n return true;\n }\n }\n }\n if (angular.equals(result,value)){\n resultMultiple.unshift(list[p]);\n return true;\n }\n }\n return false;\n };\n if (!inputValue) return resultMultiple; //If ngModel was undefined\n for (var k = inputValue.length - 1; k >= 0; k--) {\n //Check model array of currently selected items\n if (!checkFnMultiple($select.selected, inputValue[k])){\n //Check model array of all items available\n if (!checkFnMultiple(data, inputValue[k])){\n //If not found on previous lists, just add it directly to resultMultiple\n resultMultiple.unshift(inputValue[k]);\n }\n }\n }\n return resultMultiple;\n });\n\n //Watch for external model changes\n scope.$watchCollection(function(){ return ngModel.$modelValue; }, function(newValue, oldValue) {\n if (oldValue != newValue){\n //update the view value with fresh data from items, if there is a valid model value\n if(angular.isDefined(ngModel.$modelValue)) {\n ngModel.$modelValue = null; //Force scope model value and ngModel value to be out of sync to re-run formatters\n }\n $selectMultiple.refreshComponent();\n }\n });\n\n ngModel.$render = function() {\n // Make sure that model value is array\n if(!angular.isArray(ngModel.$viewValue)){\n // Have tolerance for null or undefined values\n if (isNil(ngModel.$viewValue)){\n ngModel.$viewValue = [];\n } else {\n throw uiSelectMinErr('multiarr', \"Expected model value to be array but got '{0}'\", ngModel.$viewValue);\n }\n }\n $select.selected = ngModel.$viewValue;\n $selectMultiple.refreshComponent();\n scope.$evalAsync(); //To force $digest\n };\n\n scope.$on('uis:select', function (event, item) {\n if($select.selected.length >= $select.limit) {\n return;\n }\n $select.selected.push(item);\n var locals = {};\n locals[$select.parserResult.itemName] = item;\n\n $timeout(function(){\n $select.onSelectCallback(scope, {\n $item: item,\n $model: $select.parserResult.modelMapper(scope, locals)\n });\n });\n $selectMultiple.updateModel();\n });\n\n scope.$on('uis:activate', function () {\n $selectMultiple.activeMatchIndex = -1;\n });\n\n scope.$watch('$select.disabled', function(newValue, oldValue) {\n // As the search input field may now become visible, it may be necessary to recompute its size\n if (oldValue && !newValue) $select.sizeSearchInput();\n });\n\n $select.searchInput.on('keydown', function(e) {\n var key = e.which;\n scope.$apply(function() {\n var processed = false;\n // var tagged = false; //Checkme\n if(KEY.isHorizontalMovement(key)){\n processed = _handleMatchSelection(key);\n }\n if (processed && key != KEY.TAB) {\n //TODO Check si el tab selecciona aun correctamente\n //Crear test\n e.preventDefault();\n e.stopPropagation();\n }\n });\n });\n function _getCaretPosition(el) {\n if(angular.isNumber(el.selectionStart)) return el.selectionStart;\n // selectionStart is not supported in IE8 and we don't want hacky workarounds so we compromise\n else return el.value.length;\n }\n // Handles selected options in \"multiple\" mode\n function _handleMatchSelection(key){\n var caretPosition = _getCaretPosition($select.searchInput[0]),\n length = $select.selected.length,\n // none = -1,\n first = 0,\n last = length-1,\n curr = $selectMultiple.activeMatchIndex,\n next = $selectMultiple.activeMatchIndex+1,\n prev = $selectMultiple.activeMatchIndex-1,\n newIndex = curr;\n\n if(caretPosition > 0 || ($select.search.length && key == KEY.RIGHT)) return false;\n\n $select.close();\n\n function getNewActiveMatchIndex(){\n switch(key){\n case KEY.LEFT:\n // Select previous/first item\n if(~$selectMultiple.activeMatchIndex) return prev;\n // Select last item\n else return last;\n break;\n case KEY.RIGHT:\n // Open drop-down\n if(!~$selectMultiple.activeMatchIndex || curr === last){\n $select.activate();\n return false;\n }\n // Select next/last item\n else return next;\n break;\n case KEY.BACKSPACE:\n // Remove selected item and select previous/first\n if(~$selectMultiple.activeMatchIndex){\n if($selectMultiple.removeChoice(curr)) {\n return prev;\n } else {\n return curr;\n }\n\n } else {\n // If nothing yet selected, select last item\n return last;\n }\n break;\n case KEY.DELETE:\n // Remove selected item and select next item\n if(~$selectMultiple.activeMatchIndex){\n $selectMultiple.removeChoice($selectMultiple.activeMatchIndex);\n return curr;\n }\n else return false;\n }\n }\n\n newIndex = getNewActiveMatchIndex();\n\n if(!$select.selected.length || newIndex === false) $selectMultiple.activeMatchIndex = -1;\n else $selectMultiple.activeMatchIndex = Math.min(last,Math.max(first,newIndex));\n\n return true;\n }\n\n $select.searchInput.on('keyup', function(e) {\n\n if ( ! KEY.isVerticalMovement(e.which) ) {\n scope.$evalAsync( function () {\n $select.activeIndex = $select.taggingLabel === false ? -1 : 0;\n });\n }\n // Push a \"create new\" item into array if there is a search string\n if ( $select.tagging.isActivated && $select.search.length > 0 ) {\n\n // return early with these keys\n if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC || KEY.isVerticalMovement(e.which) ) {\n return;\n }\n // always reset the activeIndex to the first item when tagging\n $select.activeIndex = $select.taggingLabel === false ? -1 : 0;\n // taggingLabel === false bypasses all of this\n if ($select.taggingLabel === false) return;\n\n var items = angular.copy( $select.items );\n var stashArr = angular.copy( $select.items );\n var newItem;\n var item;\n var hasTag = false;\n var dupeIndex = -1;\n var tagItems;\n var tagItem;\n\n // case for object tagging via transform `$select.tagging.fct` function\n if ( $select.tagging.fct !== undefined) {\n tagItems = $select.$filter('filter')(items,{'isTag': true});\n if ( tagItems.length > 0 ) {\n tagItem = tagItems[0];\n }\n // remove the first element, if it has the `isTag` prop we generate a new one with each keyup, shaving the previous\n if ( items.length > 0 && tagItem ) {\n hasTag = true;\n items = items.slice(1,items.length);\n stashArr = stashArr.slice(1,stashArr.length);\n }\n newItem = $select.tagging.fct($select.search);\n // verify the new tag doesn't match the value of a possible selection choice or an already selected item.\n if (\n stashArr.some(function (origItem) {\n return angular.equals(origItem, newItem);\n }) ||\n $select.selected.some(function (origItem) {\n return angular.equals(origItem, newItem);\n })\n ) {\n scope.$evalAsync(function () {\n $select.activeIndex = 0;\n $select.items = items;\n });\n return;\n }\n if (newItem) newItem.isTag = true;\n // handle newItem string and stripping dupes in tagging string context\n } else {\n // find any tagging items already in the $select.items array and store them\n tagItems = $select.$filter('filter')(items,function (item) {\n return item.match($select.taggingLabel);\n });\n if ( tagItems.length > 0 ) {\n tagItem = tagItems[0];\n }\n item = items[0];\n // remove existing tag item if found (should only ever be one tag item)\n if ( item !== undefined && items.length > 0 && tagItem ) {\n hasTag = true;\n items = items.slice(1,items.length);\n stashArr = stashArr.slice(1,stashArr.length);\n }\n newItem = $select.search+' '+$select.taggingLabel;\n if ( _findApproxDupe($select.selected, $select.search) > -1 ) {\n return;\n }\n // verify the the tag doesn't match the value of an existing item from\n // the searched data set or the items already selected\n if ( _findCaseInsensitiveDupe(stashArr.concat($select.selected)) ) {\n // if there is a tag from prev iteration, strip it / queue the change\n // and return early\n if ( hasTag ) {\n items = stashArr;\n scope.$evalAsync( function () {\n $select.activeIndex = 0;\n $select.items = items;\n });\n }\n return;\n }\n if ( _findCaseInsensitiveDupe(stashArr) ) {\n // if there is a tag from prev iteration, strip it\n if ( hasTag ) {\n $select.items = stashArr.slice(1,stashArr.length);\n }\n return;\n }\n }\n if ( hasTag ) dupeIndex = _findApproxDupe($select.selected, newItem);\n // dupe found, shave the first item\n if ( dupeIndex > -1 ) {\n items = items.slice(dupeIndex+1,items.length-1);\n } else {\n items = [];\n if (newItem) items.push(newItem);\n items = items.concat(stashArr);\n }\n scope.$evalAsync( function () {\n $select.activeIndex = 0;\n $select.items = items;\n\n if ($select.isGrouped) {\n // update item references in groups, so that indexOf will work after angular.copy\n var itemsWithoutTag = newItem ? items.slice(1) : items;\n $select.setItemsFn(itemsWithoutTag);\n if (newItem) {\n // add tag item as a new group\n $select.items.unshift(newItem);\n $select.groups.unshift({name: '', items: [newItem], tagging: true});\n }\n }\n });\n }\n });\n function _findCaseInsensitiveDupe(arr) {\n if ( arr === undefined || $select.search === undefined ) {\n return false;\n }\n var hasDupe = arr.filter( function (origItem) {\n if ( $select.search.toUpperCase() === undefined || origItem === undefined ) {\n return false;\n }\n return origItem.toUpperCase() === $select.search.toUpperCase();\n }).length > 0;\n\n return hasDupe;\n }\n function _findApproxDupe(haystack, needle) {\n var dupeIndex = -1;\n if(angular.isArray(haystack)) {\n var tempArr = angular.copy(haystack);\n for (var i = 0; i <tempArr.length; i++) {\n // handle the simple string version of tagging\n if ( $select.tagging.fct === undefined ) {\n // search the array for the match\n if ( tempArr[i]+' '+$select.taggingLabel === needle ) {\n dupeIndex = i;\n }\n // handle the object tagging implementation\n } else {\n var mockObj = tempArr[i];\n if (angular.isObject(mockObj)) {\n mockObj.isTag = true;\n }\n if ( angular.equals(mockObj, needle) ) {\n dupeIndex = i;\n }\n }\n }\n }\n return dupeIndex;\n }\n\n $select.searchInput.on('blur', function() {\n $timeout(function() {\n $selectMultiple.activeMatchIndex = -1;\n });\n });\n\n }\n };\n}]);\n\nuis.directive('uiSelectNoChoice',\n ['uiSelectConfig', function (uiSelectConfig) {\n return {\n restrict: 'EA',\n require: '^uiSelect',\n replace: true,\n transclude: true,\n templateUrl: function (tElement) {\n // Needed so the uiSelect can detect the transcluded content\n tElement.addClass('ui-select-no-choice');\n \n // Gets theme attribute from parent (ui-select)\n var theme = tElement.parent().attr('theme') || uiSelectConfig.theme;\n return theme + '/no-choice.tpl.html';\n }\n };\n }]);\n\nuis.directive('uiSelectSingle', ['$timeout','$compile', function($timeout, $compile) {\n return {\n restrict: 'EA',\n require: ['^uiSelect', '^ngModel'],\n link: function(scope, element, attrs, ctrls) {\n\n var $select = ctrls[0];\n var ngModel = ctrls[1];\n\n //From view --> model\n ngModel.$parsers.unshift(function (inputValue) {\n // Keep original value for undefined and null\n if (isNil(inputValue)) {\n return inputValue;\n }\n\n var locals = {},\n result;\n locals[$select.parserResult.itemName] = inputValue;\n result = $select.parserResult.modelMapper(scope, locals);\n return result;\n });\n\n //From model --> view\n ngModel.$formatters.unshift(function (inputValue) {\n // Keep original value for undefined and null\n if (isNil(inputValue)) {\n return inputValue;\n }\n\n var data = $select.parserResult && $select.parserResult.source (scope, { $select : {search:''}}), //Overwrite $search\n locals = {},\n result;\n if (data){\n var checkFnSingle = function(d){\n locals[$select.parserResult.itemName] = d;\n result = $select.parserResult.modelMapper(scope, locals);\n return result === inputValue;\n };\n //If possible pass same object stored in $select.selected\n if ($select.selected && checkFnSingle($select.selected)) {\n return $select.selected;\n }\n for (var i = data.length - 1; i >= 0; i--) {\n if (checkFnSingle(data[i])) return data[i];\n }\n }\n return inputValue;\n });\n\n //Update viewValue if model change\n scope.$watch('$select.selected', function(newValue) {\n if (ngModel.$viewValue !== newValue) {\n ngModel.$setViewValue(newValue);\n }\n });\n\n ngModel.$render = function() {\n $select.selected = ngModel.$viewValue;\n };\n\n scope.$on('uis:select', function (event, item) {\n $select.selected = item;\n var locals = {};\n locals[$select.parserResult.itemName] = item;\n\n $timeout(function() {\n $select.onSelectCallback(scope, {\n $item: item,\n $model: isNil(item) ? item : $select.parserResult.modelMapper(scope, locals)\n });\n });\n });\n\n scope.$on('uis:close', function (event, skipFocusser) {\n $timeout(function(){\n $select.focusser.prop('disabled', false);\n if (!skipFocusser) $select.focusser[0].focus();\n },0,false);\n });\n\n scope.$on('uis:activate', function () {\n focusser.prop('disabled', true); //Will reactivate it on .close()\n });\n\n //Idea from: https://github.com/ivaynberg/select2/blob/79b5bf6db918d7560bdd959109b7bcfb47edaf43/select2.js#L1954\n var focusser = angular.element(\"<input ng-disabled='$select.disabled' class='ui-select-focusser ui-select-offscreen' type='text' id='{{ $select.focusserId }}' aria-label='{{ $select.focusserTitle }}' aria-haspopup='true' role='button' />\");\n $compile(focusser)(scope);\n $select.focusser = focusser;\n\n //Input that will handle focus\n $select.focusInput = focusser;\n\n element.parent().append(focusser);\n focusser.bind(\"focus\", function(){\n scope.$evalAsync(function(){\n $select.focus = true;\n });\n });\n focusser.bind(\"blur\", function(){\n scope.$evalAsync(function(){\n $select.focus = false;\n });\n });\n focusser.bind(\"keydown\", function(e){\n\n if (e.which === KEY.BACKSPACE && $select.backspaceReset !== false) {\n e.preventDefault();\n e.stopPropagation();\n $select.select(undefined);\n scope.$apply();\n return;\n }\n\n if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {\n return;\n }\n\n if (e.which == KEY.DOWN || e.which == KEY.UP || e.which == KEY.ENTER || e.which == KEY.SPACE){\n e.preventDefault();\n e.stopPropagation();\n $select.activate();\n }\n\n scope.$digest();\n });\n\n focusser.bind(\"keyup input\", function(e){\n\n if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC || e.which == KEY.ENTER || e.which === KEY.BACKSPACE) {\n return;\n }\n\n $select.activate(focusser.val()); //User pressed some regular key, so we pass it to the search input\n focusser.val('');\n scope.$digest();\n\n });\n\n\n }\n };\n}]);\n\n// Make multiple matches sortable\nuis.directive('uiSelectSort', ['$timeout', 'uiSelectConfig', 'uiSelectMinErr', function($timeout, uiSelectConfig, uiSelectMinErr) {\n return {\n require: ['^^uiSelect', '^ngModel'],\n link: function(scope, element, attrs, ctrls) {\n if (scope[attrs.uiSelectSort] === null) {\n throw uiSelectMinErr('sort', 'Expected a list to sort');\n }\n\n var $select = ctrls[0];\n var $ngModel = ctrls[1];\n\n var options = angular.extend({\n axis: 'horizontal'\n },\n scope.$eval(attrs.uiSelectSortOptions));\n\n var axis = options.axis;\n var draggingClassName = 'dragging';\n var droppingClassName = 'dropping';\n var droppingBeforeClassName = 'dropping-before';\n var droppingAfterClassName = 'dropping-after';\n\n scope.$watch(function(){\n return $select.sortable;\n }, function(newValue){\n if (newValue) {\n element.attr('draggable', true);\n } else {\n element.removeAttr('draggable');\n }\n });\n\n element.on('dragstart', function(event) {\n element.addClass(draggingClassName);\n\n (event.dataTransfer || event.originalEvent.dataTransfer).setData('text', scope.$index.toString());\n });\n\n element.on('dragend', function() {\n removeClass(draggingClassName);\n });\n\n var move = function(from, to) {\n /*jshint validthis: true */\n this.splice(to, 0, this.splice(from, 1)[0]);\n };\n\n var removeClass = function(className) {\n angular.forEach($select.$element.querySelectorAll('.' + className), function(el){\n angular.element(el).removeClass(className);\n });\n };\n\n var dragOverHandler = function(event) {\n event.preventDefault();\n\n var offset = axis === 'vertical' ? event.offsetY || event.layerY || (event.originalEvent ? event.originalEvent.offsetY : 0) : event.offsetX || event.layerX || (event.originalEvent ? event.originalEvent.offsetX : 0);\n\n if (offset < (this[axis === 'vertical' ? 'offsetHeight' : 'offsetWidth'] / 2)) {\n removeClass(droppingAfterClassName);\n element.addClass(droppingBeforeClassName);\n\n } else {\n removeClass(droppingBeforeClassName);\n element.addClass(droppingAfterClassName);\n }\n };\n\n var dropTimeout;\n\n var dropHandler = function(event) {\n event.preventDefault();\n\n var droppedItemIndex = parseInt((event.dataTransfer || event.originalEvent.dataTransfer).getData('text'), 10);\n\n // prevent event firing multiple times in firefox\n $timeout.cancel(dropTimeout);\n dropTimeout = $timeout(function() {\n _dropHandler(droppedItemIndex);\n }, 20);\n };\n\n var _dropHandler = function(droppedItemIndex) {\n var theList = scope.$eval(attrs.uiSelectSort);\n var itemToMove = theList[droppedItemIndex];\n var newIndex = null;\n\n if (element.hasClass(droppingBeforeClassName)) {\n if (droppedItemIndex < scope.$index) {\n newIndex = scope.$index - 1;\n } else {\n newIndex = scope.$index;\n }\n } else {\n if (droppedItemIndex < scope.$index) {\n newIndex = scope.$index;\n } else {\n newIndex = scope.$index + 1;\n }\n }\n\n move.apply(theList, [droppedItemIndex, newIndex]);\n\n $ngModel.$setViewValue(Date.now());\n\n scope.$apply(function() {\n scope.$emit('uiSelectSort:change', {\n array: theList,\n item: itemToMove,\n from: droppedItemIndex,\n to: newIndex\n });\n });\n\n removeClass(droppingClassName);\n removeClass(droppingBeforeClassName);\n removeClass(droppingAfterClassName);\n\n element.off('drop', dropHandler);\n };\n\n element.on('dragenter', function() {\n if (element.hasClass(draggingClassName)) {\n return;\n }\n\n element.addClass(droppingClassName);\n\n element.on('dragover', dragOverHandler);\n element.on('drop', dropHandler);\n });\n\n element.on('dragleave', function(event) {\n if (event.target != element) {\n return;\n }\n\n removeClass(droppingClassName);\n removeClass(droppingBeforeClassName);\n removeClass(droppingAfterClassName);\n\n element.off('dragover', dragOverHandler);\n element.off('drop', dropHandler);\n });\n }\n };\n}]);\n\nuis.directive('uisOpenClose', ['$parse', '$timeout', function ($parse, $timeout) {\n return {\n restrict: 'A',\n require: 'uiSelect',\n link: function (scope, element, attrs, $select) {\n $select.onOpenCloseCallback = $parse(attrs.uisOpenClose);\n\n scope.$watch('$select.open', function (isOpen, previousState) {\n if (isOpen !== previousState) {\n $timeout(function () {\n $select.onOpenCloseCallback(scope, {\n isOpen: isOpen\n });\n });\n }\n });\n }\n };\n}]);\n\n/**\n * Parses \"repeat\" attribute.\n *\n * Taken from AngularJS ngRepeat source code\n * See https://github.com/angular/angular.js/blob/v1.2.15/src/ng/directive/ngRepeat.js#L211\n *\n * Original discussion about parsing \"repeat\" attribute instead of fully relying on ng-repeat:\n * https://github.com/angular-ui/ui-select/commit/5dd63ad#commitcomment-5504697\n */\n\nuis.service('uisRepeatParser', ['uiSelectMinErr','$parse', function(uiSelectMinErr, $parse) {\n var self = this;\n\n /**\n * Example:\n * expression = \"address in addresses | filter: {street: $select.search} track by $index\"\n * itemName = \"address\",\n * source = \"addresses | filter: {street: $select.search}\",\n * trackByExp = \"$index\",\n */\n self.parse = function(expression) {\n\n\n var match;\n //var isObjectCollection = /\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)/.test(expression);\n // If an array is used as collection\n\n // if (isObjectCollection){\n // 000000000000000000000000000000111111111000000000000000222222222222220033333333333333333333330000444444444444444444000000000000000055555555555000000000000000000000066666666600000000\n match = expression.match(/^\\s*(?:([\\s\\S]+?)\\s+as\\s+)?(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+(\\s*[\\s\\S]+?)?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/);\n\n // 1 Alias\n // 2 Item\n // 3 Key on (key,value)\n // 4 Value on (key,value)\n // 5 Source expression (including filters)\n // 6 Track by\n\n if (!match) {\n throw uiSelectMinErr('iexp', \"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.\",\n expression);\n }\n \n var source = match[5], \n filters = '';\n\n // When using (key,value) ui-select requires filters to be extracted, since the object\n // is converted to an array for $select.items \n // (in which case the filters need to be reapplied)\n if (match[3]) {\n // Remove any enclosing parenthesis\n source = match[5].replace(/(^\\()|(\\)$)/g, '');\n // match all after | but not after ||\n var filterMatch = match[5].match(/^\\s*(?:[\\s\\S]+?)(?:[^\\|]|\\|\\|)+([\\s\\S]*)\\s*$/);\n if(filterMatch && filterMatch[1].trim()) {\n filters = filterMatch[1];\n source = source.replace(filters, '');\n } \n }\n\n return {\n itemName: match[4] || match[2], // (lhs) Left-hand side,\n keyName: match[3], //for (key, value) syntax\n source: $parse(source),\n filters: filters,\n trackByExp: match[6],\n modelMapper: $parse(match[1] || match[4] || match[2]),\n repeatExpression: function (grouped) {\n var expression = this.itemName + ' in ' + (grouped ? '$group.items' : '$select.items');\n if (this.trackByExp) {\n expression += ' track by ' + this.trackByExp;\n }\n return expression;\n } \n };\n\n };\n\n self.getGroupNgRepeatExpression = function() {\n return '$group in $select.groups track by $group.name';\n };\n\n}]);\n\n}());\nangular.module(\"ui.select\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"bootstrap/choices.tpl.html\",\"<ul class=\\\"ui-select-choices ui-select-choices-content ui-select-dropdown dropdown-menu\\\" ng-show=\\\"$select.open && $select.items.length > 0\\\"><li class=\\\"ui-select-choices-group\\\" id=\\\"ui-select-choices-{{ $select.generatedId }}\\\"><div class=\\\"divider\\\" ng-show=\\\"$select.isGrouped && $index > 0\\\"></div><div ng-show=\\\"$select.isGrouped\\\" class=\\\"ui-select-choices-group-label dropdown-header\\\" ng-bind=\\\"$group.name\\\"></div><div ng-attr-id=\\\"ui-select-choices-row-{{ $select.generatedId }}-{{$index}}\\\" class=\\\"ui-select-choices-row\\\" ng-class=\\\"{active: $select.isActive(this), disabled: $select.isDisabled(this)}\\\" role=\\\"option\\\"><span class=\\\"ui-select-choices-row-inner\\\"></span></div></li></ul>\");\n$templateCache.put(\"bootstrap/match-multiple.tpl.html\",\"<span class=\\\"ui-select-match\\\"><span ng-repeat=\\\"$item in $select.selected track by $index\\\"><span class=\\\"ui-select-match-item btn btn-default btn-xs\\\" tabindex=\\\"-1\\\" type=\\\"button\\\" ng-disabled=\\\"$select.disabled\\\" ng-click=\\\"$selectMultiple.activeMatchIndex = $index;\\\" ng-class=\\\"{\\'btn-primary\\':$selectMultiple.activeMatchIndex === $index, \\'select-locked\\':$select.isLocked(this, $index)}\\\" ui-select-sort=\\\"$select.selected\\\"><span class=\\\"close ui-select-match-close\\\" ng-hide=\\\"$select.disabled\\\" ng-click=\\\"$selectMultiple.removeChoice($index)\\\">&nbsp;&times;</span> <span uis-transclude-append=\\\"\\\"></span></span></span></span>\");\n$templateCache.put(\"bootstrap/match.tpl.html\",\"<div class=\\\"ui-select-match\\\" ng-hide=\\\"$select.open && $select.searchEnabled\\\" ng-disabled=\\\"$select.disabled\\\" ng-class=\\\"{\\'btn-default-focus\\':$select.focus}\\\"><span tabindex=\\\"-1\\\" class=\\\"btn btn-default form-control ui-select-toggle\\\" aria-label=\\\"{{ $select.baseTitle }} activate\\\" ng-disabled=\\\"$select.disabled\\\" ng-click=\\\"$select.activate()\\\" style=\\\"outline: 0;\\\"><span ng-show=\\\"$select.isEmpty()\\\" class=\\\"ui-select-placeholder text-muted\\\">{{$select.placeholder}}</span> <span ng-hide=\\\"$select.isEmpty()\\\" class=\\\"ui-select-match-text pull-left\\\" ng-class=\\\"{\\'ui-select-allow-clear\\': $select.allowClear && !$select.isEmpty()}\\\" ng-transclude=\\\"\\\"></span> <i class=\\\"caret pull-right\\\" ng-click=\\\"$select.toggle($event)\\\"></i> <a ng-show=\\\"$select.allowClear && !$select.isEmpty() && ($select.disabled !== true)\\\" aria-label=\\\"{{ $select.baseTitle }} clear\\\" style=\\\"margin-right: 10px\\\" ng-click=\\\"$select.clear($event)\\\" class=\\\"btn btn-xs btn-link pull-right\\\"><i class=\\\"glyphicon glyphicon-remove\\\" aria-hidden=\\\"true\\\"></i></a></span></div>\");\n$templateCache.put(\"bootstrap/no-choice.tpl.html\",\"<ul class=\\\"ui-select-no-choice dropdown-menu\\\" ng-show=\\\"$select.items.length == 0\\\"><li ng-transclude=\\\"\\\"></li></ul>\");\n$templateCache.put(\"bootstrap/select-multiple.tpl.html\",\"<div class=\\\"ui-select-container ui-select-multiple ui-select-bootstrap dropdown form-control\\\" ng-class=\\\"{open: $select.open}\\\"><div><div class=\\\"ui-select-match\\\"></div><input type=\\\"search\\\" autocomplete=\\\"off\\\" autocorrect=\\\"off\\\" autocapitalize=\\\"off\\\" spellcheck=\\\"false\\\" class=\\\"ui-select-search input-xs\\\" placeholder=\\\"{{$selectMultiple.getPlaceholder()}}\\\" ng-disabled=\\\"$select.disabled\\\" ng-click=\\\"$select.activate()\\\" ng-model=\\\"$select.search\\\" role=\\\"combobox\\\" aria-expanded=\\\"{{$select.open}}\\\" aria-label=\\\"{{$select.baseTitle}}\\\" ng-class=\\\"{\\'spinner\\': $select.refreshing}\\\" ondrop=\\\"return false;\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-no-choice\\\"></div></div>\");\n$templateCache.put(\"bootstrap/select.tpl.html\",\"<div class=\\\"ui-select-container ui-select-bootstrap dropdown\\\" ng-class=\\\"{open: $select.open}\\\"><div class=\\\"ui-select-match\\\"></div><span ng-show=\\\"$select.open && $select.refreshing && $select.spinnerEnabled\\\" class=\\\"ui-select-refreshing {{$select.spinnerClass}}\\\"></span> <input type=\\\"search\\\" autocomplete=\\\"off\\\" tabindex=\\\"-1\\\" aria-expanded=\\\"true\\\" aria-label=\\\"{{ $select.baseTitle }}\\\" aria-owns=\\\"ui-select-choices-{{ $select.generatedId }}\\\" class=\\\"form-control ui-select-search\\\" ng-class=\\\"{ \\'ui-select-search-hidden\\' : !$select.searchEnabled }\\\" placeholder=\\\"{{$select.placeholder}}\\\" ng-model=\\\"$select.search\\\" ng-show=\\\"$select.open\\\"><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-no-choice\\\"></div></div>\");\n$templateCache.put(\"select2/choices.tpl.html\",\"<ul tabindex=\\\"-1\\\" class=\\\"ui-select-choices ui-select-choices-content select2-results\\\"><li class=\\\"ui-select-choices-group\\\" ng-class=\\\"{\\'select2-result-with-children\\': $select.choiceGrouped($group) }\\\"><div ng-show=\\\"$select.choiceGrouped($group)\\\" class=\\\"ui-select-choices-group-label select2-result-label\\\" ng-bind=\\\"$group.name\\\"></div><ul id=\\\"ui-select-choices-{{ $select.generatedId }}\\\" ng-class=\\\"{\\'select2-result-sub\\': $select.choiceGrouped($group), \\'select2-result-single\\': !$select.choiceGrouped($group) }\\\"><li role=\\\"option\\\" ng-attr-id=\\\"ui-select-choices-row-{{ $select.generatedId }}-{{$index}}\\\" class=\\\"ui-select-choices-row\\\" ng-class=\\\"{\\'select2-highlighted\\': $select.isActive(this), \\'select2-disabled\\': $select.isDisabled(this)}\\\"><div class=\\\"select2-result-label ui-select-choices-row-inner\\\"></div></li></ul></li></ul>\");\n$templateCache.put(\"select2/match-multiple.tpl.html\",\"<span class=\\\"ui-select-match\\\"><li class=\\\"ui-select-match-item select2-search-choice\\\" ng-repeat=\\\"$item in $select.selected track by $index\\\" ng-class=\\\"{\\'select2-search-choice-focus\\':$selectMultiple.activeMatchIndex === $index, \\'select2-locked\\':$select.isLocked(this, $index)}\\\" ui-select-sort=\\\"$select.selected\\\"><span uis-transclude-append=\\\"\\\"></span> <a href=\\\"javascript:;\\\" class=\\\"ui-select-match-close select2-search-choice-close\\\" ng-click=\\\"$selectMultiple.removeChoice($index)\\\" tabindex=\\\"-1\\\"></a></li></span>\");\n$templateCache.put(\"select2/match.tpl.html\",\"<a class=\\\"select2-choice ui-select-match\\\" ng-class=\\\"{\\'select2-default\\': $select.isEmpty()}\\\" ng-click=\\\"$select.toggle($event)\\\" aria-label=\\\"{{ $select.baseTitle }} select\\\"><span ng-show=\\\"$select.isEmpty()\\\" class=\\\"select2-chosen\\\">{{$select.placeholder}}</span> <span ng-hide=\\\"$select.isEmpty()\\\" class=\\\"select2-chosen\\\" ng-transclude=\\\"\\\"></span> <abbr ng-if=\\\"$select.allowClear && !$select.isEmpty()\\\" class=\\\"select2-search-choice-close\\\" ng-click=\\\"$select.clear($event)\\\"></abbr> <span class=\\\"select2-arrow ui-select-toggle\\\"><b></b></span></a>\");\n$templateCache.put(\"select2/no-choice.tpl.html\",\"<div class=\\\"ui-select-no-choice dropdown\\\" ng-show=\\\"$select.items.length == 0\\\"><div class=\\\"dropdown-content\\\"><div data-selectable=\\\"\\\" ng-transclude=\\\"\\\"></div></div></div>\");\n$templateCache.put(\"select2/select-multiple.tpl.html\",\"<div class=\\\"ui-select-container ui-select-multiple select2 select2-container select2-container-multi\\\" ng-class=\\\"{\\'select2-container-active select2-dropdown-open open\\': $select.open, \\'select2-container-disabled\\': $select.disabled}\\\"><ul class=\\\"select2-choices\\\"><span class=\\\"ui-select-match\\\"></span><li class=\\\"select2-search-field\\\"><input type=\\\"search\\\" autocomplete=\\\"off\\\" autocorrect=\\\"off\\\" autocapitalize=\\\"off\\\" spellcheck=\\\"false\\\" role=\\\"combobox\\\" aria-expanded=\\\"true\\\" aria-owns=\\\"ui-select-choices-{{ $select.generatedId }}\\\" aria-label=\\\"{{ $select.baseTitle }}\\\" aria-activedescendant=\\\"ui-select-choices-row-{{ $select.generatedId }}-{{ $select.activeIndex }}\\\" class=\\\"select2-input ui-select-search\\\" placeholder=\\\"{{$selectMultiple.getPlaceholder()}}\\\" ng-disabled=\\\"$select.disabled\\\" ng-hide=\\\"$select.disabled\\\" ng-model=\\\"$select.search\\\" ng-click=\\\"$select.activate()\\\" style=\\\"width: 34px;\\\" ondrop=\\\"return false;\\\"></li></ul><div class=\\\"ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active\\\" ng-class=\\\"{\\'select2-display-none\\': !$select.open || $select.items.length === 0}\\\"><div class=\\\"ui-select-choices\\\"></div></div></div>\");\n$templateCache.put(\"select2/select.tpl.html\",\"<div class=\\\"ui-select-container select2 select2-container\\\" ng-class=\\\"{\\'select2-container-active select2-dropdown-open open\\': $select.open, \\'select2-container-disabled\\': $select.disabled, \\'select2-container-active\\': $select.focus, \\'select2-allowclear\\': $select.allowClear && !$select.isEmpty()}\\\"><div class=\\\"ui-select-match\\\"></div><div class=\\\"ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active\\\" ng-class=\\\"{\\'select2-display-none\\': !$select.open}\\\"><div class=\\\"search-container\\\" ng-class=\\\"{\\'ui-select-search-hidden\\':!$select.searchEnabled, \\'select2-search\\':$select.searchEnabled}\\\"><input type=\\\"search\\\" autocomplete=\\\"off\\\" autocorrect=\\\"off\\\" autocapitalize=\\\"off\\\" spellcheck=\\\"false\\\" ng-class=\\\"{\\'select2-active\\': $select.refreshing}\\\" role=\\\"combobox\\\" aria-expanded=\\\"true\\\" aria-owns=\\\"ui-select-choices-{{ $select.generatedId }}\\\" aria-label=\\\"{{ $select.baseTitle }}\\\" class=\\\"ui-select-search select2-input\\\" ng-model=\\\"$select.search\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-no-choice\\\"></div></div></div>\");\n$templateCache.put(\"selectize/choices.tpl.html\",\"<div ng-show=\\\"$select.open\\\" class=\\\"ui-select-choices ui-select-dropdown selectize-dropdown\\\" ng-class=\\\"{\\'single\\': !$select.multiple, \\'multi\\': $select.multiple}\\\"><div class=\\\"ui-select-choices-content selectize-dropdown-content\\\"><div class=\\\"ui-select-choices-group optgroup\\\"><div ng-show=\\\"$select.isGrouped\\\" class=\\\"ui-select-choices-group-label optgroup-header\\\" ng-bind=\\\"$group.name\\\"></div><div role=\\\"option\\\" class=\\\"ui-select-choices-row\\\" ng-class=\\\"{active: $select.isActive(this), disabled: $select.isDisabled(this)}\\\"><div class=\\\"option ui-select-choices-row-inner\\\" data-selectable=\\\"\\\"></div></div></div></div></div>\");\n$templateCache.put(\"selectize/match-multiple.tpl.html\",\"<div class=\\\"ui-select-match\\\" data-value=\\\"\\\" ng-repeat=\\\"$item in $select.selected track by $index\\\" ng-click=\\\"$selectMultiple.activeMatchIndex = $index;\\\" ng-class=\\\"{\\'active\\':$selectMultiple.activeMatchIndex === $index}\\\" ui-select-sort=\\\"$select.selected\\\"><span class=\\\"ui-select-match-item\\\" ng-class=\\\"{\\'select-locked\\':$select.isLocked(this, $index)}\\\"><span uis-transclude-append=\\\"\\\"></span> <span class=\\\"remove ui-select-match-close\\\" ng-hide=\\\"$select.disabled\\\" ng-click=\\\"$selectMultiple.removeChoice($index)\\\">&times;</span></span></div>\");\n$templateCache.put(\"selectize/match.tpl.html\",\"<div ng-hide=\\\"$select.searchEnabled && ($select.open || $select.isEmpty())\\\" class=\\\"ui-select-match\\\"><span ng-show=\\\"!$select.searchEnabled && ($select.isEmpty() || $select.open)\\\" class=\\\"ui-select-placeholder text-muted\\\">{{$select.placeholder}}</span> <span ng-hide=\\\"$select.isEmpty() || $select.open\\\" ng-transclude=\\\"\\\"></span></div>\");\n$templateCache.put(\"selectize/no-choice.tpl.html\",\"<div class=\\\"ui-select-no-choice selectize-dropdown\\\" ng-show=\\\"$select.items.length == 0\\\"><div class=\\\"selectize-dropdown-content\\\"><div data-selectable=\\\"\\\" ng-transclude=\\\"\\\"></div></div></div>\");\n$templateCache.put(\"selectize/select-multiple.tpl.html\",\"<div class=\\\"ui-select-container selectize-control multi plugin-remove_button\\\" ng-class=\\\"{\\'open\\': $select.open}\\\"><div class=\\\"selectize-input\\\" ng-class=\\\"{\\'focus\\': $select.open, \\'disabled\\': $select.disabled, \\'selectize-focus\\' : $select.focus}\\\" ng-click=\\\"$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()\\\"><div class=\\\"ui-select-match\\\"></div><input type=\\\"search\\\" autocomplete=\\\"off\\\" tabindex=\\\"-1\\\" class=\\\"ui-select-search\\\" ng-class=\\\"{\\'ui-select-search-hidden\\':!$select.searchEnabled}\\\" placeholder=\\\"{{$selectMultiple.getPlaceholder()}}\\\" ng-model=\\\"$select.search\\\" ng-disabled=\\\"$select.disabled\\\" aria-expanded=\\\"{{$select.open}}\\\" aria-label=\\\"{{ $select.baseTitle }}\\\" ondrop=\\\"return false;\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-no-choice\\\"></div></div>\");\n$templateCache.put(\"selectize/select.tpl.html\",\"<div class=\\\"ui-select-container selectize-control single\\\" ng-class=\\\"{\\'open\\': $select.open}\\\"><div class=\\\"selectize-input\\\" ng-class=\\\"{\\'focus\\': $select.open, \\'disabled\\': $select.disabled, \\'selectize-focus\\' : $select.focus}\\\" ng-click=\\\"$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()\\\"><div class=\\\"ui-select-match\\\"></div><input type=\\\"search\\\" autocomplete=\\\"off\\\" tabindex=\\\"-1\\\" class=\\\"ui-select-search ui-select-toggle\\\" ng-class=\\\"{\\'ui-select-search-hidden\\':!$select.searchEnabled}\\\" ng-click=\\\"$select.toggle($event)\\\" placeholder=\\\"{{$select.placeholder}}\\\" ng-model=\\\"$select.search\\\" ng-hide=\\\"!$select.isEmpty() && !$select.open\\\" ng-disabled=\\\"$select.disabled\\\" aria-label=\\\"{{ $select.baseTitle }}\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-no-choice\\\"></div></div>\");}]);",null,null]}