"),c.on("blur.tt",function(a){var e,f,g;e=document.activeElement,f=d.is(e),g=d.has(e).length>0,b.isMsie()&&(f||g)&&(a.preventDefault(),a.stopImmediatePropagation(),b.defer(function(){c.focus()}))}),d.on("mousedown.tt",function(a){a.preventDefault()})},_onSelectableClicked:function(a,b){this.select(b)},_onDatasetCleared:function(){this._updateHint()},_onDatasetRendered:function(a,b,c,d){if(this._updateHint(),this.autoselect){var e=this.selectors.cursor.substr(1);this.menu.$node.find(this.selectors.suggestion).first().addClass(e)}this.eventBus.trigger("render",b,c,d)},_onAsyncRequested:function(a,b,c){this.eventBus.trigger("asyncrequest",c,b)},_onAsyncCanceled:function(a,b,c){this.eventBus.trigger("asynccancel",c,b)},_onAsyncReceived:function(a,b,c){this.eventBus.trigger("asyncreceive",c,b)},_onFocused:function(){this._minLengthMet()&&this.menu.update(this.input.getQuery())},_onBlurred:function(){this.input.hasQueryChangedSinceLastFocus()&&this.eventBus.trigger("change",this.input.getQuery())},_onEnterKeyed:function(a,b){var c;(c=this.menu.getActiveSelectable())?this.select(c)&&(b.preventDefault(),b.stopPropagation()):this.autoselect&&this.select(this.menu.getTopSelectable())&&(b.preventDefault(),b.stopPropagation())},_onTabKeyed:function(a,b){var c;(c=this.menu.getActiveSelectable())?this.select(c)&&b.preventDefault():this.autoselect&&(c=this.menu.getTopSelectable())&&this.autocomplete(c)&&b.preventDefault()},_onEscKeyed:function(){this.close()},_onUpKeyed:function(){this.moveCursor(-1)},_onDownKeyed:function(){this.moveCursor(1)},_onLeftKeyed:function(){"rtl"===this.dir&&this.input.isCursorAtEnd()&&this.autocomplete(this.menu.getActiveSelectable()||this.menu.getTopSelectable())},_onRightKeyed:function(){"ltr"===this.dir&&this.input.isCursorAtEnd()&&this.autocomplete(this.menu.getActiveSelectable()||this.menu.getTopSelectable())},_onQueryChanged:function(a,b){this._minLengthMet(b)?this.menu.update(b):this.menu.empty()},_onWhitespaceChanged:function(){this._updateHint()},_onLangDirChanged:function(a,b){this.dir!==b&&(this.dir=b,this.menu.setLanguageDirection(b))},_openIfActive:function(){this.isActive()&&this.open()},_minLengthMet:function(a){return a=b.isString(a)?a:this.input.getQuery()||"",a.length>=this.minLength},_updateHint:function(){var a,c,d,e,f,h,i;a=this.menu.getTopSelectable(),c=this.menu.getSelectableData(a),d=this.input.getInputValue(),!c||b.isBlankString(d)||this.input.hasOverflow()?this.input.clearHint():(e=g.normalizeQuery(d),f=b.escapeRegExChars(e),h=new RegExp("^(?:"+f+")(.+$)","i"),(i=h.exec(c.val))&&this.input.setHint(d+i[1]))},isEnabled:function(){return this.enabled},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},isActive:function(){return this.active},activate:function(){return!!this.isActive()||!(!this.isEnabled()||this.eventBus.before("active"))&&(this.active=!0,this.eventBus.trigger("active"),!0)},deactivate:function(){return!this.isActive()||!this.eventBus.before("idle")&&(this.active=!1,this.close(),this.eventBus.trigger("idle"),!0)},isOpen:function(){return this.menu.isOpen()},open:function(){return this.isOpen()||this.eventBus.before("open")||(this.input.setAriaExpanded(!0),this.menu.open(),this._updateHint(),this.eventBus.trigger("open")),this.isOpen()},close:function(){return this.isOpen()&&!this.eventBus.before("close")&&(this.input.setAriaExpanded(!1),this.menu.close(),this.input.clearHint(),this.input.resetInputValue(),this.eventBus.trigger("close")),!this.isOpen()},setVal:function(a){this.input.setQuery(b.toStr(a))},getVal:function(){return this.input.getQuery()},select:function(a){var b=this.menu.getSelectableData(a);return!(!b||this.eventBus.before("select",b.obj,b.dataset))&&(this.input.setQuery(b.val,!0),this.eventBus.trigger("select",b.obj,b.dataset),this.close(),!0)},autocomplete:function(a){var b,c;return b=this.input.getQuery(),c=this.menu.getSelectableData(a),!(!(c&&b!==c.val)||this.eventBus.before("autocomplete",c.obj,c.dataset))&&(this.input.setQuery(c.val),this.eventBus.trigger("autocomplete",c.obj,c.dataset),!0)},moveCursor:function(a){var b,c,d,e,f,g;return b=this.input.getQuery(),c=this.menu.selectableRelativeToCursor(a),d=this.menu.getSelectableData(c),e=d?d.obj:null,f=d?d.dataset:null,g=c?c.attr("id"):null,this.input.trigger("cursorchange",g),!(this._minLengthMet()&&this.menu.update(b))&&!this.eventBus.before("cursorchange",e,f)&&(this.menu.setCursor(c),d?"string"==typeof d.val&&this.input.setInputValue(d.val):(this.input.resetInputValue(),this._updateHint()),this.eventBus.trigger("cursorchange",e,f),!0)},destroy:function(){this.input.destroy(),this.menu.destroy()}}),c}();!function(){"use strict";function e(b,c){b.each(function(){var b,d=a(this);(b=d.data(q.typeahead))&&c(b,d)})}function f(a,b){return a.clone().addClass(b.classes.hint).removeData().css(b.css.hint).css(m(a)).prop({readonly:!0,required:!1}).removeAttr("id name placeholder").removeClass("required").attr({spellcheck:"false",tabindex:-1})}function h(a,b){a.data(q.attrs,{dir:a.attr("dir"),autocomplete:a.attr("autocomplete"),spellcheck:a.attr("spellcheck"),style:a.attr("style")}),a.addClass(b.classes.input).attr({spellcheck:!1});try{!a.attr("dir")&&a.attr("dir","auto")}catch(a){}return a}function m(a){return{backgroundAttachment:a.css("background-attachment"),backgroundClip:a.css("background-clip"),backgroundColor:a.css("background-color"),backgroundImage:a.css("background-image"),backgroundOrigin:a.css("background-origin"),backgroundPosition:a.css("background-position"),backgroundRepeat:a.css("background-repeat"),backgroundSize:a.css("background-size")}}function n(a){var c,d;c=a.data(q.www),d=a.parent().filter(c.selectors.wrapper),b.each(a.data(q.attrs),function(c,d){b.isUndefined(c)?a.removeAttr(d):a.attr(d,c)}),a.removeData(q.typeahead).removeData(q.www).removeData(q.attr).removeClass(c.classes.input),d.length&&(a.detach().insertAfter(d),d.remove())}function o(c){var d,e;return d=b.isJQuery(c)||b.isElement(c),e=d?a(c).first():[],e.length?e:null}var p,q,r;p=a.fn.typeahead,q={www:"tt-www",attrs:"tt-attrs",typeahead:"tt-typeahead"},r={initialize:function(e,m){function n(){var c,n,r,s,t,u,v,w,x,y,z;b.each(m,function(a){a.highlight=!!e.highlight}),c=a(this),n=a(p.html.wrapper),r=o(e.hint),s=o(e.menu),t=!1!==e.hint&&!r,u=!1!==e.menu&&!s,t&&(r=f(c,p)),u&&(s=a(p.html.menu).css(p.css.menu)),r&&r.val(""),c=h(c,p),(t||u)&&(n.css(p.css.wrapper),c.css(t?p.css.input:p.css.inputWithNoHint),c.wrap(n).parent().prepend(t?r:null).append(u?s:null)),z=u?k:i,v=new d({el:c}),w=new g({hint:r,input:c,menu:s},p),x=new z({node:s,datasets:m},p),new j({$input:c,menu:x}),y=new l({input:w,menu:x,eventBus:v,minLength:e.minLength,autoselect:e.autoselect},p),c.data(q.www,p),c.data(q.typeahead,y)}var p;return m=b.isArray(m)?m:[].slice.call(arguments,1),e=e||{},p=c(e.classNames),this.each(n)},isEnabled:function(){var a;return e(this.first(),function(b){a=b.isEnabled()}),a},enable:function(){return e(this,function(a){a.enable()}),this},disable:function(){return e(this,function(a){a.disable()}),this},isActive:function(){var a;return e(this.first(),function(b){a=b.isActive()}),a},activate:function(){return e(this,function(a){a.activate()}),this},deactivate:function(){return e(this,function(a){a.deactivate()}),this},isOpen:function(){var a;return e(this.first(),function(b){a=b.isOpen()}),a},open:function(){return e(this,function(a){a.open()}),this},close:function(){return e(this,function(a){a.close()}),this},select:function(b){var c=!1,d=a(b);return e(this.first(),function(a){c=a.select(d)}),c},autocomplete:function(b){var c=!1,d=a(b);return e(this.first(),function(a){c=a.autocomplete(d)}),c},moveCursor:function(a){var b=!1;return e(this.first(),function(c){b=c.moveCursor(a)}),b},val:function(a){var c;return arguments.length?(e(this,function(c){c.setVal(b.toStr(a))}),this):(e(this.first(),function(a){c=a.getVal()}),c)},destroy:function(){return e(this,function(a,b){n(b),a.destroy()}),this}},a.fn.typeahead=function(a){return r[a]?r[a].apply(this,[].slice.call(arguments,1)):r.initialize.apply(this,arguments)},a.fn.typeahead.noConflict=function(){return a.fn.typeahead=p,this}}()});
\ No newline at end of file
diff --git a/js/ext/typeahead.min.js b/js/ext/typeahead.min.js
deleted file mode 100644
index 51c61f077..000000000
--- a/js/ext/typeahead.min.js
+++ /dev/null
@@ -1 +0,0 @@
-(function(c){var l="0.9.3";var j={isMsie:function(){var m=/(msie) ([\w.]+)/i.exec(navigator.userAgent);return m?parseInt(m[2],10):false},isBlankString:function(m){return !m||/^\s*$/.test(m)},escapeRegExChars:function(m){return m.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isString:function(m){return typeof m==="string"},isNumber:function(m){return typeof m==="number"},isArray:c.isArray,isFunction:c.isFunction,isObject:c.isPlainObject,isUndefined:function(m){return typeof m==="undefined"},bind:c.proxy,bindAll:function(n){var o;for(var m in n){c.isFunction(o=n[m])&&(n[m]=c.proxy(o,n))}},indexOf:function(n,o){for(var m=0;m
t?true:false}}}else{n={get:j.noop,set:j.noop,remove:j.noop,clear:j.noop,isExpired:j.noop}}j.mixin(p.prototype,n);return p;function o(){return new Date().getTime()}function q(t){return JSON.stringify(j.isUndefined(t)?null:t)}function s(t){return JSON.parse(t)}}();var i=function(){function m(n){j.bindAll(this);n=n||{};this.sizeLimit=n.sizeLimit||10;this.cache={};this.cachedKeysByAge=[]}j.mixin(m.prototype,{get:function(n){return this.cache[n]},set:function(o,p){var n;if(this.cachedKeysByAge.length===this.sizeLimit){n=this.cachedKeysByAge.shift();delete this.cache[n]}this.cache[o]=p;this.cachedKeysByAge.push(o)}});return m}();var d=function(){var n=0,q={},m,s;function t(u){j.bindAll(this);u=j.isString(u)?{url:u}:u;s=s||new i();m=j.isNumber(u.maxParallelRequests)?u.maxParallelRequests:m||6;this.url=u.url;this.wildcard=u.wildcard||"%QUERY";this.filter=u.filter;this.replace=u.replace;this.ajaxSettings={type:"get",cache:u.cache,timeout:u.timeout,dataType:u.dataType||"json",beforeSend:u.beforeSend};this._get=(/^throttle$/i.test(u.rateLimitFn)?j.throttle:j.debounce)(this._get,u.rateLimitWait||300)}j.mixin(t.prototype,{_get:function(w,u){var x=this;if(p()){this._sendRequest(w).done(v)}else{this.onDeckRequestArgs=[].slice.call(arguments,0)}function v(z){var y=x.filter?x.filter(z):z;u&&u(y);s.set(w,z)}},_sendRequest:function(v){var x=this,w=q[v];if(!w){o();w=q[v]=c.ajax(v,this.ajaxSettings).always(u)}return w;function u(){r();q[v]=null;if(x.onDeckRequestArgs){x._get.apply(x,x.onDeckRequestArgs);x.onDeckRequestArgs=null}}},get:function(y,u){var x=this,w=encodeURIComponent(y||""),v,z;u=u||j.noop;v=this.replace?this.replace(this.url,w):this.url.replace(this.wildcard,w);if(z=s.get(v)){j.defer(function(){u(x.filter?x.filter(z):z)})}else{this._get(v,u)}return !!z}});return t;function o(){n++}function r(){n--}function p(){return n"+u[t]+""}}}return q}}();var b=function(){function n(q){var p=this;j.bindAll(this);this.specialKeyCodeMap={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"};this.$hint=c(q.hint);this.$input=c(q.input).on("blur.tt",this._handleBlur).on("focus.tt",this._handleFocus).on("keydown.tt",this._handleSpecialKeyEvent);if(!j.isMsie()){this.$input.on("input.tt",this._compareQueryToInputValue)}else{this.$input.on("keydown.tt keypress.tt cut.tt paste.tt",function(r){if(p.specialKeyCodeMap[r.which||r.keyCode]){return}j.defer(p._compareQueryToInputValue)})}this.query=this.$input.val();this.$overflowHelper=o(this.$input)}j.mixin(n.prototype,k,{_handleFocus:function(){this.trigger("focused")},_handleBlur:function(){this.trigger("blured")},_handleSpecialKeyEvent:function(p){var q=this.specialKeyCodeMap[p.which||p.keyCode];q&&this.trigger(q+"Keyed",p)},_compareQueryToInputValue:function(){var p=this.getInputValue(),r=m(this.query,p),q=r?this.query.length!==p.length:false;if(q){this.trigger("whitespaceChanged",{value:this.query})}else{if(!r){this.trigger("queryChanged",{value:this.query=p})}}},destroy:function(){this.$hint.off(".tt");this.$input.off(".tt");this.$hint=this.$input=this.$overflowHelper=null},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getQuery:function(){return this.query},setQuery:function(p){this.query=p},getInputValue:function(){return this.$input.val()},setInputValue:function(q,p){this.$input.val(q);!p&&this._compareQueryToInputValue()},getHintValue:function(){return this.$hint.val()},setHintValue:function(p){this.$hint.val(p)},getLanguageDirection:function(){return(this.$input.css("direction")||"ltr").toLowerCase()},isOverflow:function(){this.$overflowHelper.text(this.getInputValue());return this.$overflowHelper.width()>this.$input.width()},isCursorAtEnd:function(){var q=this.$input.val().length,r=this.$input[0].selectionStart,p;if(j.isNumber(r)){return r===q}else{if(document.selection){p=document.selection.createRange();p.moveStart("character",-q);return q===p.text.length}}return true}});return n;function o(p){return c(" ").css({position:"absolute",left:"-9999px",visibility:"hidden",whiteSpace:"nowrap",fontFamily:p.css("font-family"),fontSize:p.css("font-size"),fontStyle:p.css("font-style"),fontVariant:p.css("font-variant"),fontWeight:p.css("font-weight"),wordSpacing:p.css("word-spacing"),letterSpacing:p.css("letter-spacing"),textIndent:p.css("text-indent"),textRendering:p.css("text-rendering"),textTransform:p.css("text-transform")}).insertAfter(p)}function m(q,p){q=(q||"").replace(/^\s*/g,"").replace(/\s{2,}/g," ");p=(p||"").replace(/^\s*/g,"").replace(/\s{2,}/g," ");return q===p}}();var f=function(){var o={suggestionsList:' '},n={suggestionsList:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"}};function p(q){j.bindAll(this);this.isOpen=false;this.isEmpty=true;this.isMouseOverDropdown=false;this.$menu=c(q.menu).on("mouseenter.tt",this._handleMouseenter).on("mouseleave.tt",this._handleMouseleave).on("click.tt",".tt-suggestion",this._handleSelection).on("mouseover.tt",".tt-suggestion",this._handleMouseover)}j.mixin(p.prototype,k,{_handleMouseenter:function(){this.isMouseOverDropdown=true},_handleMouseleave:function(){this.isMouseOverDropdown=false},_handleMouseover:function(r){var q=c(r.currentTarget);this._getSuggestions().removeClass("tt-is-under-cursor");q.addClass("tt-is-under-cursor")},_handleSelection:function(r){var q=c(r.currentTarget);this.trigger("suggestionSelected",m(q))},_show:function(){this.$menu.css("display","block")},_hide:function(){this.$menu.hide()},_moveCursor:function(s){var u,r,q,t;if(!this.isVisible()){return}u=this._getSuggestions();r=u.filter(".tt-is-under-cursor");r.removeClass("tt-is-under-cursor");q=u.index(r)+s;q=(q+1)%(u.length+1)-1;if(q===-1){this.trigger("cursorRemoved");return}else{if(q<-1){q=u.length-1}}t=u.eq(q).addClass("tt-is-under-cursor");this._ensureVisibility(t);this.trigger("cursorMoved",m(t))},_getSuggestions:function(){return this.$menu.find(".tt-suggestions > .tt-suggestion")},_ensureVisibility:function(t){var u=this.$menu.height()+parseInt(this.$menu.css("paddingTop"),10)+parseInt(this.$menu.css("paddingBottom"),10),r=this.$menu.scrollTop(),q=t.position().top,s=q+t.outerHeight(true);if(q<0){this.$menu.scrollTop(r+q)}else{if(u .tt-suggestion").removeClass("tt-is-under-cursor");this.trigger("closed")}},open:function(){if(!this.isOpen){this.isOpen=true;!this.isEmpty&&this._show();this.trigger("opened")}},setLanguageDirection:function(q){var r={left:"0",right:"auto"},s={left:"auto",right:" 0"};q==="ltr"?this.$menu.css(r):this.$menu.css(s)},moveCursorUp:function(){this._moveCursor(-1)},moveCursorDown:function(){this._moveCursor(+1)},getSuggestionUnderCursor:function(){var q=this._getSuggestions().filter(".tt-is-under-cursor").first();return q.length>0?m(q):null},getFirstSuggestion:function(){var q=this._getSuggestions().first();return q.length>0?m(q):null},renderSuggestions:function(t,u){var q="tt-dataset-"+t.name,r=' %body
',x,w,y=this.$menu.find("."+q),s,v,z;if(y.length===0){w=c(o.suggestionsList).css(n.suggestionsList);y=c("
").addClass(q).append(t.header).append(w).append(t.footer).appendTo(this.$menu)}if(u.length>0){this.isEmpty=false;this.isOpen&&this._show();s=document.createElement("div");v=document.createDocumentFragment();j.each(u,function(B,A){A.dataset=t.name;x=t.template(A.datum);s.innerHTML=r.replace("%body",x);z=c(s.firstChild).css(n.suggestion).data("suggestion",A);z.children().each(function(){c(this).css(n.suggestionChild)});v.appendChild(z[0])});y.show().find(".tt-suggestions").html(v)}else{this.clearSuggestions(t.name)}this.trigger("suggestionsRendered")},clearSuggestions:function(s){var q=s?this.$menu.find(".tt-dataset-"+s):this.$menu.find('[class^="tt-dataset-"]'),r=q.find(".tt-suggestions");q.hide();r.empty();if(this._getSuggestions().length===0){this.isEmpty=true;this._hide()}}});return p;function m(q){return q.data("suggestion")}}();var h=function(){var q={wrapper:'',hint:' ',dropdown:''},p={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none"},query:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"}};if(j.isMsie()){j.mixin(p.query,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"})}if(j.isMsie()&&j.isMsie()<=7){j.mixin(p.wrapper,{display:"inline",zoom:"1"});j.mixin(p.query,{marginTop:"-1px"})}function n(t){var s,u,r;j.bindAll(this);this.$node=m(t.input);this.datasets=t.datasets;this.dir=null;this.eventBus=t.eventBus;s=this.$node.find(".tt-dropdown-menu");u=this.$node.find(".tt-query");r=this.$node.find(".tt-hint");this.dropdownView=new f({menu:s}).on("suggestionSelected",this._handleSelection).on("cursorMoved",this._clearHint).on("cursorMoved",this._setInputValueToSuggestionUnderCursor).on("cursorRemoved",this._setInputValueToQuery).on("cursorRemoved",this._updateHint).on("suggestionsRendered",this._updateHint).on("opened",this._updateHint).on("closed",this._clearHint).on("opened closed",this._propagateEvent);this.inputView=new b({input:u,hint:r}).on("focused",this._openDropdown).on("blured",this._closeDropdown).on("blured",this._setInputValueToQuery).on("enterKeyed tabKeyed",this._handleSelection).on("queryChanged",this._clearHint).on("queryChanged",this._clearSuggestions).on("queryChanged",this._getSuggestions).on("whitespaceChanged",this._updateHint).on("queryChanged whitespaceChanged",this._openDropdown).on("queryChanged whitespaceChanged",this._setLanguageDirection).on("escKeyed",this._closeDropdown).on("escKeyed",this._setInputValueToQuery).on("tabKeyed upKeyed downKeyed",this._managePreventDefault).on("upKeyed downKeyed",this._moveDropdownCursor).on("upKeyed downKeyed",this._openDropdown).on("tabKeyed leftKeyed rightKeyed",this._autocomplete)}j.mixin(n.prototype,k,{_managePreventDefault:function(u){var t=u.data,v,r,s=false;switch(u.type){case"tabKeyed":v=this.inputView.getHintValue();r=this.inputView.getInputValue();s=v&&v!==r;break;case"upKeyed":case"downKeyed":s=!t.shiftKey&&!t.ctrlKey&&!t.metaKey;break}s&&t.preventDefault()},_setLanguageDirection:function(){var r=this.inputView.getLanguageDirection();if(r!==this.dir){this.dir=r;this.$node.css("direction",r);this.dropdownView.setLanguageDirection(r)}},_updateHint:function(){var u=this.dropdownView.getFirstSuggestion(),t=u?u.value:null,x=this.dropdownView.isVisible(),w=this.inputView.isOverflow(),s,y,z,r,v;if(t&&x&&!w){s=this.inputView.getInputValue();y=s.replace(/\s{2,}/g," ").replace(/^\s+/g,"");z=j.escapeRegExChars(y);r=new RegExp("^(?:"+z+")(.*$)","i");v=r.exec(t);this.inputView.setHintValue(s+(v?v[1]:""))}},_clearHint:function(){this.inputView.setHintValue("")},_clearSuggestions:function(){this.dropdownView.clearSuggestions()},_setInputValueToQuery:function(){this.inputView.setInputValue(this.inputView.getQuery())},_setInputValueToSuggestionUnderCursor:function(s){var r=s.data;this.inputView.setInputValue(r.value,true)},_openDropdown:function(){this.dropdownView.open()},_closeDropdown:function(r){this.dropdownView[r.type==="blured"?"closeUnlessMouseIsOverDropdown":"close"]()},_moveDropdownCursor:function(s){var r=s.data;if(!r.shiftKey&&!r.ctrlKey&&!r.metaKey){this.dropdownView[s.type==="upKeyed"?"moveCursorUp":"moveCursorDown"]()}},_handleSelection:function(t){var s=t.type==="suggestionSelected",r=s?t.data:this.dropdownView.getSuggestionUnderCursor();if(r){this.inputView.setInputValue(r.value);s?this.inputView.focus():t.data.preventDefault();s&&j.isMsie()?j.defer(this.dropdownView.close):this.dropdownView.close();this.eventBus.trigger("selected",r.datum,r.dataset)}},_getSuggestions:function(){var r=this,s=this.inputView.getQuery();if(j.isBlankString(s)){return}j.each(this.datasets,function(t,u){u.getSuggestions(s,function(v){if(s===r.inputView.getQuery()){r.dropdownView.renderSuggestions(u,v)}})})},_autocomplete:function(v){var s,r,u,w,t;if(v.type==="rightKeyed"||v.type==="leftKeyed"){s=this.inputView.isCursorAtEnd();r=this.inputView.getLanguageDirection()==="ltr"?v.type==="leftKeyed":v.type==="rightKeyed";if(!s||r){return}}u=this.inputView.getQuery();w=this.inputView.getHintValue();if(w!==""&&u!==w){t=this.dropdownView.getFirstSuggestion();this.inputView.setInputValue(t.value);this.eventBus.trigger("autocompleted",t.datum,t.dataset)}},_propagateEvent:function(r){this.eventBus.trigger(r.type)},destroy:function(){this.inputView.destroy();this.dropdownView.destroy();o(this.$node);this.$node=null},setQuery:function(r){this.inputView.setQuery(r);this.inputView.setInputValue(r);this._clearHint();this._clearSuggestions();this._getSuggestions()}});return n;function m(r){var t=c(q.wrapper),v=c(q.dropdown),w=c(r),s=c(q.hint);t=t.css(p.wrapper);v=v.css(p.dropdown);s.css(p.hint).css({backgroundAttachment:w.css("background-attachment"),backgroundClip:w.css("background-clip"),backgroundColor:w.css("background-color"),backgroundImage:w.css("background-image"),backgroundOrigin:w.css("background-origin"),backgroundPosition:w.css("background-position"),backgroundRepeat:w.css("background-repeat"),backgroundSize:w.css("background-size")});w.data("ttAttrs",{dir:w.attr("dir"),autocomplete:w.attr("autocomplete"),spellcheck:w.attr("spellcheck"),style:w.attr("style")});w.addClass("tt-query").attr({autocomplete:"off",spellcheck:false}).css(p.query);try{!w.attr("dir")&&w.attr("dir","auto")}catch(u){}return w.wrap(t).parent().prepend(s).append(v)}function o(r){var s=r.find(".tt-query");j.each(s.data("ttAttrs"),function(t,u){j.isUndefined(u)?s.removeAttr(t):s.attr(t,u)});s.detach().removeData("ttAttrs").removeClass("tt-query").insertAfter(r);r.remove()}}();(function(){var n={},o="ttView",m;m={initialize:function(r){var q;r=j.isArray(r)?r:[r];if(r.length===0){c.error("no datasets provided")}q=j.map(r,function(t){var s=n[t.name]?n[t.name]:new a(t);if(t.name){n[t.name]=s}return s});return this.each(p);function p(){var u=c(this),t,s=new e({el:u});t=j.map(q,function(v){return v.initialize()});u.data(o,new h({input:u,eventBus:s=new e({el:u}),datasets:q}));c.when.apply(c,t).always(function(){j.defer(function(){s.trigger("initialized")})})}},destroy:function(){return this.each(p);function p(){var r=c(this),q=r.data(o);if(q){q.destroy();r.removeData(o)}}},setQuery:function(p){return this.each(q);function q(){var r=c(this).data(o);r&&r.setQuery(p)}}};jQuery.fn.typeahead=function(p){if(m[p]){return m[p].apply(this,[].slice.call(arguments,1))}else{return m.initialize.apply(this,arguments)}}})()})(window.jQuery);
diff --git a/js/search.js b/js/search.js
index 37fc0ea16..4e80d2835 100644
--- a/js/search.js
+++ b/js/search.js
@@ -19,13 +19,12 @@
/**
* Adds an item to the backend.
*
- * @param {String} id The item ID. It would help if this was unique.
- * @param {String} name The item name to use as a label.
- * @param {Array} tokens An array of tokens that should match this item.
+ * @param {String} id The item ID. It would help if this was unique.
+ * @param {String} name The item name to use as a label.
+ * @param {String} description Explanatory text for item.
*/
- Backend.prototype.addItem = function (id, name, description, tokens) {
+ Backend.prototype.addItem = function (id, name, description) {
this.elements[id] = {
- tokens: tokens,
id: id,
name: name,
description: description
@@ -42,52 +41,18 @@
var array = [];
$.each(this.elements, function (_, element) {
+ element.methodName = element.name.split('::');
+ if (element.methodName.length > 1) {
+ element.methodName = element.methodName.slice(-1)[0];
+ } else {
+ delete element.methodName;
+ }
array.push(element);
});
- /* This is a rather convoluted sorting function, but the idea is to
- * make the results as useful as possible, since only a few are shown
- * at any one time. In general, we favour shorter names over longer
- * ones, and favour regular functions over methods when sorting
- * functions. Ideally, this would actually sort based on function
- * popularity, but this is a simpler algorithmic approach for now that
- * seems to result in generally useful results. */
- array.sort(function (a, b) {
- var a = a.name;
- var b = b.name;
-
- var aIsMethod = (a.indexOf("::") != -1);
- var bIsMethod = (b.indexOf("::") != -1);
-
- // Methods are always after regular functions.
- if (aIsMethod && !bIsMethod) {
- return 1;
- } else if (bIsMethod && !aIsMethod) {
- return -1;
- }
-
- /* If one function name is the exact prefix of the other, we want
- * to sort the shorter version first (mostly for things like date()
- * versus date_format()). */
- if (a.length > b.length) {
- if (a.indexOf(b) == 0) {
- return 1;
- }
- } else {
- if (b.indexOf(a) == 0) {
- return -1;
- }
- }
-
- // Otherwise, sort normally.
- if (a > b) {
- return 1;
- } else if (a < b) {
- return -1;
- }
-
- return 0;
- });
+ /**
+ * Old pre-sorting has no effect on results sorted by score.
+ */
return array;
};
@@ -143,21 +108,8 @@
* of data this is, and hence which backend this should go
* into. */
if (item[0]) {
- var tokens = [item[0]];
var type = null;
- if (item[0].indexOf("_") != -1) {
- tokens.push(item[0].replace("_", ""));
- }
- if (item[0].indexOf("::") != -1) {
- /* We'll add tokens to make the autocompletion more
- * useful: users can search for method names and can
- * specify that they only want method names by
- * prefixing their search with ::. */
- tokens.push(item[0].split("::")[1]);
- tokens.push("::" + item[0].split("::")[1]);
- }
-
switch(item[2]) {
case "phpdoc:varentry":
type = "variable";
@@ -190,7 +142,7 @@
}
if (type) {
- backends[type].addItem(id, item[0], item[1], tokens);
+ backends[type].addItem(id, item[0], item[1]);
}
}
});
@@ -270,33 +222,74 @@
* @param {Object} backends An array-like object containing backends.
*/
var enableSearchTypeahead = function (backends) {
- var template = "{{ name }} " +
- "{{ description }} ";
+ var header = Hogan.compile(
+ ' {{ label }}' +
+ '{{ count }} ' +
+ '
'
+ );
+ var template = Hogan.compile(
+ '' +
+ '
{{ name }} ' +
+ '{{ description }} ' +
+ ''
+ );
// Build the typeahead options array.
var typeaheadOptions = $.map(backends, function (backend, name) {
- var local = backend instanceof Backend ? backend.toTypeaheadArray() : backend;
+ var fuzzyhound = new FuzzySearch({
+ source: backend.toTypeaheadArray(),
+ token_sep: ' \t.,-_', // treat colon as part of token, ignore tabs (from pasted content)
+ score_test_fused: true,
+ keys: [
+ 'name',
+ 'methodName',
+ 'description'
+ ],
+ thresh_include: 5.0,
+ thresh_relative_to_best: 0.7,
+ bonus_match_start: 0.7,
+ bonus_token_order: 1.0,
+ bonus_position_decay: 0.3,
+ token_query_min_length: 1,
+ token_field_min_length: 2
+ });
return {
+ source: fuzzyhound,
name: name,
- local: backend.toTypeaheadArray(),
- header: ' ' + backend.label + ' ',
limit: options.limit,
- valueKey: "name",
- engine: Hogan,
- template: template
+ display: 'name',
+ templates: {
+ header: function () {
+ return header.render({
+ label: backend.label,
+ count: fuzzyhound.results.length
+ });
+ },
+ suggestion: function (result) {
+ return template.render({
+ name: result.name,
+ description: result.description
+ });
+ }
+ }
};
});
- /* Construct a global that we can use to track the total number of
- * results from each backend. */
- var results = {};
-
// Set up the typeahead and the various listeners we need.
- var searchTypeahead = $(element).typeahead(typeaheadOptions);
+ var searchTypeahead = element.typeahead(
+ {
+ minLength: 1,
+ classNames: {
+ menu: 'tt-dropdown-menu',
+ cursor: 'tt-is-under-cursor'
+ }
+ },
+ typeaheadOptions
+ );
// Delegate click events to result-heading collapsible icons, and trigger the accordion action
- $('.tt-dropdown-menu').delegate('.result-heading .collapsible', 'click', function() {
+ $('.tt-dropdown-menu').delegate('.result-heading .collapsible', 'click', function () {
var el = $(this), suggestions = el.parent().parent().find('.tt-suggestions');
suggestions.stop();
if(!el.hasClass('closed')) {
@@ -310,10 +303,20 @@
});
// If the user has selected an autocomplete item and hits enter, we should take them straight to the page.
- searchTypeahead.on("typeahead:selected", function (_, item) {
- window.location = "/manual/" + options.language + "/" + item.id;
+ searchTypeahead.on("typeahead:select", function (_, item) {
+ window.location = "/manual/" + options.language + "/" + item.id + ".php";
});
+ // Get new parent after initialization
+ var elementParent = element.parent();
+
+ searchTypeahead.on('typeahead:render', function (evt, renderedSuggestions, fetchedAsync, datasetIndex) {
+ // Fix the missing wrapper from typeahead v0.9.3 for UI parity
+ var set = elementParent.find('.tt-dataset-' + datasetIndex);
+ set.children('.tt-suggestions').first().append(set.children('.tt-suggestion'));
+ });
+
+ var lastPattern;
searchTypeahead.on("keyup", (function () {
/* typeahead.js doesn't give us a reliable event for the
* dropdown entries having been updated, so we'll hook into the
@@ -323,41 +326,26 @@
* entered. */
// Precompile the templates we need for the fake entries.
- var moreTemplate = Hogan.compile("» {{ num }} more result{{ plural }} ");
var searchTemplate = Hogan.compile("» Search php.net for {{ pattern }} ");
/* Now we'll return the actual function that should be invoked
* when the user has typed something into the search box after
* typeahead.js has done its thing. */
return function () {
- // Add result totals to each section heading.
- $.each(results, function (name, numResults) {
- var container = $(".tt-dataset-" + name, $(element).parent()),
- resultHeading = container.find('.result-heading'),
- resultCount = container.find('.result-count');
-
- // Does a result count already exist in this resultHeading?
- if(resultCount.length == 0) {
- var results = $("").text(numResults);
- resultHeading.append(results);
- } else {
- resultCount.text(numResults);
- }
-
-
- });
-
// Grab what the user entered.
- var pattern = $(element).val();
+ var pattern = element.val();
+ if (pattern == lastPattern) {
+ return;
+ }
+ lastPattern = pattern;
/* Add a global search option. Note that, as above, the
* link is only displayed if more than 2 characters have
* been entered: this is due to our search functionality
* requiring at least 3 characters in the pattern. */
- $(".tt-dropdown-menu .search", $(element).parent()).remove();
+ var dropdown = elementParent.children('.tt-dropdown-menu');
+ dropdown.children('.search').remove();
if (pattern.length > 2) {
- var dropdown = $(".tt-dropdown-menu", $(element).parent());
-
dropdown.append(searchTemplate.render({
pattern: pattern,
url: "/search.php?pattern=" + encodeURIComponent(pattern)
@@ -370,19 +358,6 @@
};
})());
- /* Override the dataset._getLocalSuggestions() method to grab the
- * number of results each dataset returns when a search occurs. */
- $.each($(element).data().ttView.datasets, function (_, dataset) {
- var originalGetLocal = dataset._getLocalSuggestions;
-
- dataset._getLocalSuggestions = function () {
- var suggestions = originalGetLocal.apply(dataset, arguments);
-
- results[dataset.name] = suggestions.length;
- return suggestions;
- };
- });
-
/* typeahead.js adds another input element as part of its DOM
* manipulation, which breaks the auto-submit functionality we
* previously relied upon for enter keypresses in the input box to
@@ -390,7 +365,7 @@
$(" ").insertAfter(element);
// Fix for a styling issue on the created input element.
- $(".tt-hint", $(element).parent()).addClass("search-query");
+ elementParent.children(".tt-hint").addClass("search-query");
};
// Look for the user's language, then fall back to English.
diff --git a/license/contrib-guidelines-code.php b/license/contrib-guidelines-code.php
index 75b619464..1374f7d08 100644
--- a/license/contrib-guidelines-code.php
+++ b/license/contrib-guidelines-code.php
@@ -38,7 +38,6 @@ site_header("License Information", ["current" => "help"]);
PECL
PEAR
- GTK
$SIDEBAR_DATA]);
diff --git a/mailing-lists.php b/mailing-lists.php
index 41e489bea..4b6dc60e1 100644
--- a/mailing-lists.php
+++ b/mailing-lists.php
@@ -18,8 +18,7 @@ $SIDEBAR_DATA = '
Find the PEAR
- lists , the PECL
- lists , and the PHP-GTK
+ lists and the PECL
lists on their own pages.
@@ -124,13 +123,6 @@ if (isset($_POST['action'])) {
Marc .
-Twitter
-
- The PHP team maintains an official PHP.net account on twitter,
- @official_php , for those
- interested in following news and other announcements from the PHP project.
-
-
Mailing List Posting guidelines
@@ -213,21 +205,6 @@ if (isset($_POST['action'])) {
'This list is for the discussion of PHP database topics',
false, true, true, "php.db",
],
- [
- 'php-i18n', 'Unicode and Internationalization',
- 'Unicode support, Internationalization (i18n) and localization (l10n) issues and features',
- false, true, true, "php.i18n",
- ],
- [
- 'php-evangelism', 'PHP evangelism mailing list',
- 'A list for people interested in promoting PHP and learning good reasons to support PHP in the enterprise',
- true, true, true, "php.evangelism",
- ],
- [
- 'soap', 'PHP SOAP list',
- 'List for the SOAP developers',
- false, false, false, 'php.soap',
- ],
'Non-English language mailing lists',
[
'php-es', 'Spanish PHP Mailing list',
diff --git a/mirroring-troubles.php b/mirroring-troubles.php
index 7e34446f6..b8ed756ca 100644
--- a/mirroring-troubles.php
+++ b/mirroring-troubles.php
@@ -12,13 +12,12 @@ $SIDEBAR_DATA = '
site_header("The PHP mirrors problem and troubleshooting guide", ["current" => "help"]);
?>
-
Common troubles that PHP.net mirrors face
+Common troubles that mirrors of PHP.net face
- Mirroring a PHP.net server requires a few specific settings and
+ Mirroring the PHP.net website requires a few specific settings and
considerations, and this document provides a list of problems with possible
- solutions. The mirror tools check for these problems and automatically
- disable the problematic mirrors. The [? ] link within each
- title may be used to test this mirror.
+ solutions. The [? ] link within each title may be used to
+ test this mirror.
@@ -103,15 +102,6 @@ site_header("The PHP mirrors problem and troubleshooting guide", ["current" => "
AddType application/octet-stream .msi
-
-Slow response time
-
- Although this test is currently a little unfair (it's only based from the
- USA), the response time of the server exceeds five seconds. Please confirm
- the speed of these mirrors and we'll likely adjust the testing procedure.
- This test will be performed from multiple locations in the future.
-
-
Unable to do external searches [? ]
diff --git a/mirroring.php b/mirroring.php
index 0964df8ae..bd9491ff8 100644
--- a/mirroring.php
+++ b/mirroring.php
@@ -8,16 +8,6 @@ $SIDEBAR_DATA = '
mirrors page.
';
-/*
-SVN repository mirroring
-
- If you are interested in using a local copy of our
- SVN repository for yourself, we provide
- svnsync instructions
- separately.
-
-';
-*/
site_header(
'Mirroring The PHP Website',
@@ -32,7 +22,7 @@ site_header(
The PHP project does not have an official mirror program anymore, but you can
- set-up a mirror for your own network or company.
+ set up a mirror for your own network or company.
@@ -80,13 +70,6 @@ site_header(
"--exclude='distributions/**' --exclude='extra/**'".
-
- PHP mirror sites should provide the exact content coming from our servers,
- and must not be altered in any way unless explicitly stated in the mirroring
- guidelines. Failing to do will result in immediate termination and permanent
- expulsion of your participation in the program.
-
-
Add SQLite 3 Support
@@ -154,11 +137,6 @@ site_header(
# Set mirror's preferred language here
SetEnv MIRROR_LANGUAGE "en"
- # The next two lines are only necessary if generating
- # stats (see below), otherwise you should comment them out
- Alias /stats/ /path/to/local/stats/
- SetEnv MIRROR_STATS 1
-
# Apache2 has 'AddHandler type-map var' enabled by default.
# Remove the comment sign on the line below if you have it enabled.
# RemoveHandler var
@@ -198,14 +176,6 @@ site_header(
site should start working.
-Setting Up Local Stats
-
-
- Setting up local stats can be a plus on your mirror. We
- provide some setup
- instructions for that .
-
-
Setup Regular Updates
@@ -228,66 +198,13 @@ site_header(
minutes.
-Sponsor Logo
-
-
- We would like to thank you for providing a mirror, so
- if you would like to display a logo on the mirror site promoting your
- company, you are able to do so by following these steps:
-
-
-
- Create a 120 x 60 pixel sized logo button.
- Copy it to your /www/htdocs/phpweb/backend folder as mirror.gif, mirror.jpg or mirror.png.
- Go visit your mirror URL (e.g. http://foo.php.net/mirror.php) and check if it is there.
-
-
-
- The PHP Group and the Network Infrastructure Manager reserve the
- right to refuse images based on content, but most things should be fine.
-
-
-
- We have chosen a banner size which conforms with the
- Internet
- Advertising Bureau standards .
-
-
-
- And finally, don't forget to put a nice little PHP logo somewhere
- on your hosting company's site if possible. Grab one of the logos
- from the logos download page, and
- link it to your mirror. This shows the community that you are a
- proud supporter of PHP and open source technology.
-
-
Mirror Setup Troubleshooting
The mirror troubleshooting guide
contains information about the common and potential problems discovered
- when setting up and maintaining a PHP.net mirror. Included are links that
- perform many of the tests executed by the automated mirror management tools.
-
-
-
- There is a mailing list named "php-mirrors" at
- lists.php.net, to which you can subscribe.
- This mailing list is very low-traffic and only used for communication
- between mirror maintainers and php.net webmasters.
-
-
- To subscribe send an empty message
- to: php-mirrors-subscribe@lists.php.net
-
-
-
-
- Thank you for your interest in providing a mirror! If you ever have any
- questions or concerns, drop us a line at
- php-mirrors@lists.php.net
- --- we are here to help!
-
+ when setting up and maintaining a mirror of PHP.net. Included are links that
+ can help demonstrate common configuration problems.
diff --git a/releases/8_2_22.php b/releases/8_2_22.php
new file mode 100644
index 000000000..55fe48d17
--- /dev/null
+++ b/releases/8_2_22.php
@@ -0,0 +1,16 @@
+
+PHP 8.2.22 Release Announcement
+
+The PHP development team announces the immediate availability of PHP 8.2.22. This is a bug fix release.
+
+All PHP 8.2 users are encouraged to upgrade to this version.
+
+For source downloads of PHP 8.2.22 please visit our downloads page ,
+Windows source and binaries can be found on windows.php.net/download/ .
+The list of changes is recorded in the ChangeLog .
+
+
+PHP 8.3.10 Release Announcement
+
+The PHP development team announces the immediate availability of PHP 8.3.10. This is a bug fix release.
+
+All PHP 8.3 users are encouraged to upgrade to this version.
+
+For source downloads of PHP 8.3.10 please visit our downloads page ,
+Windows source and binaries can be found on windows.php.net/download/ .
+The list of changes is recorded in the ChangeLog .
+
+ "help"]);
and contributors.
-
-
-
- The documentation developmental server is a PHP mirror that contains upcoming
- releases of the PHP documentation before it's pushed out to the mirrors.
- Documentation changes, such as layout, is tested here (with feedback requested)
- before being made official. Documentation is built here four times a day.
-
-
@@ -161,15 +152,6 @@ site_header("A Tourist's Guide", ["current" => "help"]);
i.e. documentation files.
-
-
-
- This web site is the home of the PHP-GTK project, which allows PHP to be
- used to build graphical interfaces, with slick interface and highly
- interactive content. You'll find the downloads and docs here,
- and the latest news from the project.
-
-
@@ -206,7 +188,6 @@ $SIDEBAR = <<Quality Assurance Team
Git Repository
Archived SVN Repository
-PHP-GTK
The PHP Wiki
PHP for Windows
The PHP Developers Profiles
diff --git a/styles/theme-base.css b/styles/theme-base.css
index 97c494b6c..7cbaed7db 100644
--- a/styles/theme-base.css
+++ b/styles/theme-base.css
@@ -1038,6 +1038,8 @@ fieldset {
padding-top: 3px;
margin-top: -3px;
min-width: 100%;
+ overflow: auto;
+ max-height: 90vh;
}
.tt-dropdown-menu .result-heading {
diff --git a/thanks.php b/thanks.php
index d1919665b..3f915a951 100644
--- a/thanks.php
+++ b/thanks.php
@@ -65,73 +65,13 @@ site_header("Thanks", ["current" => "community"]);
-
-
+
+
- pair Networks
+ Deft
- Provides the servers and bandwidth for PEAR, PECL and mailing list services.
-
-
-
-
-
-
-
-
-
- Rackspace
-
- Provides the server and bandwidth for various php.net services.
-
-
-
-
-
-
-
-
-
- Server Central
-
- Provides a box and connection which runs various services and sites for php.net
-
-
-
-
-
-
-
-
-
- Spry VPS Hosting
-
- Provides a server and bandwidth for various php.net services.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- NEXCESS.NET
-
- Provides a server and bandwidth for various php.net services.
+ Provides a server and bandwidth for rsync.php.net.
@@ -155,43 +95,7 @@ site_header("Thanks", ["current" => "community"]);
Duocast
- Provides the servers and bandwidth used for buildbot testing and various windows based servers.
-
-
-
-
-
-
-
-
-
- Redpill Linpro
-
- Provides managed servers and bandwidth for various php.net services.
-
-
-
-
-
-
-
-
-
- Krystal.uk
-
- Provides a server and bandwidth for the ci.qa.php.net build and quality assurance infrastructure.
-
-
-
-
-
-
-
-
-
- ServerGrove
-
- Provides managed servers and bandwidth for various php.net services.
+ Provides the servers and bandwidth used for buildbot testing and various Windows based servers.
@@ -257,6 +161,47 @@ site_header("Thanks", ["current" => "community"]);
by donating a server and resources to enable us to build manuals
and distribute our content via rsync.
+
+
+ Krystal.uk provided a server and
+ bandwidth for the ci.qa.php.net build and quality assurance
+ infrastructure.
+
+
+
+ NEXCESS.NET provided servers and
+ resources for various php.net services.
+
+
+
+ Oregon State University Open Source Lab
+ provided servers and resources for various php.net services.
+
+
+
+ pair Networks
+ provided servers and resources for hosting PEAR, PECL, and the mailing lists.
+
+
+
+ Rackspace provided servers and
+ resources for various php.net services.
+
+
+
+ Redpill Linpro provided servers and
+ resources for various php.net services.
+
+
+
+ ServerGrove provided managed
+ servers and resources for various php.net services.
+
+
+
+ Spry VPS Hosting provided servers
+ and resources for various php.net services.
+
diff --git a/unsub.php b/unsub.php
index 380649488..0e2b1f2d2 100644
--- a/unsub.php
+++ b/unsub.php
@@ -6,8 +6,7 @@ $SIDEBAR_DATA = '
Unsubscribe from the PEAR
- lists , the PECL
- lists , and the PHP-GTK
+ lists and the PECL
lists on their own pages.
';