{"version":3,"sources":["webpack:///chunk.typeahead.72a70ba070807fe8138a.js","webpack:///./~/timers-browserify/main.js","webpack:///./js/plugins/typeahead.bundle.js"],"names":["webpackJsonp",14,"module","exports","__webpack_require__","setImmediate","clearImmediate","Timeout","id","clearFn","this","_id","_clearFn","nextTick","apply","Function","prototype","slice","Array","immediateIds","nextImmediateId","setTimeout","call","window","arguments","clearTimeout","setInterval","clearInterval","timeout","close","unref","ref","enroll","item","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","active","_onTimeout","fn","args","length",83,"__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","root","factory","a0","undefined","$","_","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","reverseArgs","index","value","map","filter","grep","every","result","key","val","some","mixin","extend","identity","x","clone","getIdGenerator","counter","templatify","template","String","defer","debounce","func","wait","immediate","later","callNow","context","throttle","previous","Date","now","remaining","stringify","JSON","noop","WWW","build","o","www","classes","defaultClassNames","css","buildCss","html","buildHtml","selectors","buildSelectors","c","wrapper","menu","menuinner","v","k","position","display","hint","top","left","borderColor","boxShadow","opacity","input","verticalAlign","backgroundColor","inputWithNoHint","zIndex","ltr","right","rtl","backgroundImage","dataset","suggestion","selectable","empty","open","cursor","highlight","EventBus","el","error","$el","namespace","deprecationMap","render","cursorchange","select","autocomplete","_trigger","type","$e","Event","unshift","trigger","before","isDefaultPrevented","deprecatedType","EventEmitter","on","method","types","split","splitter","bindContext","_callbacks","shift","sync","async","push","onAsync","onSync","off","callbacks","syncFlush","asyncFlush","getFlush","concat","flush","cancelled","i","len","getNextTick","nextTickFn","doc","getRegex","patterns","caseSensitive","wordsOnly","regexStr","escapedPatterns","join","RegExp","defaults","node","pattern","tagName","className","hightlightTextNode","textNode","patternNode","wrapperNode","regex","exec","data","createElement","splitText","appendChild","cloneNode","parentNode","replaceChild","traverse","childNode","TEXT_NODE_TYPE","childNodes","document","Input","$hint","$input","query","queryWhenFocused","hasFocus","$overflowHelper","buildOverflowHelper","_checkLanguageDirection","setHint","getHint","clearHint","clearHintIfInvalid","visibility","whiteSpace","fontFamily","fontSize","fontStyle","fontVariant","fontWeight","wordSpacing","letterSpacing","textIndent","textRendering","textTransform","insertAfter","areQueriesEquivalent","a","b","normalizeQuery","withModifier","altKey","ctrlKey","metaKey","shiftKey","specialKeyCodeMap",9,27,37,39,13,38,40,"_onBlur","resetInputValue","_onFocus","_onKeydown","keyName","which","keyCode","_managePreventDefault","_shouldTrigger","_onInput","_setQuery","getInputValue","preventDefault","dir","toLowerCase","attr","silent","areEquivalent","hasDifferentWhitespace","onBlur","onFocus","onKeydown","onInput","that","focus","blur","getLangDir","getQuery","setQuery","setInputValue","hasQueryChangedSinceLastFocus","valIsPrefixOfHint","isValid","indexOf","hasOverflow","is","constraint","width","text","isCursorAtEnd","valueLength","selectionStart","range","selection","createRange","moveStart","destroy","remove","Dataset","templates","notFound","source","name","isValidName","nameGenerator","limit","displayFn","getDisplayFn","displayKey","getTemplates","__ttAdapter","isHint","_resetLastSuggestion","addClass","suggestionTemplate","pending","header","footer","keys","extractData","_overwrite","suggestions","_renderSuggestions","_renderPending","_renderNotFound","_empty","_append","$lastSuggestion","_appendSuggestions","$fragment","_getSuggestionsFragment","children","last","prepend","_getHeader","append","_getFooter","after","fragment","createDocumentFragment","_injectQuery","_query","update","syncCalled","rendered","canceled","cancel","clear","isEmpty","Menu","initializeDataset","oDataset","$node","find","first","appendTo","datasets","_onSelectableClick","currentTarget","_onRendered","toggleClass","_allDatasetsEmpty","_onCleared","_propagate","isDatasetEmpty","_getSelectables","_getMainSelectables","l","add","_removeCursor","$selectable","getActiveSelectable","removeClass","_ensureVisible","elTop","elBottom","nodeScrollTop","nodeHeight","outerHeight","scrollTop","height","parseInt","onSelectableClick","isOpen","hasClass","setLanguageDirection","selectableRelativeToCursor","delta","$selectables","$oldCursor","oldIndex","newIndex","eq","setCursor","getSelectableData","getTopSelectable","updateDataset","isValidUpdate","clearDataset","destroyDataset","DefaultMenu","_show","_hide","$nodeToHide","parent","hide","$nodeToShow","Typeahead","onFocused","onBlurred","onEnterKeyed","onTabKeyed","onEscKeyed","onUpKeyed","onDownKeyed","onLeftKeyed","onRightKeyed","onQueryChanged","onWhitespaceChanged","eventBus","minLength","enabled","activate","_hacks","_onSelectableClicked","_onAsyncRequested","_onAsyncCanceled","_onAsyncReceived","_onDatasetRendered","_onDatasetCleared","_onLangDirChanged","ctx","methods","$menu","isActive","hasActive","activeElement","has","stopImmediatePropagation","_updateHint","_onFocused","_minLengthMet","_onBlurred","_onEnterKeyed","_onTabKeyed","_onEscKeyed","_onUpKeyed","moveCursor","_onDownKeyed","_onLeftKeyed","_onRightKeyed","_onQueryChanged","e","_onWhitespaceChanged","_openIfActive","escapedQuery","frontMatchRegEx","isEnabled","enable","disable","deactivate","setVal","getVal","$candidate","payload","cancelMove","ttEach","$els","typeahead","buildHintFromInput","removeData","getBackgroundStyles","prop","removeAttr","spellcheck","tabindex","prepInput","attrs","style","backgroundAttachment","backgroundClip","backgroundOrigin","backgroundPosition","backgroundRepeat","backgroundSize","revert","$wrapper","detach","$elOrNull","old","initialize","attach","$menuinner","defaultHint","defaultMenu","MenuConstructor","d","wrap","classNames","t","success","newVal","noConflict"],"mappings":"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","file":"chunk.typeahead.72a70ba070807fe8138a.js","sourcesContent":["webpackJsonp([13],{\n\n/***/ 14:\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(setImmediate, clearImmediate) {var nextTick = __webpack_require__(22).nextTick;\n\tvar apply = Function.prototype.apply;\n\tvar slice = Array.prototype.slice;\n\tvar immediateIds = {};\n\tvar nextImmediateId = 0;\n\t\n\t// DOM APIs, for completeness\n\t\n\texports.setTimeout = function() {\n\t return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n\t};\n\texports.setInterval = function() {\n\t return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n\t};\n\texports.clearTimeout =\n\texports.clearInterval = function(timeout) { timeout.close(); };\n\t\n\tfunction Timeout(id, clearFn) {\n\t this._id = id;\n\t this._clearFn = clearFn;\n\t}\n\tTimeout.prototype.unref = Timeout.prototype.ref = function() {};\n\tTimeout.prototype.close = function() {\n\t this._clearFn.call(window, this._id);\n\t};\n\t\n\t// Does not start the time, just sets up the members needed.\n\texports.enroll = function(item, msecs) {\n\t clearTimeout(item._idleTimeoutId);\n\t item._idleTimeout = msecs;\n\t};\n\t\n\texports.unenroll = function(item) {\n\t clearTimeout(item._idleTimeoutId);\n\t item._idleTimeout = -1;\n\t};\n\t\n\texports._unrefActive = exports.active = function(item) {\n\t clearTimeout(item._idleTimeoutId);\n\t\n\t var msecs = item._idleTimeout;\n\t if (msecs >= 0) {\n\t item._idleTimeoutId = setTimeout(function onTimeout() {\n\t if (item._onTimeout)\n\t item._onTimeout();\n\t }, msecs);\n\t }\n\t};\n\t\n\t// That's not how node.js implements it but the exposed api is the same.\n\texports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n\t var id = nextImmediateId++;\n\t var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\t\n\t immediateIds[id] = true;\n\t\n\t nextTick(function onNextTick() {\n\t if (immediateIds[id]) {\n\t // fn.call() is faster so we optimize for the common use-case\n\t // @see http://jsperf.com/call-apply-segu\n\t if (args) {\n\t fn.apply(null, args);\n\t } else {\n\t fn.call(null);\n\t }\n\t // Prevent ids from leaking\n\t exports.clearImmediate(id);\n\t }\n\t });\n\t\n\t return id;\n\t};\n\t\n\texports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n\t delete immediateIds[id];\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(14).setImmediate, __webpack_require__(14).clearImmediate))\n\n/***/ },\n\n/***/ 83:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(setImmediate) {//MODIFIED TO USE CUSTOM SCROLL - DO NOT EVER EVER EVER UDPATE THIS \n\t(function (root, factory) {\n\t if (true) {\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(2) ], __WEBPACK_AMD_DEFINE_RESULT__ = function(a0) {\n\t return factory(a0);\n\t }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t } else if (typeof exports === \"object\") {\n\t module.exports = factory(require(\"jquery\"));\n\t } else {\n\t factory(jQuery);\n\t }\n\t})(this, function($) {\n\t var _ = function() {\n\t \"use strict\";\n\t return {\n\t isMsie: function() {\n\t return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\\d+(.\\d+)?)/i)[2] : false;\n\t },\n\t isBlankString: function(str) {\n\t return !str || /^\\s*$/.test(str);\n\t },\n\t escapeRegExChars: function(str) {\n\t return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n\t },\n\t isString: function(obj) {\n\t return typeof obj === \"string\";\n\t },\n\t isNumber: function(obj) {\n\t return typeof obj === \"number\";\n\t },\n\t isArray: $.isArray,\n\t isFunction: $.isFunction,\n\t isObject: $.isPlainObject,\n\t isUndefined: function(obj) {\n\t return typeof obj === \"undefined\";\n\t },\n\t isElement: function(obj) {\n\t return !!(obj && obj.nodeType === 1);\n\t },\n\t isJQuery: function(obj) {\n\t return obj instanceof $;\n\t },\n\t toStr: function toStr(s) {\n\t return _.isUndefined(s) || s === null ? \"\" : s + \"\";\n\t },\n\t bind: $.proxy,\n\t each: function(collection, cb) {\n\t $.each(collection, reverseArgs);\n\t function reverseArgs(index, value) {\n\t return cb(value, index);\n\t }\n\t },\n\t map: $.map,\n\t filter: $.grep,\n\t every: function(obj, test) {\n\t var result = true;\n\t if (!obj) {\n\t return result;\n\t }\n\t $.each(obj, function(key, val) {\n\t if (!(result = test.call(null, val, key, obj))) {\n\t return false;\n\t }\n\t });\n\t return !!result;\n\t },\n\t some: function(obj, test) {\n\t var result = false;\n\t if (!obj) {\n\t return result;\n\t }\n\t $.each(obj, function(key, val) {\n\t if (result = test.call(null, val, key, obj)) {\n\t return false;\n\t }\n\t });\n\t return !!result;\n\t },\n\t mixin: $.extend,\n\t identity: function(x) {\n\t return x;\n\t },\n\t clone: function(obj) {\n\t return $.extend(true, {}, obj);\n\t },\n\t getIdGenerator: function() {\n\t var counter = 0;\n\t return function() {\n\t return counter++;\n\t };\n\t },\n\t templatify: function templatify(obj) {\n\t return $.isFunction(obj) ? obj : template;\n\t function template() {\n\t return String(obj);\n\t }\n\t },\n\t defer: function(fn) {\n\t setTimeout(fn, 0);\n\t },\n\t debounce: function(func, wait, immediate) {\n\t var timeout, result;\n\t return function() {\n\t var context = this, args = arguments, later, callNow;\n\t later = function() {\n\t timeout = null;\n\t if (!immediate) {\n\t result = func.apply(context, args);\n\t }\n\t };\n\t callNow = immediate && !timeout;\n\t clearTimeout(timeout);\n\t timeout = setTimeout(later, wait);\n\t if (callNow) {\n\t result = func.apply(context, args);\n\t }\n\t return result;\n\t };\n\t },\n\t throttle: function(func, wait) {\n\t var context, args, timeout, result, previous, later;\n\t previous = 0;\n\t later = function() {\n\t previous = new Date();\n\t timeout = null;\n\t result = func.apply(context, args);\n\t };\n\t return function() {\n\t var now = new Date(), remaining = wait - (now - previous);\n\t context = this;\n\t args = arguments;\n\t if (remaining <= 0) {\n\t clearTimeout(timeout);\n\t timeout = null;\n\t previous = now;\n\t result = func.apply(context, args);\n\t } else if (!timeout) {\n\t timeout = setTimeout(later, remaining);\n\t }\n\t return result;\n\t };\n\t },\n\t stringify: function(val) {\n\t return _.isString(val) ? val : JSON.stringify(val);\n\t },\n\t noop: function() {}\n\t };\n\t }();\n\t var WWW = function() {\n\t \"use strict\";\n\t var defaultClassNames = {\n\t wrapper: \"twitter-typeahead\",\n\t input: \"tt-input\",\n\t hint: \"tt-hint\",\n\t menu: \"tt-menu\",\n\t menuinner: \"tt-menu-inner\",\n\t dataset: \"tt-dataset\",\n\t suggestion: \"tt-suggestion\",\n\t selectable: \"tt-selectable\",\n\t empty: \"tt-empty\",\n\t open: \"tt-open\",\n\t cursor: \"tt-cursor\",\n\t highlight: \"tt-highlight\"\n\t };\n\t return build;\n\t function build(o) {\n\t var www, classes;\n\t classes = _.mixin({}, defaultClassNames, o);\n\t www = {\n\t css: buildCss(),\n\t classes: classes,\n\t html: buildHtml(classes),\n\t selectors: buildSelectors(classes)\n\t };\n\t return {\n\t css: www.css,\n\t html: www.html,\n\t classes: www.classes,\n\t selectors: www.selectors,\n\t mixin: function(o) {\n\t _.mixin(o, www);\n\t }\n\t };\n\t }\n\t function buildHtml(c) {\n\t return {\n\t wrapper: '',\n\t menu: '
',\n\t menuinner: '
'\n\t };\n\t }\n\t function buildSelectors(classes) {\n\t var selectors = {};\n\t _.each(classes, function(v, k) {\n\t selectors[k] = \".\" + v;\n\t });\n\t return selectors;\n\t }\n\t function buildCss() {\n\t var css = {\n\t wrapper: {\n\t position: \"relative\",\n\t display: \"inline-block\"\n\t },\n\t hint: {\n\t position: \"absolute\",\n\t top: \"0\",\n\t left: \"0\",\n\t borderColor: \"transparent\",\n\t boxShadow: \"none\",\n\t opacity: \"1\"\n\t },\n\t input: {\n\t position: \"relative\",\n\t verticalAlign: \"top\",\n\t backgroundColor: \"transparent\"\n\t },\n\t inputWithNoHint: {\n\t position: \"relative\",\n\t verticalAlign: \"top\"\n\t },\n\t menu: {\n\t position: \"absolute\",\n\t top: \"100%\",\n\t left: \"0\",\n\t zIndex: \"100\",\n\t display: \"none\"\n\t },\n\t ltr: {\n\t left: \"0\",\n\t right: \"auto\"\n\t },\n\t rtl: {\n\t left: \"auto\",\n\t right: \" 0\"\n\t }\n\t };\n\t if (_.isMsie()) {\n\t _.mixin(css.input, {\n\t backgroundImage: \"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)\"\n\t });\n\t }\n\t return css;\n\t }\n\t }();\n\t var EventBus = function() {\n\t \"use strict\";\n\t var namespace, deprecationMap;\n\t namespace = \"typeahead:\";\n\t deprecationMap = {\n\t render: \"rendered\",\n\t cursorchange: \"cursorchanged\",\n\t select: \"selected\",\n\t autocomplete: \"autocompleted\"\n\t };\n\t function EventBus(o) {\n\t if (!o || !o.el) {\n\t $.error(\"EventBus initialized without el\");\n\t }\n\t this.$el = $(o.el);\n\t }\n\t _.mixin(EventBus.prototype, {\n\t _trigger: function(type, args) {\n\t var $e;\n\t $e = $.Event(namespace + type);\n\t (args = args || []).unshift($e);\n\t this.$el.trigger.apply(this.$el, args);\n\t return $e;\n\t },\n\t before: function(type) {\n\t var args, $e;\n\t args = [].slice.call(arguments, 1);\n\t $e = this._trigger(\"before\" + type, args);\n\t return $e.isDefaultPrevented();\n\t },\n\t trigger: function(type) {\n\t var deprecatedType;\n\t this._trigger(type, [].slice.call(arguments, 1));\n\t if (deprecatedType = deprecationMap[type]) {\n\t this._trigger(deprecatedType, [].slice.call(arguments, 1));\n\t }\n\t }\n\t });\n\t return EventBus;\n\t }();\n\t var EventEmitter = function() {\n\t \"use strict\";\n\t var splitter = /\\s+/, nextTick = getNextTick();\n\t return {\n\t onSync: onSync,\n\t onAsync: onAsync,\n\t off: off,\n\t trigger: trigger\n\t };\n\t function on(method, types, cb, context) {\n\t var type;\n\t if (!cb) {\n\t return this;\n\t }\n\t types = types.split(splitter);\n\t cb = context ? bindContext(cb, context) : cb;\n\t this._callbacks = this._callbacks || {};\n\t while (type = types.shift()) {\n\t this._callbacks[type] = this._callbacks[type] || {\n\t sync: [],\n\t async: []\n\t };\n\t this._callbacks[type][method].push(cb);\n\t }\n\t return this;\n\t }\n\t function onAsync(types, cb, context) {\n\t return on.call(this, \"async\", types, cb, context);\n\t }\n\t function onSync(types, cb, context) {\n\t return on.call(this, \"sync\", types, cb, context);\n\t }\n\t function off(types) {\n\t var type;\n\t if (!this._callbacks) {\n\t return this;\n\t }\n\t types = types.split(splitter);\n\t while (type = types.shift()) {\n\t delete this._callbacks[type];\n\t }\n\t return this;\n\t }\n\t function trigger(types) {\n\t var type, callbacks, args, syncFlush, asyncFlush;\n\t if (!this._callbacks) {\n\t return this;\n\t }\n\t types = types.split(splitter);\n\t args = [].slice.call(arguments, 1);\n\t while ((type = types.shift()) && (callbacks = this._callbacks[type])) {\n\t syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));\n\t asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));\n\t syncFlush() && nextTick(asyncFlush);\n\t }\n\t return this;\n\t }\n\t function getFlush(callbacks, context, args) {\n\t return flush;\n\t function flush() {\n\t var cancelled;\n\t for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {\n\t cancelled = callbacks[i].apply(context, args) === false;\n\t }\n\t return !cancelled;\n\t }\n\t }\n\t function getNextTick() {\n\t var nextTickFn;\n\t if (window.setImmediate) {\n\t nextTickFn = function nextTickSetImmediate(fn) {\n\t setImmediate(function() {\n\t fn();\n\t });\n\t };\n\t } else {\n\t nextTickFn = function nextTickSetTimeout(fn) {\n\t setTimeout(function() {\n\t fn();\n\t }, 0);\n\t };\n\t }\n\t return nextTickFn;\n\t }\n\t function bindContext(fn, context) {\n\t return fn.bind ? fn.bind(context) : function() {\n\t fn.apply(context, [].slice.call(arguments, 0));\n\t };\n\t }\n\t }();\n\t var highlight = function(doc) {\n\t \"use strict\";\n\t var defaults = {\n\t node: null,\n\t pattern: null,\n\t tagName: \"strong\",\n\t className: null,\n\t wordsOnly: false,\n\t caseSensitive: false\n\t };\n\t return function hightlight(o) {\n\t var regex;\n\t o = _.mixin({}, defaults, o);\n\t if (!o.node || !o.pattern) {\n\t return;\n\t }\n\t o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];\n\t regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);\n\t traverse(o.node, hightlightTextNode);\n\t function hightlightTextNode(textNode) {\n\t var match, patternNode, wrapperNode;\n\t if (match = regex.exec(textNode.data)) {\n\t wrapperNode = doc.createElement(o.tagName);\n\t o.className && (wrapperNode.className = o.className);\n\t patternNode = textNode.splitText(match.index);\n\t patternNode.splitText(match[0].length);\n\t wrapperNode.appendChild(patternNode.cloneNode(true));\n\t textNode.parentNode.replaceChild(wrapperNode, patternNode);\n\t }\n\t return !!match;\n\t }\n\t function traverse(el, hightlightTextNode) {\n\t var childNode, TEXT_NODE_TYPE = 3;\n\t for (var i = 0; i < el.childNodes.length; i++) {\n\t childNode = el.childNodes[i];\n\t if (childNode.nodeType === TEXT_NODE_TYPE) {\n\t i += hightlightTextNode(childNode) ? 1 : 0;\n\t } else {\n\t traverse(childNode, hightlightTextNode);\n\t }\n\t }\n\t }\n\t };\n\t function getRegex(patterns, caseSensitive, wordsOnly) {\n\t var escapedPatterns = [], regexStr;\n\t for (var i = 0, len = patterns.length; i < len; i++) {\n\t escapedPatterns.push(_.escapeRegExChars(patterns[i]));\n\t }\n\t regexStr = wordsOnly ? \"\\\\b(\" + escapedPatterns.join(\"|\") + \")\\\\b\" : \"(\" + escapedPatterns.join(\"|\") + \")\";\n\t return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, \"i\");\n\t }\n\t }(window.document);\n\t var Input = function() {\n\t \"use strict\";\n\t var specialKeyCodeMap;\n\t specialKeyCodeMap = {\n\t 9: \"tab\",\n\t 27: \"esc\",\n\t 37: \"left\",\n\t 39: \"right\",\n\t 13: \"enter\",\n\t 38: \"up\",\n\t 40: \"down\"\n\t };\n\t function Input(o, www) {\n\t o = o || {};\n\t if (!o.input) {\n\t $.error(\"input is missing\");\n\t }\n\t www.mixin(this);\n\t this.$hint = $(o.hint);\n\t this.$input = $(o.input);\n\t this.query = this.$input.val();\n\t this.queryWhenFocused = this.hasFocus() ? this.query : null;\n\t this.$overflowHelper = buildOverflowHelper(this.$input);\n\t this._checkLanguageDirection();\n\t if (this.$hint.length === 0) {\n\t this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;\n\t }\n\t }\n\t Input.normalizeQuery = function(str) {\n\t return _.toStr(str).replace(/^\\s*/g, \"\").replace(/\\s{2,}/g, \" \");\n\t };\n\t _.mixin(Input.prototype, EventEmitter, {\n\t _onBlur: function onBlur() {\n\t this.resetInputValue();\n\t this.trigger(\"blurred\");\n\t },\n\t _onFocus: function onFocus() {\n\t this.queryWhenFocused = this.query;\n\t this.trigger(\"focused\");\n\t },\n\t _onKeydown: function onKeydown($e) {\n\t var keyName = specialKeyCodeMap[$e.which || $e.keyCode];\n\t this._managePreventDefault(keyName, $e);\n\t if (keyName && this._shouldTrigger(keyName, $e)) {\n\t this.trigger(keyName + \"Keyed\", $e);\n\t }\n\t },\n\t _onInput: function onInput() {\n\t this._setQuery(this.getInputValue());\n\t this.clearHintIfInvalid();\n\t this._checkLanguageDirection();\n\t },\n\t _managePreventDefault: function managePreventDefault(keyName, $e) {\n\t var preventDefault;\n\t switch (keyName) {\n\t case \"up\":\n\t case \"down\":\n\t preventDefault = !withModifier($e);\n\t break;\n\t\n\t default:\n\t preventDefault = false;\n\t }\n\t preventDefault && $e.preventDefault();\n\t },\n\t _shouldTrigger: function shouldTrigger(keyName, $e) {\n\t var trigger;\n\t switch (keyName) {\n\t case \"tab\":\n\t trigger = !withModifier($e);\n\t break;\n\t\n\t default:\n\t trigger = true;\n\t }\n\t return trigger;\n\t },\n\t _checkLanguageDirection: function checkLanguageDirection() {\n\t var dir = (this.$input.css(\"direction\") || \"ltr\").toLowerCase();\n\t if (this.dir !== dir) {\n\t this.dir = dir;\n\t this.$hint.attr(\"dir\", dir);\n\t this.trigger(\"langDirChanged\", dir);\n\t }\n\t },\n\t _setQuery: function setQuery(val, silent) {\n\t var areEquivalent, hasDifferentWhitespace;\n\t areEquivalent = areQueriesEquivalent(val, this.query);\n\t hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false;\n\t this.query = val;\n\t if (!silent && !areEquivalent) {\n\t this.trigger(\"queryChanged\", this.query);\n\t } else if (!silent && hasDifferentWhitespace) {\n\t this.trigger(\"whitespaceChanged\", this.query);\n\t }\n\t },\n\t bind: function() {\n\t var that = this, onBlur, onFocus, onKeydown, onInput;\n\t onBlur = _.bind(this._onBlur, this);\n\t onFocus = _.bind(this._onFocus, this);\n\t onKeydown = _.bind(this._onKeydown, this);\n\t onInput = _.bind(this._onInput, this);\n\t this.$input.on(\"blur.tt\", onBlur).on(\"focus.tt\", onFocus).on(\"keydown.tt\", onKeydown);\n\t if (!_.isMsie() || _.isMsie() > 9) {\n\t this.$input.on(\"input.tt\", onInput);\n\t } else {\n\t this.$input.on(\"keydown.tt keypress.tt cut.tt paste.tt\", function($e) {\n\t if (specialKeyCodeMap[$e.which || $e.keyCode]) {\n\t return;\n\t }\n\t _.defer(_.bind(that._onInput, that, $e));\n\t });\n\t }\n\t return this;\n\t },\n\t focus: function focus() {\n\t this.$input.focus();\n\t },\n\t blur: function blur() {\n\t this.$input.blur();\n\t },\n\t getLangDir: function getLangDir() {\n\t return this.dir;\n\t },\n\t getQuery: function getQuery() {\n\t return this.query || \"\";\n\t },\n\t setQuery: function setQuery(val, silent) {\n\t this.setInputValue(val);\n\t this._setQuery(val, silent);\n\t },\n\t hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {\n\t return this.query !== this.queryWhenFocused;\n\t },\n\t getInputValue: function getInputValue() {\n\t return this.$input.val();\n\t },\n\t setInputValue: function setInputValue(value) {\n\t this.$input.val(value);\n\t this.clearHintIfInvalid();\n\t this._checkLanguageDirection();\n\t },\n\t resetInputValue: function resetInputValue() {\n\t// this.setInputValue(this.query);\n\t },\n\t getHint: function getHint() {\n\t return this.$hint.val();\n\t },\n\t setHint: function setHint(value) {\n\t this.$hint.val(value);\n\t },\n\t clearHint: function clearHint() {\n\t this.setHint(\"\");\n\t },\n\t clearHintIfInvalid: function clearHintIfInvalid() {\n\t var val, hint, valIsPrefixOfHint, isValid;\n\t val = this.getInputValue();\n\t hint = this.getHint();\n\t valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;\n\t isValid = val !== \"\" && valIsPrefixOfHint && !this.hasOverflow();\n\t !isValid && this.clearHint();\n\t },\n\t hasFocus: function hasFocus() {\n\t return this.$input.is(\":focus\");\n\t },\n\t hasOverflow: function hasOverflow() {\n\t var constraint = this.$input.width() - 2;\n\t this.$overflowHelper.text(this.getInputValue());\n\t return this.$overflowHelper.width() >= constraint;\n\t },\n\t isCursorAtEnd: function() {\n\t var valueLength, selectionStart, range;\n\t valueLength = this.$input.val().length;\n\t selectionStart = this.$input[0].selectionStart;\n\t if (_.isNumber(selectionStart)) {\n\t return selectionStart === valueLength;\n\t } else if (document.selection) {\n\t range = document.selection.createRange();\n\t range.moveStart(\"character\", -valueLength);\n\t return valueLength === range.text.length;\n\t }\n\t return true;\n\t },\n\t destroy: function destroy() {\n\t this.$hint.off(\".tt\");\n\t this.$input.off(\".tt\");\n\t this.$overflowHelper.remove();\n\t this.$hint = this.$input = this.$overflowHelper = $(\"
\");\n\t }\n\t });\n\t return Input;\n\t function buildOverflowHelper($input) {\n\t return $('
').css({\n\t                position: \"absolute\",\n\t                visibility: \"hidden\",\n\t                whiteSpace: \"pre\",\n\t                fontFamily: $input.css(\"font-family\"),\n\t                fontSize: $input.css(\"font-size\"),\n\t                fontStyle: $input.css(\"font-style\"),\n\t                fontVariant: $input.css(\"font-variant\"),\n\t                fontWeight: $input.css(\"font-weight\"),\n\t                wordSpacing: $input.css(\"word-spacing\"),\n\t                letterSpacing: $input.css(\"letter-spacing\"),\n\t                textIndent: $input.css(\"text-indent\"),\n\t                textRendering: $input.css(\"text-rendering\"),\n\t                textTransform: $input.css(\"text-transform\")\n\t            }).insertAfter($input);\n\t        }\n\t        function areQueriesEquivalent(a, b) {\n\t            return Input.normalizeQuery(a) === Input.normalizeQuery(b);\n\t        }\n\t        function withModifier($e) {\n\t            return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;\n\t        }\n\t    }();\n\t    var Dataset = function() {\n\t        \"use strict\";\n\t        var keys, nameGenerator;\n\t        keys = {\n\t            val: \"tt-selectable-display\",\n\t            obj: \"tt-selectable-object\"\n\t        };\n\t        nameGenerator = _.getIdGenerator();\n\t        function Dataset(o, www) {\n\t            o = o || {};\n\t            o.templates = o.templates || {};\n\t            o.templates.notFound = o.templates.notFound || o.templates.empty;\n\t            if (!o.source) {\n\t                $.error(\"missing source\");\n\t            }\n\t            if (!o.node) {\n\t                $.error(\"missing node\");\n\t            }\n\t            if (o.name && !isValidName(o.name)) {\n\t                $.error(\"invalid dataset name: \" + o.name);\n\t            }\n\t            www.mixin(this);\n\t            this.highlight = !!o.highlight;\n\t            this.name = o.name || nameGenerator();\n\t            this.limit = o.limit || 5;\n\t            this.displayFn = getDisplayFn(o.display || o.displayKey);\n\t            this.templates = getTemplates(o.templates, this.displayFn);\n\t            this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;\n\t            this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;\n\t            this.isHint = _.isUndefined(o.isHint) ? true : !!o.isHint;\n\t            this._resetLastSuggestion();\n\t            this.$el = $(o.node).addClass(this.classes.dataset).addClass(this.classes.dataset + \"-\" + this.name);\n\t        }\n\t        Dataset.extractData = function extractData(el) {\n\t            var $el = $(el);\n\t            if ($el.data(keys.obj)) {\n\t                return {\n\t                    val: $el.data(keys.val) || \"\",\n\t                    obj: $el.data(keys.obj) || null\n\t                };\n\t            }\n\t            return null;\n\t        };\n\t        _.mixin(Dataset.prototype, EventEmitter, {\n\t            _overwrite: function overwrite(query, suggestions) {\n\t                suggestions = suggestions || [];\n\t                if (suggestions.length) {\n\t                    this._renderSuggestions(query, suggestions);\n\t                } else if (this.async && this.templates.pending) {\n\t                    this._renderPending(query);\n\t                } else if (!this.async && this.templates.notFound) {\n\t                    this._renderNotFound(query);\n\t                } else {\n\t                    this._empty();\n\t                }\n\t                this.trigger(\"rendered\", this.name, suggestions, false);\n\t            },\n\t            _append: function append(query, suggestions) {\n\t                suggestions = suggestions || [];\n\t                if (suggestions.length && this.$lastSuggestion.length) {\n\t                    this._appendSuggestions(query, suggestions);\n\t                } else if (suggestions.length) {\n\t                    this._renderSuggestions(query, suggestions);\n\t                } else if (!this.$lastSuggestion.length && this.templates.notFound) {\n\t                    this._renderNotFound(query);\n\t                }\n\t                this.trigger(\"rendered\", this.name, suggestions, true);\n\t            },\n\t            _renderSuggestions: function renderSuggestions(query, suggestions) {\n\t                var $fragment;\n\t                $fragment = this._getSuggestionsFragment(query, suggestions);\n\t                this.$lastSuggestion = $fragment.children().last();\n\t                this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions));\n\t            },\n\t            _appendSuggestions: function appendSuggestions(query, suggestions) {\n\t                var $fragment, $lastSuggestion;\n\t                $fragment = this._getSuggestionsFragment(query, suggestions);\n\t                $lastSuggestion = $fragment.children().last();\n\t                this.$lastSuggestion.after($fragment);\n\t                this.$lastSuggestion = $lastSuggestion;\n\t            },\n\t            _renderPending: function renderPending(query) {\n\t                var template = this.templates.pending;\n\t                this._resetLastSuggestion();\n\t                template && this.$el.html(template({\n\t                    query: query,\n\t                    dataset: this.name\n\t                }));\n\t            },\n\t            _renderNotFound: function renderNotFound(query) {\n\t                var template = this.templates.notFound;\n\t                this._resetLastSuggestion();\n\t                template && this.$el.html(template({\n\t                    query: query,\n\t                    dataset: this.name\n\t                }));\n\t            },\n\t            _empty: function empty() {\n\t                this.$el.empty();\n\t                this._resetLastSuggestion();\n\t            },\n\t            _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) {\n\t                var that = this, fragment;\n\t                fragment = document.createDocumentFragment();\n\t                _.each(suggestions, function getSuggestionNode(suggestion) {\n\t                    var $el, context;\n\t                    context = that._injectQuery(query, suggestion);\n\t                    $el = $(that.templates.suggestion(context)).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + \" \" + that.classes.selectable);\n\t                    fragment.appendChild($el[0]);\n\t                });\n\t                this.highlight && highlight({\n\t                    className: this.classes.highlight,\n\t                    node: fragment,\n\t                    pattern: query\n\t                });\n\t                return $(fragment);\n\t            },\n\t            _getFooter: function getFooter(query, suggestions) {\n\t                return this.templates.footer ? this.templates.footer({\n\t                    query: query,\n\t                    suggestions: suggestions,\n\t                    dataset: this.name\n\t                }) : null;\n\t            },\n\t            _getHeader: function getHeader(query, suggestions) {\n\t                return this.templates.header ? this.templates.header({\n\t                    query: query,\n\t                    suggestions: suggestions,\n\t                    dataset: this.name\n\t                }) : null;\n\t            },\n\t            _resetLastSuggestion: function resetLastSuggestion() {\n\t                this.$lastSuggestion = $();\n\t            },\n\t            _injectQuery: function injectQuery(query, obj) {\n\t                return _.isObject(obj) ? _.mixin({\n\t                    _query: query\n\t                }, obj) : obj;\n\t            },\n\t            update: function update(query) {\n\t                var that = this, canceled = false, syncCalled = false, rendered = 0;\n\t                this.cancel();\n\t                this.cancel = function cancel() {\n\t                    canceled = true;\n\t                    that.cancel = $.noop;\n\t                    that.async && that.trigger(\"asyncCanceled\", query);\n\t                };\n\t                this.source(query, sync, async);\n\t                !syncCalled && sync([]);\n\t                function sync(suggestions) {\n\t                    if (syncCalled) {\n\t                        return;\n\t                    }\n\t                    syncCalled = true;\n\t                    suggestions = (suggestions || []).slice(0, that.limit);\n\t                    rendered = suggestions.length;\n\t                    that._overwrite(query, suggestions);\n\t                    if (rendered < that.limit && that.async) {\n\t                        that.trigger(\"asyncRequested\", query);\n\t                    }\n\t                }\n\t                function async(suggestions) {\n\t                    suggestions = suggestions || [];\n\t                    if (!canceled && rendered < that.limit) {\n\t                        that.cancel = $.noop;\n\t                        that._append(query, suggestions.slice(0, that.limit - rendered));\n\t                        rendered += suggestions.length;\n\t                        that.async && that.trigger(\"asyncReceived\", query);\n\t                    }\n\t                }\n\t            },\n\t            cancel: $.noop,\n\t            clear: function clear() {\n\t                this._empty();\n\t                this.cancel();\n\t                this.trigger(\"cleared\");\n\t            },\n\t            isEmpty: function isEmpty() {\n\t                return this.$el.is(\":empty\");\n\t            },\n\t            destroy: function destroy() {\n\t                this.$el = $(\"
\");\n\t }\n\t });\n\t return Dataset;\n\t function getDisplayFn(display) {\n\t display = display || _.stringify;\n\t return _.isFunction(display) ? display : displayFn;\n\t function displayFn(obj) {\n\t return obj[display];\n\t }\n\t }\n\t function getTemplates(templates, displayFn) {\n\t return {\n\t notFound: templates.notFound && _.templatify(templates.notFound),\n\t pending: templates.pending && _.templatify(templates.pending),\n\t header: templates.header && _.templatify(templates.header),\n\t footer: templates.footer && _.templatify(templates.footer),\n\t suggestion: templates.suggestion || suggestionTemplate\n\t };\n\t function suggestionTemplate(context) {\n\t return $(\"
\").text(displayFn(context));\n\t }\n\t }\n\t function isValidName(str) {\n\t return /^[_a-zA-Z0-9-]+$/.test(str);\n\t }\n\t }();\n\t var Menu = function() {\n\t \"use strict\";\n\t function Menu(o, www) {\n\t var that = this;\n\t o = o || {};\n\t if (!o.node) {\n\t $.error(\"node is required\");\n\t }\n\t www.mixin(this);\n\t this.$node = $(o.node);\n\t this.query = null;\n\t this.datasets = _.map(o.datasets, initializeDataset);\n\t function initializeDataset(oDataset) {\n\t var node = that.$node.find(oDataset.node).first();\n\t oDataset.node = node.length ? node : $(\"
\").appendTo(that.$node);\n\t return new Dataset(oDataset, www);\n\t }\n\t }\n\t _.mixin(Menu.prototype, EventEmitter, {\n\t _onSelectableClick: function onSelectableClick($e) {\n\t this.trigger(\"selectableClicked\", $($e.currentTarget));\n\t },\n\t _onRendered: function onRendered(type, dataset, suggestions, async) {\n\t this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\n\t this.trigger(\"datasetRendered\", dataset, suggestions, async);\n\t },\n\t _onCleared: function onCleared() {\n\t this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\n\t this.trigger(\"datasetCleared\");\n\t },\n\t _propagate: function propagate() {\n\t this.trigger.apply(this, arguments);\n\t },\n\t _allDatasetsEmpty: function allDatasetsEmpty() {\n\t return _.every(this.datasets, isDatasetEmpty);\n\t function isDatasetEmpty(dataset) {\n\t return dataset.isEmpty();\n\t }\n\t },\n\t _getSelectables: function getSelectables() {\n\t return this.$node.find(this.selectors.selectable);\n\t },\r\n\t _getMainSelectables: function getSelectables() {\r\n\t var result = null;\r\n\t for (var i = 0, l = this.datasets.length; i < l; i++) {\r\n\t if (!this.datasets[i].isHint)\r\n\t continue;\r\n\t var query = this.$node.find(this.selectors.dataset + '-' + this.datasets[i].name).find(this.selectors.selectable);\r\n\t result = result == null ? query : result.add(query);\r\n\t }\r\n\t return result;\r\n\t },\n\t _removeCursor: function _removeCursor() {\n\t var $selectable = this.getActiveSelectable();\n\t $selectable && $selectable.removeClass(this.classes.cursor);\n\t },\n\t _ensureVisible: function ensureVisible($el) {\n\t var elTop, elBottom, nodeScrollTop, nodeHeight;\n\t elTop = $el.position().top;\n\t elBottom = elTop + $el.outerHeight(true);\n\t nodeScrollTop = this.$node.scrollTop();\n\t nodeHeight = this.$node.height() + parseInt(this.$node.css(\"paddingTop\"), 10) + parseInt(this.$node.css(\"paddingBottom\"), 10);\n\t if (elTop < 0) {\n\t this.$node.scrollTop(nodeScrollTop + elTop);\n\t } else if (nodeHeight < elBottom) {\n\t this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));\n\t }\n\t },\n\t bind: function() {\n\t var that = this, onSelectableClick;\n\t onSelectableClick = _.bind(this._onSelectableClick, this);\n\t this.$node.on(\"click.tt\", this.selectors.selectable, onSelectableClick);\n\t this.$node.on(\"tap\", this.selectors.selectable, onSelectableClick);\n\t _.each(this.datasets, function(dataset) {\n\t dataset.onSync(\"asyncRequested\", that._propagate, that).onSync(\"asyncCanceled\", that._propagate, that).onSync(\"asyncReceived\", that._propagate, that).onSync(\"rendered\", that._onRendered, that).onSync(\"cleared\", that._onCleared, that);\n\t });\n\t return this;\n\t },\n\t isOpen: function isOpen() {\n\t return this.$node.hasClass(this.classes.open);\n\t },\n\t open: function open() {\n\t this.$node.addClass(this.classes.open);\n\t },\n\t close: function close() {\n\t this.$node.removeClass(this.classes.open);\n\t this._removeCursor();\n\t },\n\t setLanguageDirection: function setLanguageDirection(dir) {\n\t this.$node.attr(\"dir\", dir);\n\t },\n\t selectableRelativeToCursor: function selectableRelativeToCursor(delta) {\n\t var $selectables, $oldCursor, oldIndex, newIndex;\n\t $oldCursor = this.getActiveSelectable();\n\t $selectables = this._getSelectables();\n\t oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;\n\t newIndex = oldIndex + delta;\n\t newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;\n\t newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;\n\t return newIndex === -1 ? null : $selectables.eq(newIndex);\n\t },\n\t setCursor: function setCursor($selectable) {\n\t this._removeCursor();\n\t\n\t if ($selectable = $selectable && $selectable.first()) {\n\t $selectable.addClass(this.classes.cursor);\n\t this._ensureVisible($selectable);\n\t }\n\t },\n\t getSelectableData: function getSelectableData($el) {\n\t return $el && $el.length ? Dataset.extractData($el) : null;\n\t },\n\t getActiveSelectable: function getActiveSelectable() {\n\t var $selectable = this._getSelectables().filter(this.selectors.cursor).first();\n\t return $selectable.length ? $selectable : null;\n\t },\n\t getTopSelectable: function getTopSelectable() {\n\t var $selectable = this._getMainSelectables().first();\n\t return $selectable.length ? $selectable : null;\n\t },\n\t update: function update(query) {\n\t var isValidUpdate = query !== this.query;\n\t if (isValidUpdate) {\n\t this.query = query;\n\t _.each(this.datasets, updateDataset);\n\t }\n\t return isValidUpdate;\n\t function updateDataset(dataset) {\n\t dataset.update(query);\n\t }\n\t },\n\t empty: function empty() {\n\t _.each(this.datasets, clearDataset);\n\t this.query = null;\n\t this.$node.addClass(this.classes.empty);\n\t function clearDataset(dataset) {\n\t dataset.clear();\n\t }\n\t },\n\t destroy: function destroy() {\n\t this.$node.off(\".tt\");\n\t this.$node = $(\"
\");\n\t _.each(this.datasets, destroyDataset);\n\t function destroyDataset(dataset) {\n\t dataset.destroy();\n\t }\n\t }\n\t });\n\t return Menu;\n\t }();\n\t var DefaultMenu = function() {\n\t \"use strict\";\n\t var s = Menu.prototype;\n\t function DefaultMenu() {\n\t Menu.apply(this, [].slice.call(arguments, 0));\n\t }\n\t _.mixin(DefaultMenu.prototype, Menu.prototype, {\n\t open: function open() {\n\t !this._allDatasetsEmpty() && this._show();\n\t return s.open.apply(this, [].slice.call(arguments, 0));\n\t },\n\t close: function close() {\n\t this._hide();\n\t return s.close.apply(this, [].slice.call(arguments, 0));\n\t },\n\t _onRendered: function onRendered() {\n\t if (this._allDatasetsEmpty()) {\n\t this._hide();\n\t } else {\n\t this.isOpen() && this._show();\n\t }\n\t return s._onRendered.apply(this, [].slice.call(arguments, 0));\n\t },\n\t _onCleared: function onCleared() {\n\t if (this._allDatasetsEmpty()) {\n\t this._hide();\n\t } else {\n\t this.isOpen() && this._show();\n\t }\n\t return s._onCleared.apply(this, [].slice.call(arguments, 0));\n\t },\n\t setLanguageDirection: function setLanguageDirection(dir) {\n\t this.$node.css(dir === \"ltr\" ? this.css.ltr : this.css.rtl);\n\t return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));\n\t },\n\t _hide: function hide() {\r\n\t var $nodeToHide = this.$node.hasClass('tt-menu-inner') ? this.$node.parent() : this.$node;\n\t $nodeToHide.hide();\n\t },\n\t _show: function show() {\n\t var $nodeToShow = this.$node.hasClass('tt-menu-inner') ? this.$node.parent() : this.$node;\n\t $nodeToShow.css(\"display\", \"block\");\n\t }\n\t });\n\t return DefaultMenu;\n\t }();\n\t var Typeahead = function() {\n\t \"use strict\";\n\t function Typeahead(o, www) {\n\t var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;\n\t o = o || {};\n\t if (!o.input) {\n\t $.error(\"missing input\");\n\t }\n\t if (!o.menu) {\n\t $.error(\"missing menu\");\n\t }\n\t if (!o.eventBus) {\n\t $.error(\"missing event bus\");\n\t }\n\t www.mixin(this);\n\t this.eventBus = o.eventBus;\n\t this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;\n\t this.input = o.input;\n\t this.menu = o.menu;\n\t this.enabled = true;\n\t this.active = false;\n\t this.input.hasFocus() && this.activate();\n\t this.dir = this.input.getLangDir();\n\t this._hacks();\n\t this.menu.bind().onSync(\"selectableClicked\", this._onSelectableClicked, this).onSync(\"asyncRequested\", this._onAsyncRequested, this).onSync(\"asyncCanceled\", this._onAsyncCanceled, this).onSync(\"asyncReceived\", this._onAsyncReceived, this).onSync(\"datasetRendered\", this._onDatasetRendered, this).onSync(\"datasetCleared\", this._onDatasetCleared, this);\n\t onFocused = c(this, \"activate\", \"open\", \"_onFocused\");\n\t onBlurred = c(this, \"deactivate\", \"_onBlurred\");\n\t onEnterKeyed = c(this, \"isActive\", \"isOpen\", \"_onEnterKeyed\");\n\t onTabKeyed = c(this, \"isActive\", \"isOpen\", \"_onTabKeyed\");\n\t onEscKeyed = c(this, \"isActive\", \"_onEscKeyed\");\n\t onUpKeyed = c(this, \"isActive\", \"open\", \"_onUpKeyed\");\n\t onDownKeyed = c(this, \"isActive\", \"open\", \"_onDownKeyed\");\n\t onLeftKeyed = c(this, \"isActive\", \"isOpen\", \"_onLeftKeyed\");\n\t onRightKeyed = c(this, \"isActive\", \"isOpen\", \"_onRightKeyed\");\n\t onQueryChanged = c(this, \"_openIfActive\", \"_onQueryChanged\");\n\t onWhitespaceChanged = c(this, \"_openIfActive\", \"_onWhitespaceChanged\");\n\t this.input.bind().onSync(\"focused\", onFocused, this).onSync(\"blurred\", onBlurred, this).onSync(\"enterKeyed\", onEnterKeyed, this).onSync(\"tabKeyed\", onTabKeyed, this).onSync(\"escKeyed\", onEscKeyed, this).onSync(\"upKeyed\", onUpKeyed, this).onSync(\"downKeyed\", onDownKeyed, this).onSync(\"leftKeyed\", onLeftKeyed, this).onSync(\"rightKeyed\", onRightKeyed, this).onSync(\"queryChanged\", onQueryChanged, this).onSync(\"whitespaceChanged\", onWhitespaceChanged, this).onSync(\"langDirChanged\", this._onLangDirChanged, this);\n\t }\n\t _.mixin(Typeahead.prototype, {\n\t _hacks: function hacks() {\n\t var $input, $menu;\n\t $input = this.input.$input || $(\"
\");\n\t $menu = this.menu.$node || $(\"
\");\n\t $input.on(\"blur.tt\", function($e) {\n\t var active, isActive, hasActive;\n\t active = document.activeElement;\n\t isActive = $menu.is(active);\n\t hasActive = $menu.has(active).length > 0;\n\t if (_.isMsie() && (isActive || hasActive)) {\n\t $e.preventDefault();\n\t $e.stopImmediatePropagation();\n\t _.defer(function() {\n\t $input.focus();\n\t });\n\t }\n\t });\n\t $menu.on(\"mousedown.tt\", function($e) {\n\t $e.preventDefault();\n\t });\n\t },\n\t _onSelectableClicked: function onSelectableClicked(type, $el) {\n\t this.select($el);\n\t },\n\t _onDatasetCleared: function onDatasetCleared() {\n\t this._updateHint();\n\t },\n\t _onDatasetRendered: function onDatasetRendered(type, dataset, suggestions, async) {\n\t this._updateHint();\n\t this.eventBus.trigger(\"render\", suggestions, async, dataset);\n\t },\n\t _onAsyncRequested: function onAsyncRequested(type, dataset, query) {\n\t this.eventBus.trigger(\"asyncrequest\", query, dataset);\n\t },\n\t _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {\n\t this.eventBus.trigger(\"asynccancel\", query, dataset);\n\t },\n\t _onAsyncReceived: function onAsyncReceived(type, dataset, query) {\n\t this.eventBus.trigger(\"asyncreceive\", query, dataset);\n\t },\n\t _onFocused: function onFocused() {\n\t this._minLengthMet() && this.menu.update(this.input.getQuery());\n\t },\n\t _onBlurred: function onBlurred() {\n\t if (this.input.hasQueryChangedSinceLastFocus()) {\n\t this.eventBus.trigger(\"change\", this.input.getQuery());\n\t }\n\t },\n\t _onEnterKeyed: function onEnterKeyed(type, $e) {\n\t var $selectable;\n\t if ($selectable = this.menu.getActiveSelectable()) {\n\t this.select($selectable) && $e.preventDefault();\n\t }\n\t },\n\t _onTabKeyed: function onTabKeyed(type, $e) {\n\t var $selectable;\n\t if ($selectable = this.menu.getActiveSelectable()) {\n\t this.select($selectable) && $e.preventDefault();\n\t } else if ($selectable = this.menu.getTopSelectable()) {\n\t this.autocomplete($selectable) && $e.preventDefault();\n\t }\n\t },\n\t _onEscKeyed: function onEscKeyed() {\n\t this.close();\n\t },\n\t _onUpKeyed: function onUpKeyed() {\n\t this.moveCursor(-1);\n\t },\n\t _onDownKeyed: function onDownKeyed() {\n\t this.moveCursor(+1);\n\t },\n\t _onLeftKeyed: function onLeftKeyed() {\n\t if (this.dir === \"rtl\" && this.input.isCursorAtEnd()) {\n\t this.autocomplete(this.menu.getTopSelectable());\n\t }\n\t },\n\t _onRightKeyed: function onRightKeyed() {\n\t if (this.dir === \"ltr\" && this.input.isCursorAtEnd()) {\n\t this.autocomplete(this.menu.getTopSelectable());\n\t }\n\t },\n\t _onQueryChanged: function onQueryChanged(e, query) {\n\t this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();\n\t },\n\t _onWhitespaceChanged: function onWhitespaceChanged() {\n\t this._updateHint();\n\t },\n\t _onLangDirChanged: function onLangDirChanged(e, dir) {\n\t if (this.dir !== dir) {\n\t this.dir = dir;\n\t this.menu.setLanguageDirection(dir);\n\t }\n\t },\n\t _openIfActive: function openIfActive() {\n\t this.isActive() && this.open();\n\t },\n\t _minLengthMet: function minLengthMet(query) {\n\t query = _.isString(query) ? query : this.input.getQuery() || \"\";\n\t return query.length >= this.minLength;\n\t },\n\t _updateHint: function updateHint() {\n\t var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;\n\t $selectable = this.menu.getTopSelectable();\n\t data = this.menu.getSelectableData($selectable);\n\t val = this.input.getInputValue();\n\t if (data && !_.isBlankString(val) && !this.input.hasOverflow()) {\n\t query = Input.normalizeQuery(val);\n\t escapedQuery = _.escapeRegExChars(query);\n\t frontMatchRegEx = new RegExp(\"^(?:\" + escapedQuery + \")(.+$)\", \"i\");\n\t match = frontMatchRegEx.exec(data.val);\n\t match && this.input.setHint(val + match[1]);\n\t } else {\n\t this.input.clearHint();\n\t }\n\t },\n\t isEnabled: function isEnabled() {\n\t return this.enabled;\n\t },\n\t enable: function enable() {\n\t this.enabled = true;\n\t },\n\t disable: function disable() {\n\t this.enabled = false;\n\t },\n\t isActive: function isActive() {\n\t return this.active;\n\t },\n\t activate: function activate() {\n\t if (this.isActive()) {\n\t return true;\n\t } else if (!this.isEnabled() || this.eventBus.before(\"active\")) {\n\t return false;\n\t } else {\n\t this.active = true;\n\t this.eventBus.trigger(\"active\");\n\t return true;\n\t }\n\t },\n\t deactivate: function deactivate() {\n\t if (!this.isActive()) {\n\t return true;\n\t } else if (this.eventBus.before(\"idle\")) {\n\t return false;\n\t } else {\n\t this.active = false;\n\t this.close();\n\t this.eventBus.trigger(\"idle\");\n\t return true;\n\t }\n\t },\n\t isOpen: function isOpen() {\n\t return this.menu.isOpen();\n\t },\n\t open: function open() {\n\t if (!this.isOpen() && !this.eventBus.before(\"open\")) {\n\t this.menu.open();\n\t this._updateHint();\n\t this.eventBus.trigger(\"open\");\n\t }\n\t return this.isOpen();\n\t },\n\t close: function close() {\n\t if (this.isOpen() && !this.eventBus.before(\"close\")) {\n\t this.menu.close();\n\t this.input.clearHint();\n\t this.input.resetInputValue();\n\t this.eventBus.trigger(\"close\");\n\t }\n\t return !this.isOpen();\n\t },\n\t setVal: function setVal(val) {\n\t this.input.setQuery(_.toStr(val));\n\t },\n\t getVal: function getVal() {\n\t return this.input.getQuery();\n\t },\n\t select: function select($selectable) {\n\t var data = this.menu.getSelectableData($selectable);\n\t if (data && !this.eventBus.before(\"select\", data.obj)) {\n\t this.input.setQuery(data.val, true);\n\t this.eventBus.trigger(\"select\", data.obj);\n\t this.close();\n\t return true;\n\t }\n\t return false;\n\t },\n\t autocomplete: function autocomplete($selectable) {\n\t var query, data, isValid;\n\t query = this.input.getQuery();\n\t data = this.menu.getSelectableData($selectable);\n\t isValid = data && query !== data.val;\n\t if (isValid && !this.eventBus.before(\"autocomplete\", data.obj)) {\n\t this.input.setQuery(data.val);\n\t this.eventBus.trigger(\"autocomplete\", data.obj);\n\t return true;\n\t }\n\t return false;\n\t },\n\t moveCursor: function moveCursor(delta) {\n\t var query, $candidate, data, payload, cancelMove;\n\t query = this.input.getQuery();\n\t $candidate = this.menu.selectableRelativeToCursor(delta);\n\t data = this.menu.getSelectableData($candidate);\n\t payload = data ? data.obj : null;\n\t cancelMove = this._minLengthMet() && this.menu.update(query);\n\t if ($candidate!=null && !cancelMove && !this.eventBus.before(\"cursorchange\", payload)) {\n\t this.menu.setCursor($candidate);\n\t if (data) {\n\t this.input.setInputValue(data.val);\n\t } else {\n\t this.input.resetInputValue();\n\t this._updateHint();\n\t }\n\t this.eventBus.trigger(\"cursorchange\", payload);\n\t return true;\n\t }\n\t return false;\n\t },\n\t destroy: function destroy() {\n\t this.input.destroy();\n\t this.menu.destroy();\n\t }\n\t });\n\t return Typeahead;\n\t function c(ctx) {\n\t var methods = [].slice.call(arguments, 1);\n\t return function() {\n\t var args = [].slice.call(arguments);\n\t _.each(methods, function(method) {\n\t return ctx[method].apply(ctx, args);\n\t });\n\t };\n\t }\n\t }();\n\t (function() {\n\t \"use strict\";\n\t var old, keys, methods;\n\t old = $.fn.typeahead;\n\t keys = {\n\t www: \"tt-www\",\n\t attrs: \"tt-attrs\",\n\t typeahead: \"tt-typeahead\"\n\t };\n\t methods = {\n\t initialize: function initialize(o, datasets) {\n\t var www;\n\t datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);\n\t o = o || {};\n\t www = WWW(o.classNames);\n\t return this.each(attach);\n\t function attach() {\n\t var $input, $wrapper, $hint, $menu, $menuinner, defaultHint, defaultMenu,eventBus, input, menu, typeahead, MenuConstructor;\n\t _.each(datasets, function(d) {\n\t d.highlight = !!o.highlight;\n\t });\n\t $input = $(this);\n\t $wrapper = $(www.html.wrapper);\n\t $hint = $elOrNull(o.hint);\n\t $menu = $elOrNull(o.menu);\n\t $menuinner = $(www.html.menuinner);\n\t defaultHint = o.hint !== false && !$hint;\n\t defaultMenu = o.menu !== false && !$menu;\n\t defaultHint && ($hint = buildHintFromInput($input, www));\n\t defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));\n\t $hint && $hint.val(\"\");\n\t $input = prepInput($input, www);\n\t if (defaultHint || defaultMenu) {\n\t $wrapper.css(www.css.wrapper);\n\t $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint);\n\t $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null);\n\t $menu.append($menuinner);\n\t }\n\t MenuConstructor = defaultMenu ? DefaultMenu : Menu;\n\t eventBus = new EventBus({\n\t el: $input\n\t });\n\t input = new Input({\n\t hint: $hint,\n\t input: $input\n\t }, www);\n\t menu = new MenuConstructor({\n\t node: $menuinner,\n\t datasets: datasets\n\t }, www);\n\t typeahead = new Typeahead({\n\t input: input,\n\t menu: menu,\n\t eventBus: eventBus,\n\t minLength: o.minLength\n\t }, www);\n\t $input.data(keys.www, www);\n\t $input.data(keys.typeahead, typeahead);\n\t }\n\t },\n\t isEnabled: function isEnabled() {\n\t var enabled;\n\t ttEach(this.first(), function(t) {\n\t enabled = t.isEnabled();\n\t });\n\t return enabled;\n\t },\n\t enable: function enable() {\n\t ttEach(this, function(t) {\n\t t.enable();\n\t });\n\t return this;\n\t },\n\t disable: function disable() {\n\t ttEach(this, function(t) {\n\t t.disable();\n\t });\n\t return this;\n\t },\n\t isActive: function isActive() {\n\t var active;\n\t ttEach(this.first(), function(t) {\n\t active = t.isActive();\n\t });\n\t return active;\n\t },\n\t activate: function activate() {\n\t ttEach(this, function(t) {\n\t t.activate();\n\t });\n\t return this;\n\t },\n\t deactivate: function deactivate() {\n\t ttEach(this, function(t) {\n\t t.deactivate();\n\t });\n\t return this;\n\t },\n\t isOpen: function isOpen() {\n\t var open;\n\t ttEach(this.first(), function(t) {\n\t open = t.isOpen();\n\t });\n\t return open;\n\t },\n\t open: function open() {\n\t ttEach(this, function(t) {\n\t t.open();\n\t });\n\t return this;\n\t },\n\t close: function close() {\n\t ttEach(this, function(t) {\n\t t.close();\n\t });\n\t return this;\n\t },\n\t select: function select(el) {\n\t var success = false, $el = $(el);\n\t ttEach(this.first(), function(t) {\n\t success = t.select($el);\n\t });\n\t return success;\n\t },\n\t autocomplete: function autocomplete(el) {\n\t var success = false, $el = $(el);\n\t ttEach(this.first(), function(t) {\n\t success = t.autocomplete($el);\n\t });\n\t return success;\n\t },\n\t moveCursor: function moveCursoe(delta) {\n\t var success = false;\n\t ttEach(this.first(), function(t) {\n\t success = t.moveCursor(delta);\n\t });\n\t return success;\n\t },\n\t val: function val(newVal) {\n\t var query;\n\t if (!arguments.length) {\n\t ttEach(this.first(), function(t) {\n\t query = t.getVal();\n\t });\n\t return query;\n\t } else {\n\t ttEach(this, function(t) {\n\t t.setVal(newVal);\n\t });\n\t return this;\n\t }\n\t },\n\t destroy: function destroy() {\n\t ttEach(this, function(typeahead, $input) {\n\t revert($input);\n\t typeahead.destroy();\n\t });\n\t return this;\n\t }\n\t };\n\t $.fn.typeahead = function(method) {\n\t if (methods[method]) {\n\t return methods[method].apply(this, [].slice.call(arguments, 1));\n\t } else {\n\t return methods.initialize.apply(this, arguments);\n\t }\n\t };\n\t $.fn.typeahead.noConflict = function noConflict() {\n\t $.fn.typeahead = old;\n\t return this;\n\t };\n\t function ttEach($els, fn) {\n\t $els.each(function() {\n\t var $input = $(this), typeahead;\n\t (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input);\n\t });\n\t }\n\t function buildHintFromInput($input, www) {\n\t return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop(\"readonly\", true).removeAttr(\"id name placeholder required\").attr({\n\t autocomplete: \"off\",\n\t spellcheck: \"false\",\n\t tabindex: -1\n\t });\n\t }\n\t function prepInput($input, www) {\n\t $input.data(keys.attrs, {\n\t dir: $input.attr(\"dir\"),\n\t autocomplete: $input.attr(\"autocomplete\"),\n\t spellcheck: $input.attr(\"spellcheck\"),\n\t style: $input.attr(\"style\")\n\t });\n\t $input.addClass(www.classes.input).attr({\n\t autocomplete: \"off\",\n\t spellcheck: false\n\t });\n\t try {\n\t !$input.attr(\"dir\") && $input.attr(\"dir\", \"auto\");\n\t } catch (e) {}\n\t return $input;\n\t }\n\t function getBackgroundStyles($el) {\n\t return {\n\t backgroundAttachment: $el.css(\"background-attachment\"),\n\t backgroundClip: $el.css(\"background-clip\"),\n\t backgroundColor: $el.css(\"background-color\"),\n\t backgroundImage: $el.css(\"background-image\"),\n\t backgroundOrigin: $el.css(\"background-origin\"),\n\t backgroundPosition: $el.css(\"background-position\"),\n\t backgroundRepeat: $el.css(\"background-repeat\"),\n\t backgroundSize: $el.css(\"background-size\")\n\t };\n\t }\n\t function revert($input) {\n\t var www, $wrapper;\n\t www = $input.data(keys.www);\n\t $wrapper = $input.parent().filter(www.selectors.wrapper);\n\t _.each($input.data(keys.attrs), function(val, key) {\n\t _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);\n\t });\n\t $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);\n\t if ($wrapper.length) {\n\t $input.detach().insertAfter($wrapper);\n\t $wrapper.remove();\n\t }\n\t }\n\t function $elOrNull(obj) {\n\t var isValid, $el;\n\t isValid = _.isJQuery(obj) || _.isElement(obj);\n\t $el = isValid ? $(obj).first() : [];\n\t return $el.length ? $el : null;\n\t }\n\t })();\n\t});\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(14).setImmediate))\n\n/***/ }\n\n});\n\n\n/** WEBPACK FOOTER **\n ** chunk.typeahead.72a70ba070807fe8138a.js\n **/","var nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/timers-browserify/main.js\n ** module id = 14\n ** module chunks = 13\n **/","//MODIFIED TO USE CUSTOM SCROLL - DO NOT EVER EVER EVER UDPATE THIS \n(function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(\"typeahead.js\", [ \"jquery\" ], function(a0) {\n return factory(a0);\n });\n } else if (typeof exports === \"object\") {\n module.exports = factory(require(\"jquery\"));\n } else {\n factory(jQuery);\n }\n})(this, function($) {\n var _ = function() {\n \"use strict\";\n return {\n isMsie: function() {\n return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\\d+(.\\d+)?)/i)[2] : false;\n },\n isBlankString: function(str) {\n return !str || /^\\s*$/.test(str);\n },\n escapeRegExChars: function(str) {\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n },\n isString: function(obj) {\n return typeof obj === \"string\";\n },\n isNumber: function(obj) {\n return typeof obj === \"number\";\n },\n isArray: $.isArray,\n isFunction: $.isFunction,\n isObject: $.isPlainObject,\n isUndefined: function(obj) {\n return typeof obj === \"undefined\";\n },\n isElement: function(obj) {\n return !!(obj && obj.nodeType === 1);\n },\n isJQuery: function(obj) {\n return obj instanceof $;\n },\n toStr: function toStr(s) {\n return _.isUndefined(s) || s === null ? \"\" : s + \"\";\n },\n bind: $.proxy,\n each: function(collection, cb) {\n $.each(collection, reverseArgs);\n function reverseArgs(index, value) {\n return cb(value, index);\n }\n },\n map: $.map,\n filter: $.grep,\n every: function(obj, test) {\n var result = true;\n if (!obj) {\n return result;\n }\n $.each(obj, function(key, val) {\n if (!(result = test.call(null, val, key, obj))) {\n return false;\n }\n });\n return !!result;\n },\n some: function(obj, test) {\n var result = false;\n if (!obj) {\n return result;\n }\n $.each(obj, function(key, val) {\n if (result = test.call(null, val, key, obj)) {\n return false;\n }\n });\n return !!result;\n },\n mixin: $.extend,\n identity: function(x) {\n return x;\n },\n clone: function(obj) {\n return $.extend(true, {}, obj);\n },\n getIdGenerator: function() {\n var counter = 0;\n return function() {\n return counter++;\n };\n },\n templatify: function templatify(obj) {\n return $.isFunction(obj) ? obj : template;\n function template() {\n return String(obj);\n }\n },\n defer: function(fn) {\n setTimeout(fn, 0);\n },\n debounce: function(func, wait, immediate) {\n var timeout, result;\n return function() {\n var context = this, args = arguments, later, callNow;\n later = function() {\n timeout = null;\n if (!immediate) {\n result = func.apply(context, args);\n }\n };\n callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) {\n result = func.apply(context, args);\n }\n return result;\n };\n },\n throttle: function(func, wait) {\n var context, args, timeout, result, previous, later;\n previous = 0;\n later = function() {\n previous = new Date();\n timeout = null;\n result = func.apply(context, args);\n };\n return function() {\n var now = new Date(), remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0) {\n clearTimeout(timeout);\n timeout = null;\n previous = now;\n result = func.apply(context, args);\n } else if (!timeout) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n },\n stringify: function(val) {\n return _.isString(val) ? val : JSON.stringify(val);\n },\n noop: function() {}\n };\n }();\n var WWW = function() {\n \"use strict\";\n var defaultClassNames = {\n wrapper: \"twitter-typeahead\",\n input: \"tt-input\",\n hint: \"tt-hint\",\n menu: \"tt-menu\",\n menuinner: \"tt-menu-inner\",\n dataset: \"tt-dataset\",\n suggestion: \"tt-suggestion\",\n selectable: \"tt-selectable\",\n empty: \"tt-empty\",\n open: \"tt-open\",\n cursor: \"tt-cursor\",\n highlight: \"tt-highlight\"\n };\n return build;\n function build(o) {\n var www, classes;\n classes = _.mixin({}, defaultClassNames, o);\n www = {\n css: buildCss(),\n classes: classes,\n html: buildHtml(classes),\n selectors: buildSelectors(classes)\n };\n return {\n css: www.css,\n html: www.html,\n classes: www.classes,\n selectors: www.selectors,\n mixin: function(o) {\n _.mixin(o, www);\n }\n };\n }\n function buildHtml(c) {\n return {\n wrapper: '',\n menu: '
',\n menuinner: '
'\n };\n }\n function buildSelectors(classes) {\n var selectors = {};\n _.each(classes, function(v, k) {\n selectors[k] = \".\" + v;\n });\n return selectors;\n }\n function buildCss() {\n var css = {\n wrapper: {\n position: \"relative\",\n display: \"inline-block\"\n },\n hint: {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n borderColor: \"transparent\",\n boxShadow: \"none\",\n opacity: \"1\"\n },\n input: {\n position: \"relative\",\n verticalAlign: \"top\",\n backgroundColor: \"transparent\"\n },\n inputWithNoHint: {\n position: \"relative\",\n verticalAlign: \"top\"\n },\n menu: {\n position: \"absolute\",\n top: \"100%\",\n left: \"0\",\n zIndex: \"100\",\n display: \"none\"\n },\n ltr: {\n left: \"0\",\n right: \"auto\"\n },\n rtl: {\n left: \"auto\",\n right: \" 0\"\n }\n };\n if (_.isMsie()) {\n _.mixin(css.input, {\n backgroundImage: \"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)\"\n });\n }\n return css;\n }\n }();\n var EventBus = function() {\n \"use strict\";\n var namespace, deprecationMap;\n namespace = \"typeahead:\";\n deprecationMap = {\n render: \"rendered\",\n cursorchange: \"cursorchanged\",\n select: \"selected\",\n autocomplete: \"autocompleted\"\n };\n function EventBus(o) {\n if (!o || !o.el) {\n $.error(\"EventBus initialized without el\");\n }\n this.$el = $(o.el);\n }\n _.mixin(EventBus.prototype, {\n _trigger: function(type, args) {\n var $e;\n $e = $.Event(namespace + type);\n (args = args || []).unshift($e);\n this.$el.trigger.apply(this.$el, args);\n return $e;\n },\n before: function(type) {\n var args, $e;\n args = [].slice.call(arguments, 1);\n $e = this._trigger(\"before\" + type, args);\n return $e.isDefaultPrevented();\n },\n trigger: function(type) {\n var deprecatedType;\n this._trigger(type, [].slice.call(arguments, 1));\n if (deprecatedType = deprecationMap[type]) {\n this._trigger(deprecatedType, [].slice.call(arguments, 1));\n }\n }\n });\n return EventBus;\n }();\n var EventEmitter = function() {\n \"use strict\";\n var splitter = /\\s+/, nextTick = getNextTick();\n return {\n onSync: onSync,\n onAsync: onAsync,\n off: off,\n trigger: trigger\n };\n function on(method, types, cb, context) {\n var type;\n if (!cb) {\n return this;\n }\n types = types.split(splitter);\n cb = context ? bindContext(cb, context) : cb;\n this._callbacks = this._callbacks || {};\n while (type = types.shift()) {\n this._callbacks[type] = this._callbacks[type] || {\n sync: [],\n async: []\n };\n this._callbacks[type][method].push(cb);\n }\n return this;\n }\n function onAsync(types, cb, context) {\n return on.call(this, \"async\", types, cb, context);\n }\n function onSync(types, cb, context) {\n return on.call(this, \"sync\", types, cb, context);\n }\n function off(types) {\n var type;\n if (!this._callbacks) {\n return this;\n }\n types = types.split(splitter);\n while (type = types.shift()) {\n delete this._callbacks[type];\n }\n return this;\n }\n function trigger(types) {\n var type, callbacks, args, syncFlush, asyncFlush;\n if (!this._callbacks) {\n return this;\n }\n types = types.split(splitter);\n args = [].slice.call(arguments, 1);\n while ((type = types.shift()) && (callbacks = this._callbacks[type])) {\n syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));\n asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));\n syncFlush() && nextTick(asyncFlush);\n }\n return this;\n }\n function getFlush(callbacks, context, args) {\n return flush;\n function flush() {\n var cancelled;\n for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {\n cancelled = callbacks[i].apply(context, args) === false;\n }\n return !cancelled;\n }\n }\n function getNextTick() {\n var nextTickFn;\n if (window.setImmediate) {\n nextTickFn = function nextTickSetImmediate(fn) {\n setImmediate(function() {\n fn();\n });\n };\n } else {\n nextTickFn = function nextTickSetTimeout(fn) {\n setTimeout(function() {\n fn();\n }, 0);\n };\n }\n return nextTickFn;\n }\n function bindContext(fn, context) {\n return fn.bind ? fn.bind(context) : function() {\n fn.apply(context, [].slice.call(arguments, 0));\n };\n }\n }();\n var highlight = function(doc) {\n \"use strict\";\n var defaults = {\n node: null,\n pattern: null,\n tagName: \"strong\",\n className: null,\n wordsOnly: false,\n caseSensitive: false\n };\n return function hightlight(o) {\n var regex;\n o = _.mixin({}, defaults, o);\n if (!o.node || !o.pattern) {\n return;\n }\n o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];\n regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);\n traverse(o.node, hightlightTextNode);\n function hightlightTextNode(textNode) {\n var match, patternNode, wrapperNode;\n if (match = regex.exec(textNode.data)) {\n wrapperNode = doc.createElement(o.tagName);\n o.className && (wrapperNode.className = o.className);\n patternNode = textNode.splitText(match.index);\n patternNode.splitText(match[0].length);\n wrapperNode.appendChild(patternNode.cloneNode(true));\n textNode.parentNode.replaceChild(wrapperNode, patternNode);\n }\n return !!match;\n }\n function traverse(el, hightlightTextNode) {\n var childNode, TEXT_NODE_TYPE = 3;\n for (var i = 0; i < el.childNodes.length; i++) {\n childNode = el.childNodes[i];\n if (childNode.nodeType === TEXT_NODE_TYPE) {\n i += hightlightTextNode(childNode) ? 1 : 0;\n } else {\n traverse(childNode, hightlightTextNode);\n }\n }\n }\n };\n function getRegex(patterns, caseSensitive, wordsOnly) {\n var escapedPatterns = [], regexStr;\n for (var i = 0, len = patterns.length; i < len; i++) {\n escapedPatterns.push(_.escapeRegExChars(patterns[i]));\n }\n regexStr = wordsOnly ? \"\\\\b(\" + escapedPatterns.join(\"|\") + \")\\\\b\" : \"(\" + escapedPatterns.join(\"|\") + \")\";\n return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, \"i\");\n }\n }(window.document);\n var Input = function() {\n \"use strict\";\n var specialKeyCodeMap;\n specialKeyCodeMap = {\n 9: \"tab\",\n 27: \"esc\",\n 37: \"left\",\n 39: \"right\",\n 13: \"enter\",\n 38: \"up\",\n 40: \"down\"\n };\n function Input(o, www) {\n o = o || {};\n if (!o.input) {\n $.error(\"input is missing\");\n }\n www.mixin(this);\n this.$hint = $(o.hint);\n this.$input = $(o.input);\n this.query = this.$input.val();\n this.queryWhenFocused = this.hasFocus() ? this.query : null;\n this.$overflowHelper = buildOverflowHelper(this.$input);\n this._checkLanguageDirection();\n if (this.$hint.length === 0) {\n this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;\n }\n }\n Input.normalizeQuery = function(str) {\n return _.toStr(str).replace(/^\\s*/g, \"\").replace(/\\s{2,}/g, \" \");\n };\n _.mixin(Input.prototype, EventEmitter, {\n _onBlur: function onBlur() {\n this.resetInputValue();\n this.trigger(\"blurred\");\n },\n _onFocus: function onFocus() {\n this.queryWhenFocused = this.query;\n this.trigger(\"focused\");\n },\n _onKeydown: function onKeydown($e) {\n var keyName = specialKeyCodeMap[$e.which || $e.keyCode];\n this._managePreventDefault(keyName, $e);\n if (keyName && this._shouldTrigger(keyName, $e)) {\n this.trigger(keyName + \"Keyed\", $e);\n }\n },\n _onInput: function onInput() {\n this._setQuery(this.getInputValue());\n this.clearHintIfInvalid();\n this._checkLanguageDirection();\n },\n _managePreventDefault: function managePreventDefault(keyName, $e) {\n var preventDefault;\n switch (keyName) {\n case \"up\":\n case \"down\":\n preventDefault = !withModifier($e);\n break;\n\n default:\n preventDefault = false;\n }\n preventDefault && $e.preventDefault();\n },\n _shouldTrigger: function shouldTrigger(keyName, $e) {\n var trigger;\n switch (keyName) {\n case \"tab\":\n trigger = !withModifier($e);\n break;\n\n default:\n trigger = true;\n }\n return trigger;\n },\n _checkLanguageDirection: function checkLanguageDirection() {\n var dir = (this.$input.css(\"direction\") || \"ltr\").toLowerCase();\n if (this.dir !== dir) {\n this.dir = dir;\n this.$hint.attr(\"dir\", dir);\n this.trigger(\"langDirChanged\", dir);\n }\n },\n _setQuery: function setQuery(val, silent) {\n var areEquivalent, hasDifferentWhitespace;\n areEquivalent = areQueriesEquivalent(val, this.query);\n hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false;\n this.query = val;\n if (!silent && !areEquivalent) {\n this.trigger(\"queryChanged\", this.query);\n } else if (!silent && hasDifferentWhitespace) {\n this.trigger(\"whitespaceChanged\", this.query);\n }\n },\n bind: function() {\n var that = this, onBlur, onFocus, onKeydown, onInput;\n onBlur = _.bind(this._onBlur, this);\n onFocus = _.bind(this._onFocus, this);\n onKeydown = _.bind(this._onKeydown, this);\n onInput = _.bind(this._onInput, this);\n this.$input.on(\"blur.tt\", onBlur).on(\"focus.tt\", onFocus).on(\"keydown.tt\", onKeydown);\n if (!_.isMsie() || _.isMsie() > 9) {\n this.$input.on(\"input.tt\", onInput);\n } else {\n this.$input.on(\"keydown.tt keypress.tt cut.tt paste.tt\", function($e) {\n if (specialKeyCodeMap[$e.which || $e.keyCode]) {\n return;\n }\n _.defer(_.bind(that._onInput, that, $e));\n });\n }\n return this;\n },\n focus: function focus() {\n this.$input.focus();\n },\n blur: function blur() {\n this.$input.blur();\n },\n getLangDir: function getLangDir() {\n return this.dir;\n },\n getQuery: function getQuery() {\n return this.query || \"\";\n },\n setQuery: function setQuery(val, silent) {\n this.setInputValue(val);\n this._setQuery(val, silent);\n },\n hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {\n return this.query !== this.queryWhenFocused;\n },\n getInputValue: function getInputValue() {\n return this.$input.val();\n },\n setInputValue: function setInputValue(value) {\n this.$input.val(value);\n this.clearHintIfInvalid();\n this._checkLanguageDirection();\n },\n resetInputValue: function resetInputValue() {\n// this.setInputValue(this.query);\n },\n getHint: function getHint() {\n return this.$hint.val();\n },\n setHint: function setHint(value) {\n this.$hint.val(value);\n },\n clearHint: function clearHint() {\n this.setHint(\"\");\n },\n clearHintIfInvalid: function clearHintIfInvalid() {\n var val, hint, valIsPrefixOfHint, isValid;\n val = this.getInputValue();\n hint = this.getHint();\n valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;\n isValid = val !== \"\" && valIsPrefixOfHint && !this.hasOverflow();\n !isValid && this.clearHint();\n },\n hasFocus: function hasFocus() {\n return this.$input.is(\":focus\");\n },\n hasOverflow: function hasOverflow() {\n var constraint = this.$input.width() - 2;\n this.$overflowHelper.text(this.getInputValue());\n return this.$overflowHelper.width() >= constraint;\n },\n isCursorAtEnd: function() {\n var valueLength, selectionStart, range;\n valueLength = this.$input.val().length;\n selectionStart = this.$input[0].selectionStart;\n if (_.isNumber(selectionStart)) {\n return selectionStart === valueLength;\n } else if (document.selection) {\n range = document.selection.createRange();\n range.moveStart(\"character\", -valueLength);\n return valueLength === range.text.length;\n }\n return true;\n },\n destroy: function destroy() {\n this.$hint.off(\".tt\");\n this.$input.off(\".tt\");\n this.$overflowHelper.remove();\n this.$hint = this.$input = this.$overflowHelper = $(\"
\");\n }\n });\n return Input;\n function buildOverflowHelper($input) {\n return $('
').css({\n                position: \"absolute\",\n                visibility: \"hidden\",\n                whiteSpace: \"pre\",\n                fontFamily: $input.css(\"font-family\"),\n                fontSize: $input.css(\"font-size\"),\n                fontStyle: $input.css(\"font-style\"),\n                fontVariant: $input.css(\"font-variant\"),\n                fontWeight: $input.css(\"font-weight\"),\n                wordSpacing: $input.css(\"word-spacing\"),\n                letterSpacing: $input.css(\"letter-spacing\"),\n                textIndent: $input.css(\"text-indent\"),\n                textRendering: $input.css(\"text-rendering\"),\n                textTransform: $input.css(\"text-transform\")\n            }).insertAfter($input);\n        }\n        function areQueriesEquivalent(a, b) {\n            return Input.normalizeQuery(a) === Input.normalizeQuery(b);\n        }\n        function withModifier($e) {\n            return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;\n        }\n    }();\n    var Dataset = function() {\n        \"use strict\";\n        var keys, nameGenerator;\n        keys = {\n            val: \"tt-selectable-display\",\n            obj: \"tt-selectable-object\"\n        };\n        nameGenerator = _.getIdGenerator();\n        function Dataset(o, www) {\n            o = o || {};\n            o.templates = o.templates || {};\n            o.templates.notFound = o.templates.notFound || o.templates.empty;\n            if (!o.source) {\n                $.error(\"missing source\");\n            }\n            if (!o.node) {\n                $.error(\"missing node\");\n            }\n            if (o.name && !isValidName(o.name)) {\n                $.error(\"invalid dataset name: \" + o.name);\n            }\n            www.mixin(this);\n            this.highlight = !!o.highlight;\n            this.name = o.name || nameGenerator();\n            this.limit = o.limit || 5;\n            this.displayFn = getDisplayFn(o.display || o.displayKey);\n            this.templates = getTemplates(o.templates, this.displayFn);\n            this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;\n            this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;\n            this.isHint = _.isUndefined(o.isHint) ? true : !!o.isHint;\n            this._resetLastSuggestion();\n            this.$el = $(o.node).addClass(this.classes.dataset).addClass(this.classes.dataset + \"-\" + this.name);\n        }\n        Dataset.extractData = function extractData(el) {\n            var $el = $(el);\n            if ($el.data(keys.obj)) {\n                return {\n                    val: $el.data(keys.val) || \"\",\n                    obj: $el.data(keys.obj) || null\n                };\n            }\n            return null;\n        };\n        _.mixin(Dataset.prototype, EventEmitter, {\n            _overwrite: function overwrite(query, suggestions) {\n                suggestions = suggestions || [];\n                if (suggestions.length) {\n                    this._renderSuggestions(query, suggestions);\n                } else if (this.async && this.templates.pending) {\n                    this._renderPending(query);\n                } else if (!this.async && this.templates.notFound) {\n                    this._renderNotFound(query);\n                } else {\n                    this._empty();\n                }\n                this.trigger(\"rendered\", this.name, suggestions, false);\n            },\n            _append: function append(query, suggestions) {\n                suggestions = suggestions || [];\n                if (suggestions.length && this.$lastSuggestion.length) {\n                    this._appendSuggestions(query, suggestions);\n                } else if (suggestions.length) {\n                    this._renderSuggestions(query, suggestions);\n                } else if (!this.$lastSuggestion.length && this.templates.notFound) {\n                    this._renderNotFound(query);\n                }\n                this.trigger(\"rendered\", this.name, suggestions, true);\n            },\n            _renderSuggestions: function renderSuggestions(query, suggestions) {\n                var $fragment;\n                $fragment = this._getSuggestionsFragment(query, suggestions);\n                this.$lastSuggestion = $fragment.children().last();\n                this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions));\n            },\n            _appendSuggestions: function appendSuggestions(query, suggestions) {\n                var $fragment, $lastSuggestion;\n                $fragment = this._getSuggestionsFragment(query, suggestions);\n                $lastSuggestion = $fragment.children().last();\n                this.$lastSuggestion.after($fragment);\n                this.$lastSuggestion = $lastSuggestion;\n            },\n            _renderPending: function renderPending(query) {\n                var template = this.templates.pending;\n                this._resetLastSuggestion();\n                template && this.$el.html(template({\n                    query: query,\n                    dataset: this.name\n                }));\n            },\n            _renderNotFound: function renderNotFound(query) {\n                var template = this.templates.notFound;\n                this._resetLastSuggestion();\n                template && this.$el.html(template({\n                    query: query,\n                    dataset: this.name\n                }));\n            },\n            _empty: function empty() {\n                this.$el.empty();\n                this._resetLastSuggestion();\n            },\n            _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) {\n                var that = this, fragment;\n                fragment = document.createDocumentFragment();\n                _.each(suggestions, function getSuggestionNode(suggestion) {\n                    var $el, context;\n                    context = that._injectQuery(query, suggestion);\n                    $el = $(that.templates.suggestion(context)).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + \" \" + that.classes.selectable);\n                    fragment.appendChild($el[0]);\n                });\n                this.highlight && highlight({\n                    className: this.classes.highlight,\n                    node: fragment,\n                    pattern: query\n                });\n                return $(fragment);\n            },\n            _getFooter: function getFooter(query, suggestions) {\n                return this.templates.footer ? this.templates.footer({\n                    query: query,\n                    suggestions: suggestions,\n                    dataset: this.name\n                }) : null;\n            },\n            _getHeader: function getHeader(query, suggestions) {\n                return this.templates.header ? this.templates.header({\n                    query: query,\n                    suggestions: suggestions,\n                    dataset: this.name\n                }) : null;\n            },\n            _resetLastSuggestion: function resetLastSuggestion() {\n                this.$lastSuggestion = $();\n            },\n            _injectQuery: function injectQuery(query, obj) {\n                return _.isObject(obj) ? _.mixin({\n                    _query: query\n                }, obj) : obj;\n            },\n            update: function update(query) {\n                var that = this, canceled = false, syncCalled = false, rendered = 0;\n                this.cancel();\n                this.cancel = function cancel() {\n                    canceled = true;\n                    that.cancel = $.noop;\n                    that.async && that.trigger(\"asyncCanceled\", query);\n                };\n                this.source(query, sync, async);\n                !syncCalled && sync([]);\n                function sync(suggestions) {\n                    if (syncCalled) {\n                        return;\n                    }\n                    syncCalled = true;\n                    suggestions = (suggestions || []).slice(0, that.limit);\n                    rendered = suggestions.length;\n                    that._overwrite(query, suggestions);\n                    if (rendered < that.limit && that.async) {\n                        that.trigger(\"asyncRequested\", query);\n                    }\n                }\n                function async(suggestions) {\n                    suggestions = suggestions || [];\n                    if (!canceled && rendered < that.limit) {\n                        that.cancel = $.noop;\n                        that._append(query, suggestions.slice(0, that.limit - rendered));\n                        rendered += suggestions.length;\n                        that.async && that.trigger(\"asyncReceived\", query);\n                    }\n                }\n            },\n            cancel: $.noop,\n            clear: function clear() {\n                this._empty();\n                this.cancel();\n                this.trigger(\"cleared\");\n            },\n            isEmpty: function isEmpty() {\n                return this.$el.is(\":empty\");\n            },\n            destroy: function destroy() {\n                this.$el = $(\"
\");\n }\n });\n return Dataset;\n function getDisplayFn(display) {\n display = display || _.stringify;\n return _.isFunction(display) ? display : displayFn;\n function displayFn(obj) {\n return obj[display];\n }\n }\n function getTemplates(templates, displayFn) {\n return {\n notFound: templates.notFound && _.templatify(templates.notFound),\n pending: templates.pending && _.templatify(templates.pending),\n header: templates.header && _.templatify(templates.header),\n footer: templates.footer && _.templatify(templates.footer),\n suggestion: templates.suggestion || suggestionTemplate\n };\n function suggestionTemplate(context) {\n return $(\"
\").text(displayFn(context));\n }\n }\n function isValidName(str) {\n return /^[_a-zA-Z0-9-]+$/.test(str);\n }\n }();\n var Menu = function() {\n \"use strict\";\n function Menu(o, www) {\n var that = this;\n o = o || {};\n if (!o.node) {\n $.error(\"node is required\");\n }\n www.mixin(this);\n this.$node = $(o.node);\n this.query = null;\n this.datasets = _.map(o.datasets, initializeDataset);\n function initializeDataset(oDataset) {\n var node = that.$node.find(oDataset.node).first();\n oDataset.node = node.length ? node : $(\"
\").appendTo(that.$node);\n return new Dataset(oDataset, www);\n }\n }\n _.mixin(Menu.prototype, EventEmitter, {\n _onSelectableClick: function onSelectableClick($e) {\n this.trigger(\"selectableClicked\", $($e.currentTarget));\n },\n _onRendered: function onRendered(type, dataset, suggestions, async) {\n this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\n this.trigger(\"datasetRendered\", dataset, suggestions, async);\n },\n _onCleared: function onCleared() {\n this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\n this.trigger(\"datasetCleared\");\n },\n _propagate: function propagate() {\n this.trigger.apply(this, arguments);\n },\n _allDatasetsEmpty: function allDatasetsEmpty() {\n return _.every(this.datasets, isDatasetEmpty);\n function isDatasetEmpty(dataset) {\n return dataset.isEmpty();\n }\n },\n _getSelectables: function getSelectables() {\n return this.$node.find(this.selectors.selectable);\n },\r\n _getMainSelectables: function getSelectables() {\r\n var result = null;\r\n for (var i = 0, l = this.datasets.length; i < l; i++) {\r\n if (!this.datasets[i].isHint)\r\n continue;\r\n var query = this.$node.find(this.selectors.dataset + '-' + this.datasets[i].name).find(this.selectors.selectable);\r\n result = result == null ? query : result.add(query);\r\n }\r\n return result;\r\n },\n _removeCursor: function _removeCursor() {\n var $selectable = this.getActiveSelectable();\n $selectable && $selectable.removeClass(this.classes.cursor);\n },\n _ensureVisible: function ensureVisible($el) {\n var elTop, elBottom, nodeScrollTop, nodeHeight;\n elTop = $el.position().top;\n elBottom = elTop + $el.outerHeight(true);\n nodeScrollTop = this.$node.scrollTop();\n nodeHeight = this.$node.height() + parseInt(this.$node.css(\"paddingTop\"), 10) + parseInt(this.$node.css(\"paddingBottom\"), 10);\n if (elTop < 0) {\n this.$node.scrollTop(nodeScrollTop + elTop);\n } else if (nodeHeight < elBottom) {\n this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));\n }\n },\n bind: function() {\n var that = this, onSelectableClick;\n onSelectableClick = _.bind(this._onSelectableClick, this);\n this.$node.on(\"click.tt\", this.selectors.selectable, onSelectableClick);\n this.$node.on(\"tap\", this.selectors.selectable, onSelectableClick);\n _.each(this.datasets, function(dataset) {\n dataset.onSync(\"asyncRequested\", that._propagate, that).onSync(\"asyncCanceled\", that._propagate, that).onSync(\"asyncReceived\", that._propagate, that).onSync(\"rendered\", that._onRendered, that).onSync(\"cleared\", that._onCleared, that);\n });\n return this;\n },\n isOpen: function isOpen() {\n return this.$node.hasClass(this.classes.open);\n },\n open: function open() {\n this.$node.addClass(this.classes.open);\n },\n close: function close() {\n this.$node.removeClass(this.classes.open);\n this._removeCursor();\n },\n setLanguageDirection: function setLanguageDirection(dir) {\n this.$node.attr(\"dir\", dir);\n },\n selectableRelativeToCursor: function selectableRelativeToCursor(delta) {\n var $selectables, $oldCursor, oldIndex, newIndex;\n $oldCursor = this.getActiveSelectable();\n $selectables = this._getSelectables();\n oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;\n newIndex = oldIndex + delta;\n newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;\n newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;\n return newIndex === -1 ? null : $selectables.eq(newIndex);\n },\n setCursor: function setCursor($selectable) {\n this._removeCursor();\n\n if ($selectable = $selectable && $selectable.first()) {\n $selectable.addClass(this.classes.cursor);\n this._ensureVisible($selectable);\n }\n },\n getSelectableData: function getSelectableData($el) {\n return $el && $el.length ? Dataset.extractData($el) : null;\n },\n getActiveSelectable: function getActiveSelectable() {\n var $selectable = this._getSelectables().filter(this.selectors.cursor).first();\n return $selectable.length ? $selectable : null;\n },\n getTopSelectable: function getTopSelectable() {\n var $selectable = this._getMainSelectables().first();\n return $selectable.length ? $selectable : null;\n },\n update: function update(query) {\n var isValidUpdate = query !== this.query;\n if (isValidUpdate) {\n this.query = query;\n _.each(this.datasets, updateDataset);\n }\n return isValidUpdate;\n function updateDataset(dataset) {\n dataset.update(query);\n }\n },\n empty: function empty() {\n _.each(this.datasets, clearDataset);\n this.query = null;\n this.$node.addClass(this.classes.empty);\n function clearDataset(dataset) {\n dataset.clear();\n }\n },\n destroy: function destroy() {\n this.$node.off(\".tt\");\n this.$node = $(\"
\");\n _.each(this.datasets, destroyDataset);\n function destroyDataset(dataset) {\n dataset.destroy();\n }\n }\n });\n return Menu;\n }();\n var DefaultMenu = function() {\n \"use strict\";\n var s = Menu.prototype;\n function DefaultMenu() {\n Menu.apply(this, [].slice.call(arguments, 0));\n }\n _.mixin(DefaultMenu.prototype, Menu.prototype, {\n open: function open() {\n !this._allDatasetsEmpty() && this._show();\n return s.open.apply(this, [].slice.call(arguments, 0));\n },\n close: function close() {\n this._hide();\n return s.close.apply(this, [].slice.call(arguments, 0));\n },\n _onRendered: function onRendered() {\n if (this._allDatasetsEmpty()) {\n this._hide();\n } else {\n this.isOpen() && this._show();\n }\n return s._onRendered.apply(this, [].slice.call(arguments, 0));\n },\n _onCleared: function onCleared() {\n if (this._allDatasetsEmpty()) {\n this._hide();\n } else {\n this.isOpen() && this._show();\n }\n return s._onCleared.apply(this, [].slice.call(arguments, 0));\n },\n setLanguageDirection: function setLanguageDirection(dir) {\n this.$node.css(dir === \"ltr\" ? this.css.ltr : this.css.rtl);\n return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));\n },\n _hide: function hide() {\r\n var $nodeToHide = this.$node.hasClass('tt-menu-inner') ? this.$node.parent() : this.$node;\n $nodeToHide.hide();\n },\n _show: function show() {\n var $nodeToShow = this.$node.hasClass('tt-menu-inner') ? this.$node.parent() : this.$node;\n $nodeToShow.css(\"display\", \"block\");\n }\n });\n return DefaultMenu;\n }();\n var Typeahead = function() {\n \"use strict\";\n function Typeahead(o, www) {\n var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;\n o = o || {};\n if (!o.input) {\n $.error(\"missing input\");\n }\n if (!o.menu) {\n $.error(\"missing menu\");\n }\n if (!o.eventBus) {\n $.error(\"missing event bus\");\n }\n www.mixin(this);\n this.eventBus = o.eventBus;\n this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;\n this.input = o.input;\n this.menu = o.menu;\n this.enabled = true;\n this.active = false;\n this.input.hasFocus() && this.activate();\n this.dir = this.input.getLangDir();\n this._hacks();\n this.menu.bind().onSync(\"selectableClicked\", this._onSelectableClicked, this).onSync(\"asyncRequested\", this._onAsyncRequested, this).onSync(\"asyncCanceled\", this._onAsyncCanceled, this).onSync(\"asyncReceived\", this._onAsyncReceived, this).onSync(\"datasetRendered\", this._onDatasetRendered, this).onSync(\"datasetCleared\", this._onDatasetCleared, this);\n onFocused = c(this, \"activate\", \"open\", \"_onFocused\");\n onBlurred = c(this, \"deactivate\", \"_onBlurred\");\n onEnterKeyed = c(this, \"isActive\", \"isOpen\", \"_onEnterKeyed\");\n onTabKeyed = c(this, \"isActive\", \"isOpen\", \"_onTabKeyed\");\n onEscKeyed = c(this, \"isActive\", \"_onEscKeyed\");\n onUpKeyed = c(this, \"isActive\", \"open\", \"_onUpKeyed\");\n onDownKeyed = c(this, \"isActive\", \"open\", \"_onDownKeyed\");\n onLeftKeyed = c(this, \"isActive\", \"isOpen\", \"_onLeftKeyed\");\n onRightKeyed = c(this, \"isActive\", \"isOpen\", \"_onRightKeyed\");\n onQueryChanged = c(this, \"_openIfActive\", \"_onQueryChanged\");\n onWhitespaceChanged = c(this, \"_openIfActive\", \"_onWhitespaceChanged\");\n this.input.bind().onSync(\"focused\", onFocused, this).onSync(\"blurred\", onBlurred, this).onSync(\"enterKeyed\", onEnterKeyed, this).onSync(\"tabKeyed\", onTabKeyed, this).onSync(\"escKeyed\", onEscKeyed, this).onSync(\"upKeyed\", onUpKeyed, this).onSync(\"downKeyed\", onDownKeyed, this).onSync(\"leftKeyed\", onLeftKeyed, this).onSync(\"rightKeyed\", onRightKeyed, this).onSync(\"queryChanged\", onQueryChanged, this).onSync(\"whitespaceChanged\", onWhitespaceChanged, this).onSync(\"langDirChanged\", this._onLangDirChanged, this);\n }\n _.mixin(Typeahead.prototype, {\n _hacks: function hacks() {\n var $input, $menu;\n $input = this.input.$input || $(\"
\");\n $menu = this.menu.$node || $(\"
\");\n $input.on(\"blur.tt\", function($e) {\n var active, isActive, hasActive;\n active = document.activeElement;\n isActive = $menu.is(active);\n hasActive = $menu.has(active).length > 0;\n if (_.isMsie() && (isActive || hasActive)) {\n $e.preventDefault();\n $e.stopImmediatePropagation();\n _.defer(function() {\n $input.focus();\n });\n }\n });\n $menu.on(\"mousedown.tt\", function($e) {\n $e.preventDefault();\n });\n },\n _onSelectableClicked: function onSelectableClicked(type, $el) {\n this.select($el);\n },\n _onDatasetCleared: function onDatasetCleared() {\n this._updateHint();\n },\n _onDatasetRendered: function onDatasetRendered(type, dataset, suggestions, async) {\n this._updateHint();\n this.eventBus.trigger(\"render\", suggestions, async, dataset);\n },\n _onAsyncRequested: function onAsyncRequested(type, dataset, query) {\n this.eventBus.trigger(\"asyncrequest\", query, dataset);\n },\n _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {\n this.eventBus.trigger(\"asynccancel\", query, dataset);\n },\n _onAsyncReceived: function onAsyncReceived(type, dataset, query) {\n this.eventBus.trigger(\"asyncreceive\", query, dataset);\n },\n _onFocused: function onFocused() {\n this._minLengthMet() && this.menu.update(this.input.getQuery());\n },\n _onBlurred: function onBlurred() {\n if (this.input.hasQueryChangedSinceLastFocus()) {\n this.eventBus.trigger(\"change\", this.input.getQuery());\n }\n },\n _onEnterKeyed: function onEnterKeyed(type, $e) {\n var $selectable;\n if ($selectable = this.menu.getActiveSelectable()) {\n this.select($selectable) && $e.preventDefault();\n }\n },\n _onTabKeyed: function onTabKeyed(type, $e) {\n var $selectable;\n if ($selectable = this.menu.getActiveSelectable()) {\n this.select($selectable) && $e.preventDefault();\n } else if ($selectable = this.menu.getTopSelectable()) {\n this.autocomplete($selectable) && $e.preventDefault();\n }\n },\n _onEscKeyed: function onEscKeyed() {\n this.close();\n },\n _onUpKeyed: function onUpKeyed() {\n this.moveCursor(-1);\n },\n _onDownKeyed: function onDownKeyed() {\n this.moveCursor(+1);\n },\n _onLeftKeyed: function onLeftKeyed() {\n if (this.dir === \"rtl\" && this.input.isCursorAtEnd()) {\n this.autocomplete(this.menu.getTopSelectable());\n }\n },\n _onRightKeyed: function onRightKeyed() {\n if (this.dir === \"ltr\" && this.input.isCursorAtEnd()) {\n this.autocomplete(this.menu.getTopSelectable());\n }\n },\n _onQueryChanged: function onQueryChanged(e, query) {\n this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();\n },\n _onWhitespaceChanged: function onWhitespaceChanged() {\n this._updateHint();\n },\n _onLangDirChanged: function onLangDirChanged(e, dir) {\n if (this.dir !== dir) {\n this.dir = dir;\n this.menu.setLanguageDirection(dir);\n }\n },\n _openIfActive: function openIfActive() {\n this.isActive() && this.open();\n },\n _minLengthMet: function minLengthMet(query) {\n query = _.isString(query) ? query : this.input.getQuery() || \"\";\n return query.length >= this.minLength;\n },\n _updateHint: function updateHint() {\n var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;\n $selectable = this.menu.getTopSelectable();\n data = this.menu.getSelectableData($selectable);\n val = this.input.getInputValue();\n if (data && !_.isBlankString(val) && !this.input.hasOverflow()) {\n query = Input.normalizeQuery(val);\n escapedQuery = _.escapeRegExChars(query);\n frontMatchRegEx = new RegExp(\"^(?:\" + escapedQuery + \")(.+$)\", \"i\");\n match = frontMatchRegEx.exec(data.val);\n match && this.input.setHint(val + match[1]);\n } else {\n this.input.clearHint();\n }\n },\n isEnabled: function isEnabled() {\n return this.enabled;\n },\n enable: function enable() {\n this.enabled = true;\n },\n disable: function disable() {\n this.enabled = false;\n },\n isActive: function isActive() {\n return this.active;\n },\n activate: function activate() {\n if (this.isActive()) {\n return true;\n } else if (!this.isEnabled() || this.eventBus.before(\"active\")) {\n return false;\n } else {\n this.active = true;\n this.eventBus.trigger(\"active\");\n return true;\n }\n },\n deactivate: function deactivate() {\n if (!this.isActive()) {\n return true;\n } else if (this.eventBus.before(\"idle\")) {\n return false;\n } else {\n this.active = false;\n this.close();\n this.eventBus.trigger(\"idle\");\n return true;\n }\n },\n isOpen: function isOpen() {\n return this.menu.isOpen();\n },\n open: function open() {\n if (!this.isOpen() && !this.eventBus.before(\"open\")) {\n this.menu.open();\n this._updateHint();\n this.eventBus.trigger(\"open\");\n }\n return this.isOpen();\n },\n close: function close() {\n if (this.isOpen() && !this.eventBus.before(\"close\")) {\n this.menu.close();\n this.input.clearHint();\n this.input.resetInputValue();\n this.eventBus.trigger(\"close\");\n }\n return !this.isOpen();\n },\n setVal: function setVal(val) {\n this.input.setQuery(_.toStr(val));\n },\n getVal: function getVal() {\n return this.input.getQuery();\n },\n select: function select($selectable) {\n var data = this.menu.getSelectableData($selectable);\n if (data && !this.eventBus.before(\"select\", data.obj)) {\n this.input.setQuery(data.val, true);\n this.eventBus.trigger(\"select\", data.obj);\n this.close();\n return true;\n }\n return false;\n },\n autocomplete: function autocomplete($selectable) {\n var query, data, isValid;\n query = this.input.getQuery();\n data = this.menu.getSelectableData($selectable);\n isValid = data && query !== data.val;\n if (isValid && !this.eventBus.before(\"autocomplete\", data.obj)) {\n this.input.setQuery(data.val);\n this.eventBus.trigger(\"autocomplete\", data.obj);\n return true;\n }\n return false;\n },\n moveCursor: function moveCursor(delta) {\n var query, $candidate, data, payload, cancelMove;\n query = this.input.getQuery();\n $candidate = this.menu.selectableRelativeToCursor(delta);\n data = this.menu.getSelectableData($candidate);\n payload = data ? data.obj : null;\n cancelMove = this._minLengthMet() && this.menu.update(query);\n if ($candidate!=null && !cancelMove && !this.eventBus.before(\"cursorchange\", payload)) {\n this.menu.setCursor($candidate);\n if (data) {\n this.input.setInputValue(data.val);\n } else {\n this.input.resetInputValue();\n this._updateHint();\n }\n this.eventBus.trigger(\"cursorchange\", payload);\n return true;\n }\n return false;\n },\n destroy: function destroy() {\n this.input.destroy();\n this.menu.destroy();\n }\n });\n return Typeahead;\n function c(ctx) {\n var methods = [].slice.call(arguments, 1);\n return function() {\n var args = [].slice.call(arguments);\n _.each(methods, function(method) {\n return ctx[method].apply(ctx, args);\n });\n };\n }\n }();\n (function() {\n \"use strict\";\n var old, keys, methods;\n old = $.fn.typeahead;\n keys = {\n www: \"tt-www\",\n attrs: \"tt-attrs\",\n typeahead: \"tt-typeahead\"\n };\n methods = {\n initialize: function initialize(o, datasets) {\n var www;\n datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);\n o = o || {};\n www = WWW(o.classNames);\n return this.each(attach);\n function attach() {\n var $input, $wrapper, $hint, $menu, $menuinner, defaultHint, defaultMenu,eventBus, input, menu, typeahead, MenuConstructor;\n _.each(datasets, function(d) {\n d.highlight = !!o.highlight;\n });\n $input = $(this);\n $wrapper = $(www.html.wrapper);\n $hint = $elOrNull(o.hint);\n $menu = $elOrNull(o.menu);\n $menuinner = $(www.html.menuinner);\n defaultHint = o.hint !== false && !$hint;\n defaultMenu = o.menu !== false && !$menu;\n defaultHint && ($hint = buildHintFromInput($input, www));\n defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));\n $hint && $hint.val(\"\");\n $input = prepInput($input, www);\n if (defaultHint || defaultMenu) {\n $wrapper.css(www.css.wrapper);\n $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint);\n $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null);\n $menu.append($menuinner);\n }\n MenuConstructor = defaultMenu ? DefaultMenu : Menu;\n eventBus = new EventBus({\n el: $input\n });\n input = new Input({\n hint: $hint,\n input: $input\n }, www);\n menu = new MenuConstructor({\n node: $menuinner,\n datasets: datasets\n }, www);\n typeahead = new Typeahead({\n input: input,\n menu: menu,\n eventBus: eventBus,\n minLength: o.minLength\n }, www);\n $input.data(keys.www, www);\n $input.data(keys.typeahead, typeahead);\n }\n },\n isEnabled: function isEnabled() {\n var enabled;\n ttEach(this.first(), function(t) {\n enabled = t.isEnabled();\n });\n return enabled;\n },\n enable: function enable() {\n ttEach(this, function(t) {\n t.enable();\n });\n return this;\n },\n disable: function disable() {\n ttEach(this, function(t) {\n t.disable();\n });\n return this;\n },\n isActive: function isActive() {\n var active;\n ttEach(this.first(), function(t) {\n active = t.isActive();\n });\n return active;\n },\n activate: function activate() {\n ttEach(this, function(t) {\n t.activate();\n });\n return this;\n },\n deactivate: function deactivate() {\n ttEach(this, function(t) {\n t.deactivate();\n });\n return this;\n },\n isOpen: function isOpen() {\n var open;\n ttEach(this.first(), function(t) {\n open = t.isOpen();\n });\n return open;\n },\n open: function open() {\n ttEach(this, function(t) {\n t.open();\n });\n return this;\n },\n close: function close() {\n ttEach(this, function(t) {\n t.close();\n });\n return this;\n },\n select: function select(el) {\n var success = false, $el = $(el);\n ttEach(this.first(), function(t) {\n success = t.select($el);\n });\n return success;\n },\n autocomplete: function autocomplete(el) {\n var success = false, $el = $(el);\n ttEach(this.first(), function(t) {\n success = t.autocomplete($el);\n });\n return success;\n },\n moveCursor: function moveCursoe(delta) {\n var success = false;\n ttEach(this.first(), function(t) {\n success = t.moveCursor(delta);\n });\n return success;\n },\n val: function val(newVal) {\n var query;\n if (!arguments.length) {\n ttEach(this.first(), function(t) {\n query = t.getVal();\n });\n return query;\n } else {\n ttEach(this, function(t) {\n t.setVal(newVal);\n });\n return this;\n }\n },\n destroy: function destroy() {\n ttEach(this, function(typeahead, $input) {\n revert($input);\n typeahead.destroy();\n });\n return this;\n }\n };\n $.fn.typeahead = function(method) {\n if (methods[method]) {\n return methods[method].apply(this, [].slice.call(arguments, 1));\n } else {\n return methods.initialize.apply(this, arguments);\n }\n };\n $.fn.typeahead.noConflict = function noConflict() {\n $.fn.typeahead = old;\n return this;\n };\n function ttEach($els, fn) {\n $els.each(function() {\n var $input = $(this), typeahead;\n (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input);\n });\n }\n function buildHintFromInput($input, www) {\n return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop(\"readonly\", true).removeAttr(\"id name placeholder required\").attr({\n autocomplete: \"off\",\n spellcheck: \"false\",\n tabindex: -1\n });\n }\n function prepInput($input, www) {\n $input.data(keys.attrs, {\n dir: $input.attr(\"dir\"),\n autocomplete: $input.attr(\"autocomplete\"),\n spellcheck: $input.attr(\"spellcheck\"),\n style: $input.attr(\"style\")\n });\n $input.addClass(www.classes.input).attr({\n autocomplete: \"off\",\n spellcheck: false\n });\n try {\n !$input.attr(\"dir\") && $input.attr(\"dir\", \"auto\");\n } catch (e) {}\n return $input;\n }\n function getBackgroundStyles($el) {\n return {\n backgroundAttachment: $el.css(\"background-attachment\"),\n backgroundClip: $el.css(\"background-clip\"),\n backgroundColor: $el.css(\"background-color\"),\n backgroundImage: $el.css(\"background-image\"),\n backgroundOrigin: $el.css(\"background-origin\"),\n backgroundPosition: $el.css(\"background-position\"),\n backgroundRepeat: $el.css(\"background-repeat\"),\n backgroundSize: $el.css(\"background-size\")\n };\n }\n function revert($input) {\n var www, $wrapper;\n www = $input.data(keys.www);\n $wrapper = $input.parent().filter(www.selectors.wrapper);\n _.each($input.data(keys.attrs), function(val, key) {\n _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);\n });\n $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);\n if ($wrapper.length) {\n $input.detach().insertAfter($wrapper);\n $wrapper.remove();\n }\n }\n function $elOrNull(obj) {\n var isValid, $el;\n isValid = _.isJQuery(obj) || _.isElement(obj);\n $el = isValid ? $(obj).first() : [];\n return $el.length ? $el : null;\n }\n })();\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/plugins/typeahead.bundle.js\n ** module id = 83\n ** module chunks = 13\n **/"],"sourceRoot":""}