/*! * # Semantic UI 2.1.7 - Dropdown * http://github.com/semantic-org/semantic-ui/ * * * Copyright 2015 Contributors * Released under the MIT license * http://opensource.org/licenses/MIT * */ !function (e, t, n, i) { "use strict"; e.fn.dropdown = function (a) { var o, s = e(this), r = e(n), l = s.selector || "", c = "ontouchstart" in n.documentElement, u = (new Date).getTime(), d = [], v = arguments[0], m = "string" == typeof v, f = [].slice.call(arguments, 1); return s.each(function (h) { var g, p, b, w, x, C, S, y = e.isPlainObject(a) ? e.extend(!0, {}, e.fn.dropdown.settings, a) : e.extend({}, e.fn.dropdown.settings), T = y.className, A = y.message, k = y.fields, L = y.keys, D = y.metadata, I = y.namespace, R = y.regExp, q = y.selector, V = y.error, E = y.templates, O = "." + I, F = "module-" + I, P = e(this), M = e(y.context), H = P.find(q.text), z = P.find(q.search), j = P.find(q.input), U = P.find(q.icon), N = P.prev().find(q.text).length > 0 ? P.prev().find(q.text) : P.prev(), B = P.children(q.menu), W = B.find(q.item), K = !1, $ = !1, Q = !1, Y = this, G = P.data(F); S = { initialize: function () { S.debug("Initializing dropdown", y), S.is.alreadySetup() ? S.setup.reference() : (S.setup.layout(), S.refreshData(), S.save.defaults(), S.restore.selected(), S.create.id(), S.bind.events(), S.observeChanges(), S.instantiate()) }, instantiate: function () { S.verbose("Storing instance of dropdown", S), G = S, P.data(F, S) }, destroy: function () { S.verbose("Destroying previous dropdown", P), S.remove.tabbable(), P.off(O).removeData(F), B.off(O), r.off(b), x && x.disconnect(), C && C.disconnect() }, observeChanges: function () { "MutationObserver" in t && (x = new MutationObserver(function (e) { S.debug("").addClass(T.search).prop("autocomplete", "off").insertBefore(H)), y.allowTab && S.set.tabbable() }, select: function () { var t = S.get.selectValues(); S.debug("Dropdown initialized on a select", t), P.is("select") && (j = P), j.parent(q.dropdown).length > 0 ? (S.debug("UI dropdown already exists. Creating dropdown menu only"), P = j.closest(q.dropdown), S.has.menu() || S.create.menu(), B = P.children(q.menu), S.setup.menu(t)) : (S.debug("Creating entire dropdown from select"), P = e("
").attr("class", j.attr("class")).addClass(T.selection).addClass(T.dropdown).html(E.dropdown(t)).insertBefore(j), j.hasClass(T.multiple) && j.prop("multiple") === !1 && (S.error(V.missingMultiple), j.prop("multiple", !0)), j.is("[multiple]") && S.set.multiple(), j.prop("disabled") && (S.debug("Disabling dropdown"), P.addClass(T.disabled)), j.removeAttr("class").detach().prependTo(P)), S.refresh() }, menu: function (e) { B.html(E.menu(e, k)), W = B.find(q.item) }, reference: function () { S.debug("Dropdown behavior was called on select, replacing with closest dropdown"), P = P.parent(q.dropdown), S.refresh(), S.setup.returnedObject(), m && (G = S, S.invoke(v)) }, returnedObject: function () { var e = s.slice(0, h), t = s.slice(h + 1); s = e.add(P).add(t) } }, refresh: function () { S.refreshSelectors(), S.refreshData() }, refreshSelectors: function () { S.verbose("Refreshing selector cache"), H = P.find(q.text), z = P.find(q.search), j = P.find(q.input), U = P.find(q.icon), N = P.prev().find(q.text).length > 0 ? P.prev().find(q.text) : P.prev(), B = P.children(q.menu), W = B.find(q.item) }, refreshData: function () { S.verbose("Refreshing cached metadata"), W.removeData(D.text).removeData(D.value), P.removeData(D.defaultText).removeData(D.defaultValue).removeData(D.placeholderText) }, toggle: function () { S.verbose("Toggling menu visibility"), S.is.active() ? S.hide() : S.show() }, show: function (t) { if (t = e.isFunction(t) ? t : function () { }, S.can.show() && !S.is.active()) { if (S.debug("Showing dropdown"), S.is.multiple() && !S.has.search() && S.is.allFiltered()) return !0; !S.has.message() || S.has.maxSelections() || S.has.allResultsFiltered() || S.remove.message(), y.onShow.call(Y) !== !1 && S.animate.show(function () { S.can.click() && S.bind.intent(), S.set.visible(), t.call(Y) }) } }, hide: function (t) { t = e.isFunction(t) ? t : function () { }, S.is.active() && (S.debug("Hiding dropdown"), y.onHide.call(Y) !== !1 && S.animate.hide(function () { S.remove.visible(), t.call(Y) })) }, hideOthers: function () { S.verbose("Finding other dropdowns to hide"), s.not(P).has(q.menu + "." + T.visible).dropdown("hide") }, hideMenu: function () { S.verbose("Hiding menu instantaneously"), S.remove.active(), S.remove.visible(), B.transition("hide") }, hideSubMenus: function () { var e = B.children(q.item).find(q.menu); S.verbose("Hiding sub menus", e), e.transition("hide") }, bind: { events: function () { c && S.bind.touchEvents(), S.bind.keyboardEvents(), S.bind.inputEvents(), S.bind.mouseEvents() }, touchEvents: function () { S.debug("Touch device detected binding additional touch events"), S.is.searchSelection() || S.is.single() && P.on("touchstart" + O, S.event.test.toggle), B.on("touchstart" + O, q.item, S.event.item.mouseenter) }, keyboardEvents: function () { S.verbose("Binding keyboard events"), P.on("keydown" + O, S.event.keydown), S.has.search() && P.on(S.get.inputEvent() + O, q.search, S.event.input), S.is.multiple() && r.on("keydown" + b, S.event.document.keydown) }, inputEvents: function () { S.verbose("Binding input change events"), P.on("change" + O, q.input, S.event.change) }, mouseEvents: function () { S.verbose("Binding mouse events"), S.is.multiple() && P.on("click" + O, q.label, S.event.label.click).on("click" + O, q.remove, S.event.remove.click), S.is.searchSelection() ? (P.on("mousedown" + O, q.menu, S.event.menu.mousedown).on("mouseup" + O, q.menu, S.event.menu.mouseup).on("click" + O, q.icon, S.event.icon.click).on("click" + O, q.search, S.show).on("focus" + O, q.search, S.event.search.focus).on("blur" + O, q.search, S.event.search.blur).on("click" + O, q.text, S.event.text.focus), S.is.multiple() && P.on("click" + O, S.event.click)) : ("click" == y.on ? P.on("click" + O, q.icon, S.event.icon.click).on("click" + O, S.event.test.toggle) : "hover" == y.on ? P.on("mouseenter" + O, S.delay.show).on("mouseleave" + O, S.delay.hide) : P.on(y.on + O, S.toggle), P.on("mousedown" + O, S.event.mousedown).on("mouseup" + O, S.event.mouseup).on("focus" + O, S.event.focus).on("blur" + O, S.event.blur)), B.on("mouseenter" + O, q.item, S.event.item.mouseenter).on("mouseleave" + O, q.item, S.event.item.mouseleave).on("click" + O, q.item, S.event.item.click) }, intent: function () { S.verbose("Binding hide intent event to document"), c && r.on("touchstart" + b, S.event.test.touch).on("touchmove" + b, S.event.test.touch), r.on("click" + b, S.event.test.hide) } }, unbind: { intent: function () { S.verbose("Removing hide intent event from document"), c && r.off("touchstart" + b).off("touchmove" + b), r.off("click" + b) } }, filter: function (e) { var t = e !== i ? e : S.get.query(), n = function () { S.is.multiple() && S.filterActive(), S.select.firstUnfiltered(), S.has.allResultsFiltered() ? y.onNoResults.call(Y, t) ? y.allowAdditions || (S.verbose("All items filtered, showing message", t), S.add.message(A.noResults)) : (S.verbose("All items filtered, hiding dropdown", t), S.hideMenu()) : S.remove.message(), y.allowAdditions && S.add.userSuggestion(e), S.is.searchSelection() && S.can.show() && S.is.focusedOnSearch() && S.show() }; y.useLabels && S.has.maxSelections() || (y.apiSettings ? S.can.useAPI() ? S.queryRemote(t, function () { n() }) : S.error(V.noAPI) : (S.filterItems(t), n())) }, queryRemote: function (t, n) { var i = { errorDuration: !1, throttle: y.throttle, urlData: { query: t }, onError: function () { S.add.message(A.serverError), n() }, onFailure: function () { S.add.message(A.serverError), n() }, onSuccess: function (e) { S.remove.message(), S.setup.menu({ values: e[k.remoteValues] }), n() } }; P.api("get request") || S.setup.api(), i = e.extend(!0, {}, i, y.apiSettings), P.api("setting", i).api("query") }, filterItems: function (t) { var n = t !== i ? t : S.get.query(), a = null, o = S.escape.regExp(n), s = new RegExp("^" + o, "igm"); S.has.query() && (a = [], S.verbose("Searching for matching values", n), W.each(function () { var t, i, o = e(this); if ("both" == y.match || "text" == y.match) { if (t = String(S.get.choiceText(o, !1)), -1 !== t.search(s)) return a.push(this), !0; if (y.fullTextSearch && S.fuzzySearch(n, t)) return a.push(this), !0 } if ("both" == y.match || "value" == y.match) { if (i = String(S.get.choiceValue(o, t)), -1 !== i.search(s)) return a.push(this), !0; if (y.fullTextSearch && S.fuzzySearch(n, i)) return a.push(this), !0 } })), S.debug("Showing only matched items", n), S.remove.filteredItem(), a && W.not(a).addClass(T.filtered) }, fuzzySearch: function (e, t) { var n = t.length, i = e.length; if (e = e.toLowerCase(), t = t.toLowerCase(), i > n) return !1; if (i === n) return e === t; e: for (var a = 0, o = 0; i > a; a++) { for (var s = e.charCodeAt(a) ; n > o;) if (t.charCodeAt(o++) === s) continue e; return !1 } return !0 }, filterActive: function () { y.useLabels && W.filter("." + T.active).addClass(T.filtered) }, focusSearch: function () { S.is.search() && !S.is.focusedOnSearch() && z[0].focus() }, forceSelection: function () { var e = W.not(T.filtered).filter("." + T.selected).eq(0), t = W.not(T.filtered).filter("." + T.active).eq(0), n = e.length > 0 ? e : t, i = n.size() > 0; if (S.has.query()) { if (i) return S.debug("Forcing partial selection to selected item", n), void S.event.item.click.call(n); S.remove.searchTerm() } S.hide() }, event: { change: function () { Q || (S.debug("Input changed, updating selection"), S.set.selected()) }, focus: function () { y.showOnFocus && !K && S.is.hidden() && !p && S.show() }, click: function (t) { var n = e(t.target); n.is(P) && !S.is.focusedOnSearch() && S.focusSearch() }, blur: function (e) { p = n.activeElement === this, K || p || (S.remove.activeLabel(), S.hide()) }, mousedown: function () { K = !0 }, mouseup: function () { K = !1 }, search: { focus: function () { K = !0, S.is.multiple() && S.remove.activeLabel(), y.showOnFocus && (S.search(), S.show()) }, blur: function (e) { p = n.activeElement === this, $ || p ? p && y.forceSelection && S.forceSelection() : S.is.multiple() ? (S.remove.activeLabel(), S.hide()) : y.forceSelection ? S.forceSelection() : S.hide() } }, icon: { click: function (e) { S.toggle(), e.stopPropagation() } }, text: { focus: function (e) { K = !0, S.focusSearch() } }, input: function (e) { (S.is.multiple() || S.is.searchSelection()) && S.set.filtered(), clearTimeout(S.timer), S.timer = setTimeout(S.search, y.delay.search) }, label: { click: function (t) { var n = e(this), i = P.find(q.label), a = i.filter("." + T.active), o = n.nextAll("." + T.active), s = n.prevAll("." + T.active), r = o.length > 0 ? n.nextUntil(o).add(a).add(n) : n.prevUntil(s).add(a).add(n); t.shiftKey ? (a.removeClass(T.active), r.addClass(T.active)) : t.ctrlKey ? n.toggleClass(T.active) : (a.removeClass(T.active), n.addClass(T.active)), y.onLabelSelect.apply(this, i.filter("." + T.active)) } }, remove: { click: function () { var t = e(this).parent(); t.hasClass(T.active) ? S.remove.activeLabels() : S.remove.activeLabels(t) } }, test: { toggle: function (e) { var t = S.is.multiple() ? S.show : S.toggle; S.determine.eventOnElement(e, t) && e.preventDefault() }, touch: function (e) { S.determine.eventOnElement(e, function () { "touchstart" == e.type ? S.timer = setTimeout(function () { S.hide() }, y.delay.touch) : "touchmove" == e.type && clearTimeout(S.timer) }), e.stopPropagation() }, hide: function (e) { S.determine.eventInModule(e, S.hide) } }, menu: { mousedown: function () { $ = !0 }, mouseup: function () { $ = !1 } }, item: { mouseenter: function (t) { var n = e(this).children(q.menu), i = e(this).siblings(q.item).children(q.menu); n.length > 0 && (clearTimeout(S.itemTimer), S.itemTimer = setTimeout(function () { S.verbose("Showing sub-menu", n), e.each(i, function () { S.animate.hide(!1, e(this)) }), S.animate.show(!1, n) }, y.delay.show), t.preventDefault()) }, mouseleave: function (t) { var n = e(this).children(q.menu); n.length > 0 && (clearTimeout(S.itemTimer), S.itemTimer = setTimeout(function () { S.verbose("Hiding sub-menu", n), S.animate.hide(!1, n) }, y.delay.hide)) }, touchend: function () { }, click: function (t) { var n = e(this), i = e(t ? t.target : ""), a = n.find(q.menu), o = S.get.choiceText(n), s = S.get.choiceValue(n, o), r = a.length > 0, l = a.find(i).length > 0; l || r && !y.allowCategorySelection || (y.useLabels || (S.remove.filteredItem(), S.remove.searchTerm(), S.set.scrollPosition(n)), S.determine.selectAction.call(this, o, s)) } }, document: { keydown: function (e) { var t = e.which, n = S.is.inObject(t, L); if (n) { var i = P.find(q.label), a = i.filter("." + T.active), o = (a.data(D.value), i.index(a)), s = i.length, r = a.length > 0, l = a.length > 1, c = 0 === o, u = o + 1 == s, d = S.is.searchSelection(), v = S.is.focusedOnSearch(), m = S.is.focused(), f = v && 0 === S.get.caretPosition(); if (d && !r && !v) return; t == L.leftArrow ? !m && !f || r ? r && (e.shiftKey ? S.verbose("Adding previous label to selection") : (S.verbose("Selecting previous label"), i.removeClass(T.active)), c && !l ? a.addClass(T.active) : a.prev(q.siblingLabel).addClass(T.active).end(), e.preventDefault()) : (S.verbose("Selecting previous label"), i.last().addClass(T.active)) : t == L.rightArrow ? (m && !r && i.first().addClass(T.active), r && (e.shiftKey ? S.verbose("Adding next label to selection") : (S.verbose("Selecting next label"), i.removeClass(T.active)), u ? d ? v ? i.removeClass(T.active) : S.focusSearch() : l ? a.next(q.siblingLabel).addClass(T.active) : a.addClass(T.active) : a.next(q.siblingLabel).addClass(T.active), e.preventDefault())) : t == L.deleteKey || t == L.backspace ? r ? (S.verbose("Removing active labels"), u && d && !v && S.focusSearch(), a.last().next(q.siblingLabel).addClass(T.active), S.remove.activeLabels(a), e.preventDefault()) : f && !r && t == L.backspace && (S.verbose("Removing last label on input backspace"), a = i.last().addClass(T.active), S.remove.activeLabels(a)) : a.removeClass(T.active) } } }, keydown: function (e) { var t = e.which, n = S.is.inObject(t, L); if (n) { var i, a, o = W.not(q.unselectable).filter("." + T.selected).eq(0), s = B.children("." + T.active).eq(0), r = o.length > 0 ? o : s, l = r.length > 0 ? r.siblings(":not(." + T.filtered + ")").andSelf() : B.children(":not(." + T.filtered + ")"), c = r.children(q.menu), u = r.closest(q.menu), d = u.hasClass(T.visible) || u.hasClass(T.animating) || u.parent(q.menu).length > 0, v = c.length > 0, m = r.length > 0, f = r.not(q.unselectable).length > 0, h = t == L.delimiter && y.allowAdditions && S.is.multiple(); if (S.is.visible()) { if ((t == L.enter || h) && (t == L.enter && m && v && !y.allowCategorySelection ? (S.verbose("Pressed enter on unselectable category, opening sub menu"), t = L.rightArrow) : f && (S.verbose("Selecting item from keyboard shortcut", r), S.event.item.click.call(r, e), S.is.searchSelection() && S.remove.searchTerm()), e.preventDefault()), t == L.leftArrow && (a = u[0] !== B[0], a && (S.verbose("Left key pressed, closing sub-menu"), S.animate.hide(!1, u), r.removeClass(T.selected), u.closest(q.item).addClass(T.selected), e.preventDefault())), t == L.rightArrow && v && (S.verbose("Right key pressed, opening sub-menu"), S.animate.show(!1, c), r.removeClass(T.selected), c.find(q.item).eq(0).addClass(T.selected), e.preventDefault()), t == L.upArrow) { if (i = m && d ? r.prevAll(q.item + ":not(" + q.unselectable + ")").eq(0) : W.eq(0), l.index(i) < 0) return S.verbose("Up key pressed but reached top of current menu"), void e.preventDefault(); S.verbose("Up key pressed, changing active item"), r.removeClass(T.selected), i.addClass(T.selected), S.set.scrollPosition(i), e.preventDefault() } if (t == L.downArrow) { if (i = m && d ? i = r.nextAll(q.item + ":not(" + q.unselectable + ")").eq(0) : W.eq(0), 0 === i.length) return S.verbose("Down key pressed but reached bottom of current menu"), void e.preventDefault(); S.verbose("Down key pressed, changing active item"), W.removeClass(T.selected), i.addClass(T.selected), S.set.scrollPosition(i), e.preventDefault() } t == L.pageUp && (S.scrollPage("up"), e.preventDefault()), t == L.pageDown && (S.scrollPage("down"), e.preventDefault()), t == L.escape && (S.verbose("Escape key pressed, closing dropdown"), S.hide()) } else h && e.preventDefault(), t == L.downArrow && (S.verbose("Down key pressed, showing dropdown"), S.show(), e.preventDefault()) } else S.is.selection() && !S.is.search() && S.set.selectedLetter(String.fromCharCode(t)) } }, trigger: { change: function () { var e = n.createEvent("HTMLEvents"), t = j[0]; t && (S.verbose("Triggering native change event"), e.initEvent("change", !0, !1), t.dispatchEvent(e)) } }, determine: { selectAction: function (t, n) { S.verbose("Determining action", y.action), e.isFunction(S.action[y.action]) ? (S.verbose("Triggering preset action", y.action, t, n), S.action[y.action].call(this, t, n)) : e.isFunction(y.action) ? (S.verbose("Triggering user action", y.action, t, n), y.action.call(this, t, n)) : S.error(V.action, y.action) }, eventInModule: function (t, i) { var a = e(t.target), o = a.closest(n.documentElement).length > 0, s = a.closest(P).length > 0; return i = e.isFunction(i) ? i : function () { }, o && !s ? (S.verbose("Triggering event", i), i(), !0) : (S.verbose("Event occurred in dropdown, canceling callback"), !1) }, eventOnElement: function (t, n) { var i = e(t.target), a = i.closest(q.siblingLabel), o = 0 === P.find(a).length, s = 0 === i.closest(B).length; return n = e.isFunction(n) ? n : function () { }, o && s ? (S.verbose("Triggering event", n), n(), !0) : (S.verbose("Event occurred in dropdown menu, canceling callback"), !1) } }, action: { nothing: function () { }, activate: function (t, n) { if (n = n !== i ? n : t, S.can.activate(e(this))) { if (S.set.selected(n, e(this)), S.is.multiple() && !S.is.allFiltered()) return; S.hideAndClear() } }, select: function (e, t) { S.action.activate.call(this) }, combo: function (t, n) { n = n !== i ? n : t, S.set.selected(n, e(this)), S.hideAndClear() }, hide: function (e, t) { S.set.value(t), S.hideAndClear() } }, get: { id: function () { return w }, defaultText: function () { return P.data(D.defaultText) }, defaultValue: function () { return P.data(D.defaultValue) }, placeholderText: function () { return P.data(D.placeholderText) || "" }, text: function () { return H.text() }, query: function () { return e.trim(z.val()) }, searchWidth: function (e) { return e * y.glyphWidth + "em" }, selectionCount: function () { var t, n = S.get.values(); return t = S.is.multiple() ? e.isArray(n) ? n.length : 0 : "" !== S.get.value() ? 1 : 0 }, transition: function (e) { return "auto" == y.transition ? S.is.upward(e) ? "slide up" : "slide down" : y.transition }, userValues: function () { var t = S.get.values(); return t ? (t = e.isArray(t) ? t : [t], e.grep(t, function (e) { return S.get.item(e) === !1 })) : !1 }, uniqueArray: function (t) { return e.grep(t, function (n, i) { return e.inArray(n, t) === i }) }, caretPosition: function () { var e, t, i = z.get(0); return "selectionStart" in i ? i.selectionStart : n.selection ? (i.focus(), e = n.selection.createRange(), t = e.text.length, e.moveStart("character", -i.value.length), e.text.length - t) : void 0 }, value: function () { var t = j.length > 0 ? j.val() : P.data(D.value); return e.isArray(t) && 1 === t.length && "" === t[0] ? "" : t }, values: function () { var e = S.get.value(); return "" === e ? "" : !S.has.selectInput() && S.is.multiple() ? "string" == typeof e ? e.split(y.delimiter) : "" : e }, remoteValues: function () { var t = S.get.values(), n = !1; return t && ("string" == typeof t && (t = [t]), n = {}, e.each(t, function (e, t) { var i = S.read.remoteData(t); S.verbose("Restoring value from session data", i, t), n[t] = i ? i : t })), n }, choiceText: function (t, n) { return n = n !== i ? n : y.preserveHTML, t ? (t.find(q.menu).length > 0 && (S.verbose("Retreiving text of element with sub-menu"), t = t.clone(), t.find(q.menu).remove(), t.find(q.menuIcon).remove()), t.data(D.text) !== i ? t.data(D.text) : e.trim(n ? t.html() : t.text())) : void 0 }, choiceValue: function (t, n) { return n = n || S.get.choiceText(t), t ? t.data(D.value) !== i ? String(t.data(D.value)) : "string" == typeof n ? e.trim(n.toLowerCase()) : String(n) : !1 }, inputEvent: function () { var e = z[0]; return e ? e.oninput !== i ? "input" : e.onpropertychange !== i ? "propertychange" : "keyup" : !1 }, selectValues: function () { var t = {}; return t.values = [], P.find("option").each(function () { var n = e(this), a = n.html(), o = n.attr("disabled"), s = n.attr("value") !== i ? n.attr("value") : a; "auto" === y.placeholder && "" === s ? t.placeholder = a : t.values.push({ name: a, value: s, disabled: o }) }), y.placeholder && "auto" !== y.placeholder && (S.debug("Setting placeholder value to", y.placeholder), t.placeholder = y.placeholder), y.sortSelect ? (t.values.sort(function (e, t) { return e.name > t.name ? 1 : -1 }), S.debug("Retrieved and sorted values from select", t)) : S.debug("Retreived values from select", t), t }, activeItem: function () { return W.filter("." + T.active) }, selectedItem: function () { var e = W.not(q.unselectable).filter("." + T.selected); return e.length > 0 ? e : W.eq(0) }, itemWithAdditions: function (e) { var t = S.get.item(e), n = S.create.userChoice(e), i = n && n.length > 0; return i && (t = t.length > 0 ? t.add(n) : n), t }, item: function (t, n) { var a, o, s = !1; return t = t !== i ? t : S.get.values() !== i ? S.get.values() : S.get.text(), a = o ? t.length > 0 : t !== i && null !== t, o = S.is.multiple() && e.isArray(t), n = "" === t || 0 === t ? !0 : n || !1, a && W.each(function () { var a = e(this), r = S.get.choiceText(a), l = S.get.choiceValue(a, r); if (null !== l && l !== i) if (o) (-1 !== e.inArray(String(l), t) || -1 !== e.inArray(r, t)) && (s = s ? s.add(a) : a); else if (n) { if (S.verbose("Ambiguous dropdown value using strict type check", a, t), l === t || r === t) return s = a, !0 } else if (String(l) == String(t) || r == t) return S.verbose("Found select item by value", l, t), s = a, !0 }), s } }, check: { maxSelections: function (e) { return y.maxSelections ? (e = e !== i ? e : S.get.selectionCount(), e >= y.maxSelections ? (S.debug("Maximum selection count reached"), y.useLabels && (W.addClass(T.filtered), S.add.message(A.maxSelections)), !0) : (S.verbose("No longer at maximum selection count"), S.remove.message(), S.remove.filteredItem(), S.is.searchSelection() && S.filterItems(), !1)) : !0 } }, restore: { defaults: function () { S.clear(), S.restore.defaultText(), S.restore.defaultValue() }, defaultText: function () { var e = S.get.defaultText(), t = S.get.placeholderText; e === t ? (S.debug("Restoring default placeholder text", e), S.set.placeholderText(e)) : (S.debug("Restoring default text", e), S.set.text(e)) }, defaultValue: function () { var e = S.get.defaultValue(); e !== i && (S.debug("Restoring default value", e), "" !== e ? (S.set.value(e), S.set.selected()) : (S.remove.activeItem(), S.remove.selectedItem())) }, labels: function () { y.allowAdditions && (y.useLabels || (S.error(V.labels), y.useLabels = !0), S.debug("Restoring selected values"), S.create.userLabels()), S.check.maxSelections() }, selected: function () { S.restore.values(), S.is.multiple() ? (S.debug("Restoring previously selected values and labels"), S.restore.labels()) : S.debug("Restoring previously selected values") }, values: function () { S.set.initialLoad(), y.apiSettings ? y.saveRemoteData ? S.restore.remoteValues() : S.clearValue() : S.set.selected(), S.remove.initialLoad() }, remoteValues: function () { var t = S.get.remoteValues(); S.debug("Recreating selected from session data", t), t && (S.is.single() ? e.each(t, function (e, t) { S.set.text(t) }) : e.each(t, function (e, t) { S.add.label(e, t) })) } }, read: { remoteData: function (e) { var n; return t.Storage === i ? void S.error(V.noStorage) : (n = sessionStorage.getItem(e), n !== i ? n : !1) } }, save: { defaults: function () { S.save.defaultText(), S.save.placeholderText(), S.save.defaultValue() }, defaultValue: function () { var e = S.get.value(); S.verbose("Saving default value as", e), P.data(D.defaultValue, e) }, defaultText: function () { var e = S.get.text(); S.verbose("Saving default text as", e), P.data(D.defaultText, e) }, placeholderText: function () { var e; y.placeholder !== !1 && H.hasClass(T.placeholder) && (e = S.get.text(), S.verbose("Saving placeholder text as", e), P.data(D.placeholderText, e)) }, remoteData: function (e, n) { return t.Storage === i ? void S.error(V.noStorage) : (S.verbose("Saving remote data to session storage", n, e), void sessionStorage.setItem(n, e)) } }, clear: function () { S.is.multiple() ? S.remove.labels() : (S.remove.activeItem(), S.remove.selectedItem()), S.set.placeholderText(), S.clearValue() }, clearValue: function () { S.set.value("") }, scrollPage: function (e, t) { var n, i, a, o = t || S.get.selectedItem(), s = o.closest(q.menu), r = s.outerHeight(), l = s.scrollTop(), c = W.eq(0).outerHeight(), u = Math.floor(r / c), d = (s.prop("scrollHeight"), "up" == e ? l - c * u : l + c * u), v = W.not(q.unselectable); a = "up" == e ? v.index(o) - u : v.index(o) + u, n = "up" == e ? a >= 0 : a < v.length, i = n ? v.eq(a) : "up" == e ? v.first() : v.last(), i.length > 0 && (S.debug("Scrolling page", e, i), o.removeClass(T.selected), i.addClass(T.selected), s.scrollTop(d)) }, set: { filtered: function () { var e = S.is.multiple(), t = S.is.searchSelection(), n = e && t, i = t ? S.get.query() : "", a = "string" == typeof i && i.length > 0, o = S.get.searchWidth(i.length), s = "" !== i; e && a && (S.verbose("Adjusting input width", o, y.glyphWidth), z.css("width", o)), a || n && s ? (S.verbose("Hiding placeholder text"), H.addClass(T.filtered)) : (!e || n && !s) && (S.verbose("Showing placeholder text"), H.removeClass(T.filtered)) }, loading: function () { P.addClass(T.loading) }, placeholderText: function (e) { e = e || S.get.placeholderText(), S.debug("Setting placeholder text", e), S.set.text(e), H.addClass(T.placeholder) }, tabbable: function () { S.has.search() ? (S.debug("Added tabindex to searchable dropdown"), z.val("").attr("tabindex", 0), B.attr("tabindex", -1)) : (S.debug("Added tabindex to dropdown"), P.attr("tabindex") === i && (P.attr("tabindex", 0), B.attr("tabindex", -1))) }, initialLoad: function () { S.verbose("Setting initial load"), g = !0 }, activeItem: function (e) { e.addClass(y.allowAdditions && e.filter(q.addition).length > 0 ? T.filtered : T.active) }, scrollPosition: function (e, t) { var n, a, o, s, r, l, c, u, d, v = 5; e = e || S.get.selectedItem(), n = e.closest(q.menu), a = e && e.length > 0, t = t !== i ? t : !1, e && n.length > 0 && a && (s = e.position().top, n.addClass(T.loading), l = n.scrollTop(), r = n.offset().top, s = e.offset().top, o = l - r + s, t || (c = n.height(), d = o + v > l + c, u = l > o - v), S.debug("Scrolling to active item", o), (t || u || d) && n.scrollTop(o), n.removeClass(T.loading)) }, text: function (e) { "select" !== y.action && ("combo" == y.action ? (S.debug("Changing combo button text", e, N), y.preserveHTML ? N.html(e) : N.text(e)) : (e !== S.get.placeholderText() && H.removeClass(T.placeholder), S.debug("Changing text", e, H), H.removeClass(T.filtered), y.preserveHTML ? H.html(e) : H.text(e))) }, selectedLetter: function (t) { var n, i = W.filter("." + T.selected), a = i.length > 0 && S.has.firstLetter(i, t), o = !1; a && (n = i.nextAll(W).eq(0), S.has.firstLetter(n, t) && (o = n)), o || W.each(function () { return S.has.firstLetter(e(this), t) ? (o = e(this), !1) : void 0 }), o && (S.verbose("Scrolling to next value with letter", t), S.set.scrollPosition(o), i.removeClass(T.selected), o.addClass(T.selected)) }, direction: function (e) { "auto" == y.direction ? S.is.onScreen(e) ? S.remove.upward(e) : S.set.upward(e) : "upward" == y.direction && S.set.upward(e) }, upward: function (e) { var t = e || P; t.addClass(T.upward) }, value: function (e, t, n) { var a = j.length > 0, o = (!S.has.value(e), S.get.values()), s = e !== i ? String(e) : e; if (a) { if (s == o && (S.verbose("Skipping value update already same value", e, o), !S.is.initialLoad())) return; S.is.single() && S.has.selectInput() && S.can.extendSelect() && (S.debug("Adding user option", e), S.add.optionValue(e)), S.debug("Updating input value", e, o), Q = !0, j.val(e), y.fireOnInit === !1 && S.is.initialLoad() ? S.debug("Input native change event ignored on initial load") : S.trigger.change(), Q = !1 } else S.verbose("Storing value in metadata", e, j), e !== o && P.data(D.value, s); y.fireOnInit === !1 && S.is.initialLoad() ? S.verbose("No callback on initial load", y.onChange) : y.onChange.call(Y, e, t, n) }, active: function () { P.addClass(T.active) }, multiple: function () { P.addClass(T.multiple) }, visible: function () { P.addClass(T.visible) }, exactly: function (e, t) { S.debug("Setting selected to exact values"), S.clear(), S.set.selected(e, t) }, selected: function (t, n) { var i = S.is.multiple(); n = y.allowAdditions ? n || S.get.itemWithAdditions(t) : n || S.get.item(t), n && (S.debug("Setting selected menu item to", n), S.is.single() ? (S.remove.activeItem(), S.remove.selectedItem()) : y.useLabels && S.remove.selectedItem(), n.each(function () { var t = e(this), a = S.get.choiceText(t), o = S.get.choiceValue(t, a), s = t.hasClass(T.filtered), r = t.hasClass(T.active), l = t.hasClass(T.addition), c = i && 1 == n.length; i ? !r || l ? (y.apiSettings && y.saveRemoteData && S.save.remoteData(a, o), y.useLabels ? (S.add.value(o, a, t), S.add.label(o, a, c), S.set.activeItem(t), S.filterActive(), S.select.nextAvailable(n)) : (S.add.value(o, a, t), S.set.text(S.add.variables(A.count)), S.set.activeItem(t))) : s || (S.debug("Selected active value, removing label"), S.remove.selected(o)) : (y.apiSettings && y.saveRemoteData && S.save.remoteData(a, o), S.set.text(a), S.set.value(o, a, t), t.addClass(T.active).addClass(T.selected)) })) } }, add: { label: function (t, n, i) { var a, o = S.is.searchSelection() ? z : H; return a = e("").addClass(T.label).attr("data-value", t).html(E.label(t, n)), a = y.onLabelCreate.call(a, t, n), S.has.label(t) ? void S.debug("Label already exists, skipping", t) : (y.label.variation && a.addClass(y.label.variation), void (i === !0 ? (S.debug("Animating in label", a), a.addClass(T.hidden).insertBefore(o).transition(y.label.transition, y.label.duration)) : (S.debug("Adding selection label", a), a.insertBefore(o)))) }, message: function (t) { var n = B.children(q.message), i = y.templates.message(S.add.variables(t)); n.length > 0 ? n.html(i) : n = e("
").html(i).addClass(T.message).appendTo(B) }, optionValue: function (t) { var n = j.find('option[value="' + t + '"]'), i = n.length > 0; i || (x && (x.disconnect(), S.verbose("Temporarily disconnecting mutation observer", t)), S.is.single() && (S.verbose("Removing previous user addition"), j.find("option." + T.addition).remove()), e("