From b6be2b94ad3b47678a2de8f37a7cd571a95e8c4d Mon Sep 17 00:00:00 2001 From: Benjamin Attal Date: Wed, 14 May 2014 17:31:26 -0400 Subject: [PATCH 01/45] Search results are now code blocks. Used pygments to parse a block of code into html, and used html styles to highlight the text. --- static/font/Inconsolata.otf | Bin 0 -> 58560 bytes static/js/index.js | 9 ++++----- static/sass/index.sass | 8 +++++++- templates/index.html | 5 +++-- 4 files changed, 14 insertions(+), 8 deletions(-) create mode 100755 static/font/Inconsolata.otf diff --git a/static/font/Inconsolata.otf b/static/font/Inconsolata.otf new file mode 100755 index 0000000000000000000000000000000000000000..e7e1fa0cd74847ceaa92fd3c9b4bfc75f329155e GIT binary patch literal 58560 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 +
bit
- +
From b1ff9436e3c1bdc62e428610ed21902e275da213 Mon Sep 17 00:00:00 2001 From: Benjamin Attal Date: Wed, 14 May 2014 20:48:09 -0400 Subject: [PATCH 02/45] Preliminary search result design. Must add other features to the result including meta info (title, author, etc.) --- static/js/index.js | 27 +++++++++++++++++++++---- static/sass/index.sass | 55 +++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 73 insertions(+), 9 deletions(-) diff --git a/static/js/index.js b/static/js/index.js index 4b22d11..f22ca5e 100644 --- a/static/js/index.js +++ b/static/js/index.js @@ -9,12 +9,13 @@ resultsDiv = $("div#results")[0]; var typingTimer, lastValue; //Obtained by parsing python file with pygments -var codeExample = '
"""\nModule to contain all the project's Flask server plumbing.\n"""\n\nfrom flask import Flask\nfrom flask import render_template, session\n\nfrom bitshift import assets\n# from bitshift.database import Database\n# from bitshift.query import parse_query\n\napp = Flask(__name__)\napp.config.from_object("bitshift.config")\n\napp_env = app.jinja_env\napp_env.line_statement_prefix = "="\napp_env.globals.update(assets=assets)\n\n# database = Database()\n\n@app.route("/")\ndef index():\n    return render_template("index.html")\n\n@app.route("/search/<query>")\ndef search(query):\n    # tree = parse_query(query)\n    # database.search(tree)\n    pass\n\n@app.route("/about")\ndef about():\n    return render_template("about.html")\n\n@app.route("/developers")\ndef developers():\n    return render_template("developers.html")\n\nif __name__ == "__main__":\n    app.run(debug=True)\n
\n' +var codeExample = '
 1\n 2\n 3\n 4\n 5\n 6\n 7\n 8\n 9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40
