{"version":3,"file":"bloodhound.min.js","sources":["bloodhound.js"],"sourcesContent":["/*!\r\n * typeahead.js 0.11.1\r\n * https://github.com/twitter/typeahead.js\r\n * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT\r\n */\r\n\r\n(function(root, factory) {\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"bloodhound\", [ \"jquery\" ], function(a0) {\r\n return root[\"Bloodhound\"] = factory(a0);\r\n });\r\n } else if (typeof exports === \"object\") {\r\n module.exports = factory(require(\"jquery\"));\r\n } else {\r\n root[\"Bloodhound\"] = factory(jQuery);\r\n }\r\n})(this, function($) {\r\n var _ = function() {\r\n \"use strict\";\r\n return {\r\n isMsie: function() {\r\n return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\\d+(.\\d+)?)/i)[2] : false;\r\n },\r\n isBlankString: function(str) {\r\n return !str || /^\\s*$/.test(str);\r\n },\r\n escapeRegExChars: function(str) {\r\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\r\n },\r\n isString: function(obj) {\r\n return typeof obj === \"string\";\r\n },\r\n isNumber: function(obj) {\r\n return typeof obj === \"number\";\r\n },\r\n isArray: $.isArray,\r\n isFunction: $.isFunction,\r\n isObject: $.isPlainObject,\r\n isUndefined: function(obj) {\r\n return typeof obj === \"undefined\";\r\n },\r\n isElement: function(obj) {\r\n return !!(obj && obj.nodeType === 1);\r\n },\r\n isJQuery: function(obj) {\r\n return obj instanceof $;\r\n },\r\n toStr: function toStr(s) {\r\n return _.isUndefined(s) || s === null ? \"\" : s + \"\";\r\n },\r\n bind: $.proxy,\r\n each: function(collection, cb) {\r\n $.each(collection, reverseArgs);\r\n function reverseArgs(index, value) {\r\n return cb(value, index);\r\n }\r\n },\r\n map: $.map,\r\n filter: $.grep,\r\n every: function(obj, test) {\r\n var result = true;\r\n if (!obj) {\r\n return result;\r\n }\r\n $.each(obj, function(key, val) {\r\n if (!(result = test.call(null, val, key, obj))) {\r\n return false;\r\n }\r\n });\r\n return !!result;\r\n },\r\n some: function(obj, test) {\r\n var result = false;\r\n if (!obj) {\r\n return result;\r\n }\r\n $.each(obj, function(key, val) {\r\n if (result = test.call(null, val, key, obj)) {\r\n return false;\r\n }\r\n });\r\n return !!result;\r\n },\r\n mixin: $.extend,\r\n identity: function(x) {\r\n return x;\r\n },\r\n clone: function(obj) {\r\n return $.extend(true, {}, obj);\r\n },\r\n getIdGenerator: function() {\r\n var counter = 0;\r\n return function() {\r\n return counter++;\r\n };\r\n },\r\n templatify: function templatify(obj) {\r\n return $.isFunction(obj) ? obj : template;\r\n function template() {\r\n return String(obj);\r\n }\r\n },\r\n defer: function(fn) {\r\n setTimeout(fn, 0);\r\n },\r\n debounce: function(func, wait, immediate) {\r\n var timeout, result;\r\n return function() {\r\n var context = this, args = arguments, later, callNow;\r\n later = function() {\r\n timeout = null;\r\n if (!immediate) {\r\n result = func.apply(context, args);\r\n }\r\n };\r\n callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) {\r\n result = func.apply(context, args);\r\n }\r\n return result;\r\n };\r\n },\r\n throttle: function(func, wait) {\r\n var context, args, timeout, result, previous, later;\r\n previous = 0;\r\n later = function() {\r\n previous = new Date();\r\n timeout = null;\r\n result = func.apply(context, args);\r\n };\r\n return function() {\r\n var now = new Date(), remaining = wait - (now - previous);\r\n context = this;\r\n args = arguments;\r\n if (remaining <= 0) {\r\n clearTimeout(timeout);\r\n timeout = null;\r\n previous = now;\r\n result = func.apply(context, args);\r\n } else if (!timeout) {\r\n timeout = setTimeout(later, remaining);\r\n }\r\n return result;\r\n };\r\n },\r\n stringify: function(val) {\r\n return _.isString(val) ? val : JSON.stringify(val);\r\n },\r\n noop: function() {}\r\n };\r\n }();\r\n var VERSION = \"0.11.1\";\r\n var tokenizers = function() {\r\n \"use strict\";\r\n return {\r\n nonword: nonword,\r\n whitespace: whitespace,\r\n obj: {\r\n nonword: getObjTokenizer(nonword),\r\n whitespace: getObjTokenizer(whitespace)\r\n }\r\n };\r\n function whitespace(str) {\r\n str = _.toStr(str);\r\n return str ? str.split(/\\s+/) : [];\r\n }\r\n function nonword(str) {\r\n str = _.toStr(str);\r\n return str ? str.split(/\\W+/) : [];\r\n }\r\n function getObjTokenizer(tokenizer) {\r\n return function setKey(keys) {\r\n keys = _.isArray(keys) ? keys : [].slice.call(arguments, 0);\r\n return function tokenize(o) {\r\n var tokens = [];\r\n _.each(keys, function(k) {\r\n tokens = tokens.concat(tokenizer(_.toStr(o[k])));\r\n });\r\n return tokens;\r\n };\r\n };\r\n }\r\n }();\r\n var LruCache = function() {\r\n \"use strict\";\r\n function LruCache(maxSize) {\r\n this.maxSize = _.isNumber(maxSize) ? maxSize : 100;\r\n this.reset();\r\n if (this.maxSize <= 0) {\r\n this.set = this.get = $.noop;\r\n }\r\n }\r\n _.mixin(LruCache.prototype, {\r\n set: function set(key, val) {\r\n var tailItem = this.list.tail, node;\r\n if (this.size >= this.maxSize) {\r\n this.list.remove(tailItem);\r\n delete this.hash[tailItem.key];\r\n this.size--;\r\n }\r\n if (node = this.hash[key]) {\r\n node.val = val;\r\n this.list.moveToFront(node);\r\n } else {\r\n node = new Node(key, val);\r\n this.list.add(node);\r\n this.hash[key] = node;\r\n this.size++;\r\n }\r\n },\r\n get: function get(key) {\r\n var node = this.hash[key];\r\n if (node) {\r\n this.list.moveToFront(node);\r\n return node.val;\r\n }\r\n },\r\n reset: function reset() {\r\n this.size = 0;\r\n this.hash = {};\r\n this.list = new List();\r\n }\r\n });\r\n function List() {\r\n this.head = this.tail = null;\r\n }\r\n _.mixin(List.prototype, {\r\n add: function add(node) {\r\n if (this.head) {\r\n node.next = this.head;\r\n this.head.prev = node;\r\n }\r\n this.head = node;\r\n this.tail = this.tail || node;\r\n },\r\n remove: function remove(node) {\r\n node.prev ? node.prev.next = node.next : this.head = node.next;\r\n node.next ? node.next.prev = node.prev : this.tail = node.prev;\r\n },\r\n moveToFront: function(node) {\r\n this.remove(node);\r\n this.add(node);\r\n }\r\n });\r\n function Node(key, val) {\r\n this.key = key;\r\n this.val = val;\r\n this.prev = this.next = null;\r\n }\r\n return LruCache;\r\n }();\r\n var PersistentStorage = function() {\r\n \"use strict\";\r\n var LOCAL_STORAGE;\r\n try {\r\n LOCAL_STORAGE = window.localStorage;\r\n LOCAL_STORAGE.setItem(\"~~~\", \"!\");\r\n LOCAL_STORAGE.removeItem(\"~~~\");\r\n } catch (err) {\r\n LOCAL_STORAGE = null;\r\n }\r\n function PersistentStorage(namespace, override) {\r\n this.prefix = [ \"__\", namespace, \"__\" ].join(\"\");\r\n this.ttlKey = \"__ttl__\";\r\n this.keyMatcher = new RegExp(\"^\" + _.escapeRegExChars(this.prefix));\r\n this.ls = override || LOCAL_STORAGE;\r\n !this.ls && this._noop();\r\n }\r\n _.mixin(PersistentStorage.prototype, {\r\n _prefix: function(key) {\r\n return this.prefix + key;\r\n },\r\n _ttlKey: function(key) {\r\n return this._prefix(key) + this.ttlKey;\r\n },\r\n _noop: function() {\r\n this.get = this.set = this.remove = this.clear = this.isExpired = _.noop;\r\n },\r\n _safeSet: function(key, val) {\r\n try {\r\n this.ls.setItem(key, val);\r\n } catch (err) {\r\n if (err.name === \"QuotaExceededError\") {\r\n this.clear();\r\n this._noop();\r\n }\r\n }\r\n },\r\n get: function(key) {\r\n if (this.isExpired(key)) {\r\n this.remove(key);\r\n }\r\n return decode(this.ls.getItem(this._prefix(key)));\r\n },\r\n set: function(key, val, ttl) {\r\n if (_.isNumber(ttl)) {\r\n this._safeSet(this._ttlKey(key), encode(now() + ttl));\r\n } else {\r\n this.ls.removeItem(this._ttlKey(key));\r\n }\r\n return this._safeSet(this._prefix(key), encode(val));\r\n },\r\n remove: function(key) {\r\n this.ls.removeItem(this._ttlKey(key));\r\n this.ls.removeItem(this._prefix(key));\r\n return this;\r\n },\r\n clear: function() {\r\n var i, keys = gatherMatchingKeys(this.keyMatcher);\r\n for (i = keys.length; i--; ) {\r\n this.remove(keys[i]);\r\n }\r\n return this;\r\n },\r\n isExpired: function(key) {\r\n var ttl = decode(this.ls.getItem(this._ttlKey(key)));\r\n return _.isNumber(ttl) && now() > ttl ? true : false;\r\n }\r\n });\r\n return PersistentStorage;\r\n function now() {\r\n return new Date().getTime();\r\n }\r\n function encode(val) {\r\n return JSON.stringify(_.isUndefined(val) ? null : val);\r\n }\r\n function decode(val) {\r\n return $.parseJSON(val);\r\n }\r\n function gatherMatchingKeys(keyMatcher) {\r\n var i, key, keys = [], len = LOCAL_STORAGE.length;\r\n for (i = 0; i < len; i++) {\r\n if ((key = LOCAL_STORAGE.key(i)).match(keyMatcher)) {\r\n keys.push(key.replace(keyMatcher, \"\"));\r\n }\r\n }\r\n return keys;\r\n }\r\n }();\r\n var Transport = function() {\r\n \"use strict\";\r\n var pendingRequestsCount = 0, pendingRequests = {}, maxPendingRequests = 6, sharedCache = new LruCache(10);\r\n function Transport(o) {\r\n o = o || {};\r\n this.cancelled = false;\r\n this.lastReq = null;\r\n this._send = o.transport;\r\n this._get = o.limiter ? o.limiter(this._get) : this._get;\r\n this._cache = o.cache === false ? new LruCache(0) : sharedCache;\r\n }\r\n Transport.setMaxPendingRequests = function setMaxPendingRequests(num) {\r\n maxPendingRequests = num;\r\n };\r\n Transport.resetCache = function resetCache() {\r\n sharedCache.reset();\r\n };\r\n _.mixin(Transport.prototype, {\r\n _fingerprint: function fingerprint(o) {\r\n o = o || {};\r\n return o.url + o.type + $.param(o.data || {});\r\n },\r\n _get: function(o, cb) {\r\n var that = this, fingerprint, jqXhr;\r\n fingerprint = this._fingerprint(o);\r\n if (this.cancelled || fingerprint !== this.lastReq) {\r\n return;\r\n }\r\n if (jqXhr = pendingRequests[fingerprint]) {\r\n jqXhr.done(done).fail(fail);\r\n } else if (pendingRequestsCount < maxPendingRequests) {\r\n pendingRequestsCount++;\r\n pendingRequests[fingerprint] = this._send(o).done(done).fail(fail).always(always);\r\n } else {\r\n this.onDeckRequestArgs = [].slice.call(arguments, 0);\r\n }\r\n function done(resp) {\r\n cb(null, resp);\r\n that._cache.set(fingerprint, resp);\r\n }\r\n function fail() {\r\n cb(true);\r\n }\r\n function always() {\r\n pendingRequestsCount--;\r\n delete pendingRequests[fingerprint];\r\n if (that.onDeckRequestArgs) {\r\n that._get.apply(that, that.onDeckRequestArgs);\r\n that.onDeckRequestArgs = null;\r\n }\r\n }\r\n },\r\n get: function(o, cb) {\r\n var resp, fingerprint;\r\n cb = cb || $.noop;\r\n o = _.isString(o) ? {\r\n url: o\r\n } : o || {};\r\n fingerprint = this._fingerprint(o);\r\n this.cancelled = false;\r\n this.lastReq = fingerprint;\r\n if (resp = this._cache.get(fingerprint)) {\r\n cb(null, resp);\r\n } else {\r\n this._get(o, cb);\r\n }\r\n },\r\n cancel: function() {\r\n this.cancelled = true;\r\n }\r\n });\r\n return Transport;\r\n }();\r\n var SearchIndex = window.SearchIndex = function() {\r\n \"use strict\";\r\n var CHILDREN = \"c\", IDS = \"i\";\r\n function SearchIndex(o) {\r\n o = o || {};\r\n if (!o.datumTokenizer || !o.queryTokenizer) {\r\n $.error(\"datumTokenizer and queryTokenizer are both required\");\r\n }\r\n this.identify = o.identify || _.stringify;\r\n this.datumTokenizer = o.datumTokenizer;\r\n this.queryTokenizer = o.queryTokenizer;\r\n this.reset();\r\n }\r\n _.mixin(SearchIndex.prototype, {\r\n bootstrap: function bootstrap(o) {\r\n this.datums = o.datums;\r\n this.trie = o.trie;\r\n },\r\n add: function(data) {\r\n var that = this;\r\n data = _.isArray(data) ? data : [ data ];\r\n _.each(data, function(datum) {\r\n var id, tokens;\r\n that.datums[id = that.identify(datum)] = datum;\r\n tokens = normalizeTokens(that.datumTokenizer(datum));\r\n _.each(tokens, function(token) {\r\n var node, chars, ch;\r\n node = that.trie;\r\n chars = token.split(\"\");\r\n while (ch = chars.shift()) {\r\n node = node[CHILDREN][ch] || (node[CHILDREN][ch] = newNode());\r\n node[IDS].push(id);\r\n }\r\n });\r\n });\r\n },\r\n get: function get(ids) {\r\n var that = this;\r\n return _.map(ids, function(id) {\r\n return that.datums[id];\r\n });\r\n },\r\n search: function search(query) {\r\n var that = this, tokens, matches;\r\n tokens = normalizeTokens(this.queryTokenizer(query));\r\n _.each(tokens, function(token) {\r\n var node, chars, ch, ids;\r\n if (matches && matches.length === 0) {\r\n return false;\r\n }\r\n node = that.trie;\r\n chars = token.split(\"\");\r\n while (node && (ch = chars.shift())) {\r\n node = node[CHILDREN][ch];\r\n }\r\n if (node && chars.length === 0) {\r\n ids = node[IDS].slice(0);\r\n matches = matches ? getIntersection(matches, ids) : ids;\r\n } else {\r\n matches = [];\r\n return false;\r\n }\r\n });\r\n return matches ? _.map(unique(matches), function(id) {\r\n return that.datums[id];\r\n }) : [];\r\n },\r\n all: function all() {\r\n var values = [];\r\n for (var key in this.datums) {\r\n values.push(this.datums[key]);\r\n }\r\n return values;\r\n },\r\n reset: function reset() {\r\n this.datums = {};\r\n this.trie = newNode();\r\n },\r\n serialize: function serialize() {\r\n return {\r\n datums: this.datums,\r\n trie: this.trie\r\n };\r\n }\r\n });\r\n return SearchIndex;\r\n function normalizeTokens(tokens) {\r\n tokens = _.filter(tokens, function(token) {\r\n return !!token;\r\n });\r\n tokens = _.map(tokens, function(token) {\r\n return token.toLowerCase();\r\n });\r\n return tokens;\r\n }\r\n function newNode() {\r\n var node = {};\r\n node[IDS] = [];\r\n node[CHILDREN] = {};\r\n return node;\r\n }\r\n function unique(array) {\r\n var seen = {}, uniques = [];\r\n for (var i = 0, len = array.length; i < len; i++) {\r\n if (!seen[array[i]]) {\r\n seen[array[i]] = true;\r\n uniques.push(array[i]);\r\n }\r\n }\r\n return uniques;\r\n }\r\n function getIntersection(arrayA, arrayB) {\r\n var ai = 0, bi = 0, intersection = [];\r\n arrayA = arrayA.sort();\r\n arrayB = arrayB.sort();\r\n var lenArrayA = arrayA.length, lenArrayB = arrayB.length;\r\n while (ai < lenArrayA && bi < lenArrayB) {\r\n if (arrayA[ai] < arrayB[bi]) {\r\n ai++;\r\n } else if (arrayA[ai] > arrayB[bi]) {\r\n bi++;\r\n } else {\r\n intersection.push(arrayA[ai]);\r\n ai++;\r\n bi++;\r\n }\r\n }\r\n return intersection;\r\n }\r\n }();\r\n var Prefetch = function() {\r\n \"use strict\";\r\n var keys;\r\n keys = {\r\n data: \"data\",\r\n protocol: \"protocol\",\r\n thumbprint: \"thumbprint\"\r\n };\r\n function Prefetch(o) {\r\n this.url = o.url;\r\n this.ttl = o.ttl;\r\n this.cache = o.cache;\r\n this.prepare = o.prepare;\r\n this.transform = o.transform;\r\n this.transport = o.transport;\r\n this.thumbprint = o.thumbprint;\r\n this.storage = new PersistentStorage(o.cacheKey);\r\n }\r\n _.mixin(Prefetch.prototype, {\r\n _settings: function settings() {\r\n return {\r\n url: this.url,\r\n type: \"GET\",\r\n dataType: \"json\"\r\n };\r\n },\r\n store: function store(data) {\r\n if (!this.cache) {\r\n return;\r\n }\r\n this.storage.set(keys.data, data, this.ttl);\r\n this.storage.set(keys.protocol, location.protocol, this.ttl);\r\n this.storage.set(keys.thumbprint, this.thumbprint, this.ttl);\r\n },\r\n fromCache: function fromCache() {\r\n var stored = {}, isExpired;\r\n if (!this.cache) {\r\n return null;\r\n }\r\n stored.data = this.storage.get(keys.data);\r\n stored.protocol = this.storage.get(keys.protocol);\r\n stored.thumbprint = this.storage.get(keys.thumbprint);\r\n isExpired = stored.thumbprint !== this.thumbprint || stored.protocol !== location.protocol;\r\n return stored.data && !isExpired ? stored.data : null;\r\n },\r\n fromNetwork: function(cb) {\r\n var that = this, settings;\r\n if (!cb) {\r\n return;\r\n }\r\n settings = this.prepare(this._settings());\r\n this.transport(settings).fail(onError).done(onResponse);\r\n function onError() {\r\n cb(true);\r\n }\r\n function onResponse(resp) {\r\n cb(null, that.transform(resp));\r\n }\r\n },\r\n clear: function clear() {\r\n this.storage.clear();\r\n return this;\r\n }\r\n });\r\n return Prefetch;\r\n }();\r\n var Remote = function() {\r\n \"use strict\";\r\n function Remote(o) {\r\n this.url = o.url;\r\n this.prepare = o.prepare;\r\n this.transform = o.transform;\r\n this.transport = new Transport({\r\n cache: o.cache,\r\n limiter: o.limiter,\r\n transport: o.transport\r\n });\r\n }\r\n _.mixin(Remote.prototype, {\r\n _settings: function settings() {\r\n return {\r\n url: this.url,\r\n type: \"GET\",\r\n dataType: \"json\"\r\n };\r\n },\r\n get: function get(query, cb) {\r\n var that = this, settings;\r\n if (!cb) {\r\n return;\r\n }\r\n query = query || \"\";\r\n settings = this.prepare(query, this._settings());\r\n return this.transport.get(settings, onResponse);\r\n function onResponse(err, resp) {\r\n err ? cb([]) : cb(that.transform(resp));\r\n }\r\n },\r\n cancelLastRequest: function cancelLastRequest() {\r\n this.transport.cancel();\r\n }\r\n });\r\n return Remote;\r\n }();\r\n var oParser = function() {\r\n \"use strict\";\r\n return function parse(o) {\r\n var defaults, sorter;\r\n defaults = {\r\n initialize: true,\r\n identify: _.stringify,\r\n datumTokenizer: null,\r\n queryTokenizer: null,\r\n sufficient: 5,\r\n sorter: null,\r\n local: [],\r\n prefetch: null,\r\n remote: null\r\n };\r\n o = _.mixin(defaults, o || {});\r\n !o.datumTokenizer && $.error(\"datumTokenizer is required\");\r\n !o.queryTokenizer && $.error(\"queryTokenizer is required\");\r\n sorter = o.sorter;\r\n o.sorter = sorter ? function(x) {\r\n return x.sort(sorter);\r\n } : _.identity;\r\n o.local = _.isFunction(o.local) ? o.local() : o.local;\r\n o.prefetch = parsePrefetch(o.prefetch);\r\n o.remote = parseRemote(o.remote);\r\n return o;\r\n };\r\n function parsePrefetch(o) {\r\n var defaults;\r\n if (!o) {\r\n return null;\r\n }\r\n defaults = {\r\n url: null,\r\n ttl: 24 * 60 * 60 * 1e3,\r\n cache: true,\r\n cacheKey: null,\r\n thumbprint: \"\",\r\n prepare: _.identity,\r\n transform: _.identity,\r\n transport: null\r\n };\r\n o = _.isString(o) ? {\r\n url: o\r\n } : o;\r\n o = _.mixin(defaults, o);\r\n !o.url && $.error(\"prefetch requires url to be set\");\r\n o.transform = o.filter || o.transform;\r\n o.cacheKey = o.cacheKey || o.url;\r\n o.thumbprint = VERSION + o.thumbprint;\r\n o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;\r\n return o;\r\n }\r\n function parseRemote(o) {\r\n var defaults;\r\n if (!o) {\r\n return;\r\n }\r\n defaults = {\r\n url: null,\r\n cache: true,\r\n prepare: null,\r\n replace: null,\r\n wildcard: null,\r\n limiter: null,\r\n rateLimitBy: \"debounce\",\r\n rateLimitWait: 300,\r\n transform: _.identity,\r\n transport: null\r\n };\r\n o = _.isString(o) ? {\r\n url: o\r\n } : o;\r\n o = _.mixin(defaults, o);\r\n !o.url && $.error(\"remote requires url to be set\");\r\n o.transform = o.filter || o.transform;\r\n o.prepare = toRemotePrepare(o);\r\n o.limiter = toLimiter(o);\r\n o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;\r\n delete o.replace;\r\n delete o.wildcard;\r\n delete o.rateLimitBy;\r\n delete o.rateLimitWait;\r\n return o;\r\n }\r\n function toRemotePrepare(o) {\r\n var prepare, replace, wildcard;\r\n prepare = o.prepare;\r\n replace = o.replace;\r\n wildcard = o.wildcard;\r\n if (prepare) {\r\n return prepare;\r\n }\r\n if (replace) {\r\n prepare = prepareByReplace;\r\n } else if (o.wildcard) {\r\n prepare = prepareByWildcard;\r\n } else {\r\n prepare = idenityPrepare;\r\n }\r\n return prepare;\r\n function prepareByReplace(query, settings) {\r\n settings.url = replace(settings.url, query);\r\n return settings;\r\n }\r\n function prepareByWildcard(query, settings) {\r\n settings.url = settings.url.replace(wildcard, encodeURIComponent(query));\r\n return settings;\r\n }\r\n function idenityPrepare(query, settings) {\r\n return settings;\r\n }\r\n }\r\n function toLimiter(o) {\r\n var limiter, method, wait;\r\n limiter = o.limiter;\r\n method = o.rateLimitBy;\r\n wait = o.rateLimitWait;\r\n if (!limiter) {\r\n limiter = /^throttle$/i.test(method) ? throttle(wait) : debounce(wait);\r\n }\r\n return limiter;\r\n function debounce(wait) {\r\n return function debounce(fn) {\r\n return _.debounce(fn, wait);\r\n };\r\n }\r\n function throttle(wait) {\r\n return function throttle(fn) {\r\n return _.throttle(fn, wait);\r\n };\r\n }\r\n }\r\n function callbackToDeferred(fn) {\r\n return function wrapper(o) {\r\n var deferred = $.Deferred();\r\n fn(o, onSuccess, onError);\r\n return deferred;\r\n function onSuccess(resp) {\r\n _.defer(function() {\r\n deferred.resolve(resp);\r\n });\r\n }\r\n function onError(err) {\r\n _.defer(function() {\r\n deferred.reject(err);\r\n });\r\n }\r\n };\r\n }\r\n }();\r\n var Bloodhound = function() {\r\n \"use strict\";\r\n var old;\r\n old = window && window.Bloodhound;\r\n function Bloodhound(o) {\r\n o = oParser(o);\r\n this.sorter = o.sorter;\r\n this.identify = o.identify;\r\n this.sufficient = o.sufficient;\r\n this.local = o.local;\r\n this.remote = o.remote ? new Remote(o.remote) : null;\r\n this.prefetch = o.prefetch ? new Prefetch(o.prefetch) : null;\r\n this.index = new SearchIndex({\r\n identify: this.identify,\r\n datumTokenizer: o.datumTokenizer,\r\n queryTokenizer: o.queryTokenizer\r\n });\r\n o.initialize !== false && this.initialize();\r\n }\r\n Bloodhound.noConflict = function noConflict() {\r\n window && (window.Bloodhound = old);\r\n return Bloodhound;\r\n };\r\n Bloodhound.tokenizers = tokenizers;\r\n _.mixin(Bloodhound.prototype, {\r\n __ttAdapter: function ttAdapter() {\r\n var that = this;\r\n return this.remote ? withAsync : withoutAsync;\r\n function withAsync(query, sync, async) {\r\n return that.search(query, sync, async);\r\n }\r\n function withoutAsync(query, sync) {\r\n return that.search(query, sync);\r\n }\r\n },\r\n _loadPrefetch: function loadPrefetch() {\r\n var that = this, deferred, serialized;\r\n deferred = $.Deferred();\r\n if (!this.prefetch) {\r\n deferred.resolve();\r\n } else if (serialized = this.prefetch.fromCache()) {\r\n this.index.bootstrap(serialized);\r\n deferred.resolve();\r\n } else {\r\n this.prefetch.fromNetwork(done);\r\n }\r\n return deferred.promise();\r\n function done(err, data) {\r\n if (err) {\r\n return deferred.reject();\r\n }\r\n that.add(data);\r\n that.prefetch.store(that.index.serialize());\r\n deferred.resolve();\r\n }\r\n },\r\n _initialize: function initialize() {\r\n var that = this, deferred;\r\n this.clear();\r\n (this.initPromise = this._loadPrefetch()).done(addLocalToIndex);\r\n return this.initPromise;\r\n function addLocalToIndex() {\r\n that.add(that.local);\r\n }\r\n },\r\n initialize: function initialize(force) {\r\n return !this.initPromise || force ? this._initialize() : this.initPromise;\r\n },\r\n add: function add(data) {\r\n this.index.add(data);\r\n return this;\r\n },\r\n get: function get(ids) {\r\n ids = _.isArray(ids) ? ids : [].slice.call(arguments);\r\n return this.index.get(ids);\r\n },\r\n search: function search(query, sync, async) {\r\n var that = this, local;\r\n local = this.sorter(this.index.search(query));\r\n sync(this.remote ? local.slice() : local);\r\n if (this.remote && local.length < this.sufficient) {\r\n this.remote.get(query, processRemote);\r\n } else if (this.remote) {\r\n this.remote.cancelLastRequest();\r\n }\r\n return this;\r\n function processRemote(remote) {\r\n var nonDuplicates = [];\r\n _.each(remote, function(r) {\r\n !_.some(local, function(l) {\r\n return that.identify(r) === that.identify(l);\r\n }) && nonDuplicates.push(r);\r\n });\r\n async && async(nonDuplicates);\r\n }\r\n },\r\n all: function all() {\r\n return this.index.all();\r\n },\r\n clear: function clear() {\r\n this.index.reset();\r\n return this;\r\n },\r\n clearPrefetchCache: function clearPrefetchCache() {\r\n this.prefetch && this.prefetch.clear();\r\n return this;\r\n },\r\n clearRemoteCache: function clearRemoteCache() {\r\n Transport.resetCache();\r\n return this;\r\n },\r\n ttAdapter: function ttAdapter() {\r\n return this.__ttAdapter();\r\n }\r\n });\r\n return Bloodhound;\r\n }();\r\n return Bloodhound;\r\n});"],"names":["root","factory","define","amd","a0","exports","module","require","jQuery","this","$","_","isMsie","test","navigator","userAgent","match","isBlankString","str","escapeRegExChars","replace","isString","obj","isNumber","isArray","isFunction","isObject","isPlainObject","isUndefined","isElement","nodeType","isJQuery","toStr","s","bind","proxy","each","collection","cb","index","value","map","filter","grep","every","result","key","val","call","some","mixin","extend","identity","x","clone","getIdGenerator","counter","templatify","String","defer","fn","setTimeout","debounce","func","wait","immediate","timeout","context","args","arguments","later","apply","callNow","clearTimeout","throttle","previous","Date","now","remaining","stringify","JSON","noop","tokenizers","nonword","whitespace","getObjTokenizer","split","tokenizer","keys","slice","o","tokens","k","concat","LruCache","prototype","set","tailItem","list","tail","size","maxSize","remove","hash","node","moveToFront","Node","add","get","reset","List","head","next","prev","pendingRequestsCount","pendingRequests","maxPendingRequests","sharedCache","PersistentStorage","LOCAL_STORAGE","window","localStorage","setItem","removeItem","err","namespace","override","prefix","join","ttlKey","keyMatcher","RegExp","ls","_noop","_prefix","_ttlKey","clear","isExpired","_safeSet","name","decode","getItem","ttl","encode","i","len","length","push","getTime","parseJSON","Transport","setMaxPendingRequests","num","resetCache","_fingerprint","url","type","param","data","_get","fingerprint","jqXhr","that","done","resp","_cache","fail","cancelled","lastReq","_send","always","onDeckRequestArgs","cancel","transport","limiter","cache","SearchIndex","bootstrap","datums","trie","datum","id","identify","normalizeTokens","datumTokenizer","token","ch","chars","shift","newNode","ids","search","query","matches","queryTokenizer","arrayA","arrayB","ai","bi","intersection","lenArrayA","sort","lenArrayB","array","seen","uniques","all","values","serialize","error","toLowerCase","c","protocol","thumbprint","Prefetch","_settings","dataType","store","storage","location","fromCache","stored","fromNetwork","settings","prepare","transform","cacheKey","Remote","cancelLastRequest","old","oParser","sorter","defaults","initialize","sufficient","local","prefetch","remote","callbackToDeferred","ajax","wildcard","rateLimitBy","rateLimitWait","encodeURIComponent","method","deferred","Deferred","resolve","reject","Bloodhound","noConflict","__ttAdapter","sync","async","_loadPrefetch","serialized","promise","_initialize","initPromise","force","nonDuplicates","r","l","clearPrefetchCache","clearRemoteCache","ttAdapter"],"mappings":"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"}