"""\nModule to contain all the project's Flask server plumbing.\n"""\n\nfrom flask import Flask\nfrom flask import render_template, session\n\nfrom bitshift import assets\n# from bitshift.database import Database\n# from bitshift.query import parse_query\n\napp = Flask(__name__)\napp.config.from_object("bitshift.config")\n\napp_env = app.jinja_env\napp_env.line_statement_prefix = "="\napp_env.globals.update(assets=assets)\n\n# database = Database()\n\n@app.route("/")\ndef index():\n    return render_template("index.html")\n\n@app.route("/search/<query>")\ndef search(query):\n    # tree = parse_query(query)\n    # database.search(tree)\n    pass\n\n@app.route("/about")\ndef about():\n    return render_template("about.html")\n\n@app.route("/developers")\ndef developers():\n    return render_template("developers.html")\n\nif __name__ == "__main__":\n    app.run(debug=True)\n
\n
' searchBar.onkeyup = typingTimer; // Enable infinite scrolling down the results page. $(window).scroll(function() { - if($(window).scrollTop() + $(window).height() == $(document).height()){ + var searchField = $("div#search-field"); + if($(window).scrollTop() + $(window).height() == $(document).height() && searchField.hasClass('partly-visible')){ loadMoreResults(); } }); @@ -102,9 +103,27 @@ function populateResults(){ function queryServer(){ var resultDivs = [] for(var result = 0; result < 20; result++){ - var newDiv = document.createElement("div"); + var newDiv = document.createElement("div"), + table = document.createElement("table"), + row = document.createElement("tr"), + sidebar = document.createElement("td"), + codeElt = document.createElement("td"), + meta = document.createElement("td"); + newDiv.classList.add("result"); - newDiv.innerHTML = codeExample; + sidebar.id = 'sidebar'; + codeElt.id = 'code'; + meta.id = 'meta'; + + sidebar.innerHTML = ''; + codeElt.innerHTML = '
' + codeExample + '
'; + + row.appendChild(sidebar); + row.appendChild(codeElt); + row.appendChild(meta); + table.appendChild(row); + newDiv.appendChild(table); + resultDivs.push(newDiv); } diff --git a/static/sass/index.sass b/static/sass/index.sass index 97cf6da..3bbd21f 100644 --- a/static/sass/index.sass +++ b/static/sass/index.sass @@ -103,11 +103,56 @@ div#results width: 80% div.result - background-color: none - font-family: Arial, "Inconsolata" - margin-bottom: 10% - margin-top: 1% - padding: 1% + width: 60% + height: 200px + font-family: Menlo, Monaco, "Inconsolata" + margin-top: 3% + + table + border-collapse: collapse + border: 1px solid #ccc + height: inherit + + tr + height: inherit + + #sidebar + width: 15% + background-color: #eee + border-right: 1px solid #ccc + height: inherit + + #code + width: 50% + height: inherit + border-right: 1px solid #ccc + + #tablecontainer + overflow: scroll + width: 100% + height: inherit + + table + table-layout:fixed + border-collapse: collapse + border: none + background-color: #49483e + + pre + margin: 0 + + .linenodiv + padding-left: 5px + padding-right: 5px + color: white + + .hll + border-left: 1px solid #666 + padding: 3% + overflow: scroll + + #meta + width: 35% &.cascade @extend .t3 From 4a8dcc8b2061aec39f6ca2ce6998eafd19f775d6 Mon Sep 17 00:00:00 2001 From: Benjamin Attal Date: Wed, 14 May 2014 23:25:17 -0400 Subject: [PATCH 03/45] Minor style changes to search results. --- static/sass/index.sass | 35 +++++++++++++---------------------- static/sass/main.sass | 4 +--- 2 files changed, 14 insertions(+), 25 deletions(-) diff --git a/static/sass/index.sass b/static/sass/index.sass index 3bbd21f..3738f0b 100644 --- a/static/sass/index.sass +++ b/static/sass/index.sass @@ -5,9 +5,10 @@ @import mixins @import variables -@font-face - font-family: "Inconsolata" - src: url("../../Inconsolata.otf") format("opentype") +$resultWidth: 830px +$sidebarWidth: 30px +$codeWidth: 500px +$metaWidth: 300px div#search-field @extend .t2 @@ -103,9 +104,8 @@ div#results width: 80% div.result - width: 60% + width: $resultWidth height: 200px - font-family: Menlo, Monaco, "Inconsolata" margin-top: 3% table @@ -116,14 +116,17 @@ div#results tr height: inherit + td + overflow: scroll + #sidebar - width: 15% + width: $sidebarWidth background-color: #eee border-right: 1px solid #ccc height: inherit #code - width: 50% + width: $codeWidth height: inherit border-right: 1px solid #ccc @@ -131,28 +134,16 @@ div#results overflow: scroll width: 100% height: inherit + background-color: #49483e table table-layout:fixed border-collapse: collapse border: none - background-color: #49483e - - pre - margin: 0 - - .linenodiv - padding-left: 5px - padding-right: 5px - color: white - - .hll - border-left: 1px solid #666 - padding: 3% - overflow: scroll + font-family: monospace #meta - width: 35% + width: $metaWidth &.cascade @extend .t3 diff --git a/static/sass/main.sass b/static/sass/main.sass index 3a2ab37..c3f3e9c 100644 --- a/static/sass/main.sass +++ b/static/sass/main.sass @@ -9,9 +9,7 @@ html, body height: 100% margin: 0 padding: 0 - - * - font-family: sans-serif + font-family: sans-serif div#container min-height: 100% From 53a1d229ff8e6028feb52736842f0eed1b97f3d7 Mon Sep 17 00:00:00 2001 From: Benjamin Attal Date: Sun, 18 May 2014 22:49:34 -0400 Subject: [PATCH 04/45] Add extra information to search results. Add function for creating search results from codelets. --- static/js/index.js | 128 +++++++++++++++++++++++++++++++++++++++++-------- static/sass/index.sass | 56 +++++++++++++++++++--- 2 files changed, 157 insertions(+), 27 deletions(-) diff --git a/static/js/index.js b/static/js/index.js index f22ca5e..b8b0ad4 100644 --- a/static/js/index.js +++ b/static/js/index.js @@ -12,6 +12,25 @@ var typingTimer, lastValue; var codeExample = '
 1\n 2\n 3\n 4\n 5\n 6\n 7\n 8\n 9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40
"""\nModule to contain all the project's Flask server plumbing.\n"""\n\nfrom flask import Flask\nfrom flask import render_template, session\n\nfrom bitshift import assets\n# from bitshift.database import Database\n# from bitshift.query import parse_query\n\napp = Flask(__name__)\napp.config.from_object("bitshift.config")\n\napp_env = app.jinja_env\napp_env.line_statement_prefix = "="\napp_env.globals.update(assets=assets)\n\n# database = Database()\n\n@app.route("/")\ndef index():\n    return render_template("index.html")\n\n@app.route("/search/<query>")\ndef search(query):\n    # tree = parse_query(query)\n    # database.search(tree)\n    pass\n\n@app.route("/about")\ndef about():\n    return render_template("about.html")\n\n@app.route("/developers")\ndef developers():\n    return render_template("developers.html")\n\nif __name__ == "__main__":\n    app.run(debug=True)\n
\n
' searchBar.onkeyup = typingTimer; +var testCodelet = { + 'code_url': 'https://github.com/earwig/bitshift/blob/develop/app.py', + 'filename': 'app.py', + 'language': 'Python', + 'date_created': 'May 10, 2014', + 'date_modified': '2 days ago', + 'symbols': { + 'vars': [ + ['app', [ [12, -1, 12, -1] ], + [ [13, -1, 13, -1], + [15, -1, 15, -1], + [16, -1, 16, -1], + [17, -1, 17, -1] ]] + ] + }, + 'authors': ['sevko', 'earwig'], + 'html_code': codeExample +}; + // Enable infinite scrolling down the results page. $(window).scroll(function() { var searchField = $("div#search-field"); @@ -95,6 +114,93 @@ function populateResults(){ } /* + * Create a result element based upon a codelet instance. + * + * @return {Element} The result element. + */ +function createResult(codelet) { + //Level 1 + var newDiv = document.createElement("div"), + table = document.createElement("table"), + row = document.createElement("tr"); + //Level 2 + var displayInfo = document.createElement("div"), + sidebar = document.createElement("td"), + codeElt = document.createElement("td"), + hiddenInfo = document.createElement("td"); + //Level 3 + var title = document.createElement("span"), + site = document.createElement("span"), + dateModified = document.createElement("span"), + language = document.createElement("span"), + dateCreated = document.createElement("span"), + matches = document.createElement("div"), + authors = document.createElement("div"); + + //Classes and ID's + newDiv.classList.add('result'); + + displayInfo.id = 'display-info'; + sidebar.id = 'sidebar'; + codeElt.id = 'code'; + hiddenInfo.id = 'hidden-info'; + + title.id = 'title'; + site.id = 'site'; + dateModified.id = 'date-modified'; + language.id = 'language'; + dateCreated.id = 'date-created'; + matches.id = 'matches'; + authors.id = 'authors'; + + //Add the bulk of the html + var hostUrl = codelet.code_url.match(/htt(p|ps):\/\/\w+\.\w+/)[0], + hostName = hostUrl.split('://')[1].split('.')[0]; + + title.innerHTML = 'File ' + + codelet.filename + ''; + site.innerHTML = 'on ' + hostName +''; + dateModified.innerHTML = 'Last modified ' + codelet.date_modified; + // Needs to be changed from int to string on the server + language.innerHTML = codelet.language; + dateCreated.innerHTML = 'Created ' + codelet.date_created; + matches.innerHTML = 'Symbol matches: '; + $.each(Object.keys(codelet.symbols), function(i, t) { + $.each(codelet.symbols[t], function(i, s) { + matches.innerHTML += '' + s[0] + ''; + }); + }); + authors.innerHTML = 'Authors: '; + $.each(codelet.authors, function(i, a) { + authors.innerHTML += '' + a + '; '; + }); + + sidebar.innerHTML = ''; + // Needs to be processed on the server + codeElt.innerHTML = '
' + codelet.html_code + '
'; + + //Finish and append elements to parent elements + row.appendChild(sidebar); + row.appendChild(codeElt); + row.appendChild(hiddenInfo); + table.appendChild(row); + + displayInfo.appendChild(title); + displayInfo.appendChild(site); + displayInfo.appendChild(dateModified); + + hiddenInfo.appendChild(dateCreated); + hiddenInfo.appendChild(language); + hiddenInfo.appendChild(matches); + hiddenInfo.appendChild(authors); + + newDiv.appendChild(displayInfo); + newDiv.appendChild(table); + + return newDiv; +} + +/* * AJAX the current query string to the server, and return its response. * * @return {Array} The server's response in the form of `div.result` DOM @@ -103,27 +209,7 @@ function populateResults(){ function queryServer(){ var resultDivs = [] for(var result = 0; result < 20; result++){ - var newDiv = document.createElement("div"), - table = document.createElement("table"), - row = document.createElement("tr"), - sidebar = document.createElement("td"), - codeElt = document.createElement("td"), - meta = document.createElement("td"); - - newDiv.classList.add("result"); - sidebar.id = 'sidebar'; - codeElt.id = 'code'; - meta.id = 'meta'; - - sidebar.innerHTML = ''; - codeElt.innerHTML = '
' + codeExample + '
'; - - row.appendChild(sidebar); - row.appendChild(codeElt); - row.appendChild(meta); - table.appendChild(row); - newDiv.appendChild(table); - + var newDiv = createResult(testCodelet); resultDivs.push(newDiv); } diff --git a/static/sass/index.sass b/static/sass/index.sass index 3738f0b..cb8ba7c 100644 --- a/static/sass/index.sass +++ b/static/sass/index.sass @@ -8,7 +8,7 @@ $resultWidth: 830px $sidebarWidth: 30px $codeWidth: 500px -$metaWidth: 300px +$hiddenInfoWidth: 300px div#search-field @extend .t2 @@ -103,10 +103,32 @@ div#results margin-right: auto width: 80% + /* TODO: + 1) On the side + - add way to cycle through hits in the code.*/ div.result width: $resultWidth height: 200px - margin-top: 3% + margin-top: 2% + margin-bottom: 6% + + #display-info + a + text-decoration: none + + &:hover + color: orange + + #title + margin-right: 50px + + #site + text-transform: capitalize + + #date-modified + font-family: monospace + color: #333 + display: block table border-collapse: collapse @@ -142,10 +164,32 @@ div#results border: none font-family: monospace - #meta - width: $metaWidth + #hidden-info + width: $hiddenInfoWidth + text-align: center + font-size: 1.2em + + #date-created + display: block + + #language + display: inline-block + padding: 3px + @include vendor(border-radius, 3px) + background-color: #eee + font-weight: bold + color: purple + + &:hover + background-color: #ddd + + #matches + span + color: red + + #authors + span + color: red &.cascade @extend .t3 - - margin-bottom: 0% From c8cc7d7ecfd741b55306bafa3a11fd8f96235183 Mon Sep 17 00:00:00 2001 From: Severyn Kozak Date: Wed, 21 May 2014 21:30:15 -0400 Subject: [PATCH 05/45] Fix #23. Slightly index.js refactor. Add: static/js/index.js -Fix #23. -Move callbacks to an function that gets executed on definition, for more aesthetically modular code. Rem: static/js/lib/typeahead.bundle.min.js -Remove the `typeahead` plugin, which is not longer used for autocompletion. --- app.py | 2 +- static/js/index.js | 65 +++++++++++++++++++---------------- static/js/lib/typeahead.bundle.min.js | 7 ---- templates/index.html | 3 +- 4 files changed, 38 insertions(+), 39 deletions(-) delete mode 100644 static/js/lib/typeahead.bundle.min.js diff --git a/app.py b/app.py index 92949bd..303ff87 100644 --- a/app.py +++ b/app.py @@ -21,7 +21,7 @@ app_env.globals.update(assets=assets) @app.route("/") def index(): - return render_template("index.html", typeahead_languages=languages.LANGS) + return render_template("index.html", autocomplete_languages=languages.LANGS) @app.route("/search/") def search(query): diff --git a/static/js/index.js b/static/js/index.js index 13b404c..cc04f9b 100644 --- a/static/js/index.js +++ b/static/js/index.js @@ -5,40 +5,47 @@ var advancedSearchDiv = $("div#advanced-search"); var advancedSearchButton = $("button#advanced-search"); -advancedSearchButton.click(function(){ - var searchField = $("div#search-field"); - if(!advancedSearchDiv.hasClass("visible")){ - searchField.addClass("partly-visible"); - advancedSearchDiv.fadeIn(500).addClass("visible"); - advancedSearchButton.addClass("clicked"); - } - else { - advancedSearchDiv.fadeOut(300).removeClass("visible"); - advancedSearchButton.removeClass("clicked"); - if($("div#results .result").length == 0) - searchField.removeClass("partly-visible"); - } -}); - FINISH_TYPING_INTERVAL = 650; -searchBar = $("form#search-bar input[type='text']")[0]; -resultsDiv = $("div#results")[0]; +var searchBar = $("form#search-bar input[type='text']")[0]; +var resultsDiv = $("div#results")[0]; var typingTimer, lastValue; -searchBar.onkeyup = typingTimer; -// Enable infinite scrolling down the results page. -$(window).scroll(function() { - if($(window).scrollTop() + $(window).height() == $(document).height()){ - loadMoreResults(); - } -}); +/* + * Set all page callbacks. + */ +(function setHomePageCallbabacks(){ + // Enable infinite scrolling down the results page. + $(window).scroll(function(){ + if($(window).scrollTop() + $(window).height() == $(document).height() && + resultsDiv.querySelectorAll(".result").length > 0) + loadMoreResults(); + }); + + // Toggle the advanced-search form's visibility. + advancedSearchButton.click(function(){ + var searchField = $("div#search-field"); + if(!advancedSearchDiv.hasClass("visible")){ + searchField.addClass("partly-visible"); + advancedSearchDiv.fadeIn(500).addClass("visible"); + advancedSearchButton.addClass("clicked"); + } + else { + advancedSearchDiv.fadeOut(300).removeClass("visible"); + advancedSearchButton.removeClass("clicked"); + if($("div#results .result").length == 0) + searchField.removeClass("partly-visible"); + } + }); + + // Enable capturing the `enter` key. + $("form#search-bar").submit(function(event){ + event.preventDefault(); + return false; + }); -// Enable capturing the `enter` key. -$("form#search-bar").submit(function(event){ - event.preventDefault(); - return false; -}); + searchBar.onkeyup = typingTimer; +}()); /* * Clear the existing timer and set a new one the the user types text into the diff --git a/static/js/lib/typeahead.bundle.min.js b/static/js/lib/typeahead.bundle.min.js deleted file mode 100644 index dff8ef5..0000000 --- a/static/js/lib/typeahead.bundle.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * typeahead.js 0.10.2 - * https://github.com/twitter/typeahead.js - * Copyright 2013-2014 Twitter, Inc. and other contributors; Licensed MIT - */ - -!function(a){var b={isMsie:function(){return/(msie|trident)/i.test(navigator.userAgent)?navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2]:!1},isBlankString:function(a){return!a||/^\s*$/.test(a)},escapeRegExChars:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isString:function(a){return"string"==typeof a},isNumber:function(a){return"number"==typeof a},isArray:a.isArray,isFunction:a.isFunction,isObject:a.isPlainObject,isUndefined:function(a){return"undefined"==typeof a},bind:a.proxy,each:function(b,c){function d(a,b){return c(b,a)}a.each(b,d)},map:a.map,filter:a.grep,every:function(b,c){var d=!0;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?void 0:!1}),!!d):d},some:function(b,c){var d=!1;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?!1:void 0}),!!d):d},mixin:a.extend,getUniqueId:function(){var a=0;return function(){return a++}}(),templatify:function(b){function c(){return String(b)}return a.isFunction(b)?b:c},defer:function(a){setTimeout(a,0)},debounce:function(a,b,c){var d,e;return function(){var f,g,h=this,i=arguments;return f=function(){d=null,c||(e=a.apply(h,i))},g=c&&!d,clearTimeout(d),d=setTimeout(f,b),g&&(e=a.apply(h,i)),e}},throttle:function(a,b){var c,d,e,f,g,h;return g=0,h=function(){g=new Date,e=null,f=a.apply(c,d)},function(){var i=new Date,j=b-(i-g);return c=this,d=arguments,0>=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},noop:function(){}},c="0.10.2",d=function(){function a(a){return a.split(/\s+/)}function b(a){return a.split(/\W+/)}function c(a){return function(b){return function(c){return a(c[b])}}}return{nonword:b,whitespace:a,obj:{nonword:c(b),whitespace:c(a)}}}(),e=function(){function a(a){this.maxSize=a||100,this.size=0,this.hash={},this.list=new c}function c(){this.head=this.tail=null}function d(a,b){this.key=a,this.val=b,this.prev=this.next=null}return b.mixin(a.prototype,{set:function(a,b){var c,e=this.list.tail;this.size>=this.maxSize&&(this.list.remove(e),delete this.hash[e.key]),(c=this.hash[a])?(c.val=b,this.list.moveToFront(c)):(c=new d(a,b),this.list.add(c),this.hash[a]=c,this.size++)},get:function(a){var b=this.hash[a];return b?(this.list.moveToFront(b),b.val):void 0}}),b.mixin(c.prototype,{add:function(a){this.head&&(a.next=this.head,this.head.prev=a),this.head=a,this.tail=this.tail||a},remove:function(a){a.prev?a.prev.next=a.next:this.head=a.next,a.next?a.next.prev=a.prev:this.tail=a.prev},moveToFront:function(a){this.remove(a),this.add(a)}}),a}(),f=function(){function a(a){this.prefix=["__",a,"__"].join(""),this.ttlKey="__ttl__",this.keyMatcher=new RegExp("^"+this.prefix)}function c(){return(new Date).getTime()}function d(a){return JSON.stringify(b.isUndefined(a)?null:a)}function e(a){return JSON.parse(a)}var f,g;try{f=window.localStorage,f.setItem("~~~","!"),f.removeItem("~~~")}catch(h){f=null}return g=f&&window.JSON?{_prefix:function(a){return this.prefix+a},_ttlKey:function(a){return this._prefix(a)+this.ttlKey},get:function(a){return this.isExpired(a)&&this.remove(a),e(f.getItem(this._prefix(a)))},set:function(a,e,g){return b.isNumber(g)?f.setItem(this._ttlKey(a),d(c()+g)):f.removeItem(this._ttlKey(a)),f.setItem(this._prefix(a),d(e))},remove:function(a){return f.removeItem(this._ttlKey(a)),f.removeItem(this._prefix(a)),this},clear:function(){var a,b,c=[],d=f.length;for(a=0;d>a;a++)(b=f.key(a)).match(this.keyMatcher)&&c.push(b.replace(this.keyMatcher,""));for(a=c.length;a--;)this.remove(c[a]);return this},isExpired:function(a){var d=e(f.getItem(this._ttlKey(a)));return b.isNumber(d)&&c()>d?!0:!1}}:{get:b.noop,set:b.noop,remove:b.noop,clear:b.noop,isExpired:b.noop},b.mixin(a.prototype,g),a}(),g=function(){function c(b){b=b||{},this._send=b.transport?d(b.transport):a.ajax,this._get=b.rateLimiter?b.rateLimiter(this._get):this._get}function d(c){return function(d,e){function f(a){b.defer(function(){h.resolve(a)})}function g(a){b.defer(function(){h.reject(a)})}var h=a.Deferred();return c(d,e,f,g),h}}var f=0,g={},h=6,i=new e(10);return c.setMaxPendingRequests=function(a){h=a},c.resetCache=function(){i=new e(10)},b.mixin(c.prototype,{_get:function(a,b,c){function d(b){c&&c(null,b),i.set(a,b)}function e(){c&&c(!0)}function j(){f--,delete g[a],l.onDeckRequestArgs&&(l._get.apply(l,l.onDeckRequestArgs),l.onDeckRequestArgs=null)}var k,l=this;(k=g[a])?k.done(d).fail(e):h>f?(f++,g[a]=this._send(a,b).done(d).fail(e).always(j)):this.onDeckRequestArgs=[].slice.call(arguments,0)},get:function(a,c,d){var e;return b.isFunction(c)&&(d=c,c={}),(e=i.get(a))?b.defer(function(){d&&d(null,e)}):this._get(a,c,d),!!e}}),c}(),h=function(){function c(b){b=b||{},b.datumTokenizer&&b.queryTokenizer||a.error("datumTokenizer and queryTokenizer are both required"),this.datumTokenizer=b.datumTokenizer,this.queryTokenizer=b.queryTokenizer,this.reset()}function d(a){return a=b.filter(a,function(a){return!!a}),a=b.map(a,function(a){return a.toLowerCase()})}function e(){return{ids:[],children:{}}}function f(a){for(var b={},c=[],d=0;db[e]?e++:(f.push(a[d]),d++,e++);return f}return b.mixin(c.prototype,{bootstrap:function(a){this.datums=a.datums,this.trie=a.trie},add:function(a){var c=this;a=b.isArray(a)?a:[a],b.each(a,function(a){var f,g;f=c.datums.push(a)-1,g=d(c.datumTokenizer(a)),b.each(g,function(a){var b,d,g;for(b=c.trie,d=a.split("");g=d.shift();)b=b.children[g]||(b.children[g]=e()),b.ids.push(f)})})},get:function(a){var c,e,h=this;return c=d(this.queryTokenizer(a)),b.each(c,function(a){var b,c,d,f;if(e&&0===e.length)return!1;for(b=h.trie,c=a.split("");b&&(d=c.shift());)b=b.children[d];return b&&0===c.length?(f=b.ids.slice(0),void(e=e?g(e,f):f)):(e=[],!1)}),e?b.map(f(e),function(a){return h.datums[a]}):[]},reset:function(){this.datums=[],this.trie=e()},serialize:function(){return{datums:this.datums,trie:this.trie}}}),c}(),i=function(){function d(a){return a.local||null}function e(d){var e,f;return f={url:null,thumbprint:"",ttl:864e5,filter:null,ajax:{}},(e=d.prefetch||null)&&(e=b.isString(e)?{url:e}:e,e=b.mixin(f,e),e.thumbprint=c+e.thumbprint,e.ajax.type=e.ajax.type||"GET",e.ajax.dataType=e.ajax.dataType||"json",!e.url&&a.error("prefetch requires url to be set")),e}function f(c){function d(a){return function(c){return b.debounce(c,a)}}function e(a){return function(c){return b.throttle(c,a)}}var f,g;return g={url:null,wildcard:"%QUERY",replace:null,rateLimitBy:"debounce",rateLimitWait:300,send:null,filter:null,ajax:{}},(f=c.remote||null)&&(f=b.isString(f)?{url:f}:f,f=b.mixin(g,f),f.rateLimiter=/^throttle$/i.test(f.rateLimitBy)?e(f.rateLimitWait):d(f.rateLimitWait),f.ajax.type=f.ajax.type||"GET",f.ajax.dataType=f.ajax.dataType||"json",delete f.rateLimitBy,delete f.rateLimitWait,!f.url&&a.error("remote requires url to be set")),f}return{local:d,prefetch:e,remote:f}}();!function(c){function e(b){b&&(b.local||b.prefetch||b.remote)||a.error("one of local, prefetch, or remote is required"),this.limit=b.limit||5,this.sorter=j(b.sorter),this.dupDetector=b.dupDetector||k,this.local=i.local(b),this.prefetch=i.prefetch(b),this.remote=i.remote(b),this.cacheKey=this.prefetch?this.prefetch.cacheKey||this.prefetch.url:null,this.index=new h({datumTokenizer:b.datumTokenizer,queryTokenizer:b.queryTokenizer}),this.storage=this.cacheKey?new f(this.cacheKey):null}function j(a){function c(b){return b.sort(a)}function d(a){return a}return b.isFunction(a)?c:d}function k(){return!1}var l,m;return l=c.Bloodhound,m={data:"data",protocol:"protocol",thumbprint:"thumbprint"},c.Bloodhound=e,e.noConflict=function(){return c.Bloodhound=l,e},e.tokenizers=d,b.mixin(e.prototype,{_loadPrefetch:function(b){function c(a){f.clear(),f.add(b.filter?b.filter(a):a),f._saveToStorage(f.index.serialize(),b.thumbprint,b.ttl)}var d,e,f=this;return(d=this._readFromStorage(b.thumbprint))?(this.index.bootstrap(d),e=a.Deferred().resolve()):e=a.ajax(b.url,b.ajax).done(c),e},_getFromRemote:function(a,b){function c(a,c){b(a?[]:f.remote.filter?f.remote.filter(c):c)}var d,e,f=this;return a=a||"",e=encodeURIComponent(a),d=this.remote.replace?this.remote.replace(this.remote.url,a):this.remote.url.replace(this.remote.wildcard,e),this.transport.get(d,this.remote.ajax,c)},_saveToStorage:function(a,b,c){this.storage&&(this.storage.set(m.data,a,c),this.storage.set(m.protocol,location.protocol,c),this.storage.set(m.thumbprint,b,c))},_readFromStorage:function(a){var b,c={};return this.storage&&(c.data=this.storage.get(m.data),c.protocol=this.storage.get(m.protocol),c.thumbprint=this.storage.get(m.thumbprint)),b=c.thumbprint!==a||c.protocol!==location.protocol,c.data&&!b?c.data:null},_initialize:function(){function c(){e.add(b.isFunction(f)?f():f)}var d,e=this,f=this.local;return d=this.prefetch?this._loadPrefetch(this.prefetch):a.Deferred().resolve(),f&&d.done(c),this.transport=this.remote?new g(this.remote):null,this.initPromise=d.promise()},initialize:function(a){return!this.initPromise||a?this._initialize():this.initPromise},add:function(a){this.index.add(a)},get:function(a,c){function d(a){var d=f.slice(0);b.each(a,function(a){var c;return c=b.some(d,function(b){return e.dupDetector(a,b)}),!c&&d.push(a),d.length0||!this.transport)&&c&&c(f)},clear:function(){this.index.reset()},clearPrefetchCache:function(){this.storage&&this.storage.clear()},clearRemoteCache:function(){this.transport&&g.resetCache()},ttAdapter:function(){return b.bind(this.get,this)}}),e}(this);var j={wrapper:'',dropdown:'',dataset:'
',suggestions:'',suggestion:'
'},k={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:" 0"}};b.isMsie()&&b.mixin(k.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),b.isMsie()&&b.isMsie()<=7&&b.mixin(k.input,{marginTop:"-1px"});var l=function(){function c(b){b&&b.el||a.error("EventBus initialized without el"),this.$el=a(b.el)}var d="typeahead:";return b.mixin(c.prototype,{trigger:function(a){var b=[].slice.call(arguments,1);this.$el.trigger(d+a,b)}}),c}(),m=function(){function a(a,b,c,d){var e;if(!c)return this;for(b=b.split(i),c=d?h(c,d):c,this._callbacks=this._callbacks||{};e=b.shift();)this._callbacks[e]=this._callbacks[e]||{sync:[],async:[]},this._callbacks[e][a].push(c);return this}function b(b,c,d){return a.call(this,"async",b,c,d)}function c(b,c,d){return a.call(this,"sync",b,c,d)}function d(a){var b;if(!this._callbacks)return this;for(a=a.split(i);b=a.shift();)delete this._callbacks[b];return this}function e(a){var b,c,d,e,g;if(!this._callbacks)return this;for(a=a.split(i),d=[].slice.call(arguments,1);(b=a.shift())&&(c=this._callbacks[b]);)e=f(c.sync,this,[b].concat(d)),g=f(c.async,this,[b].concat(d)),e()&&j(g);return this}function f(a,b,c){function d(){for(var d,e=0;!d&&e