\").attr(\"id\",t).addClass(\"ui-tabs-panel ui-widget-content ui-corner-bottom\").data(\"ui-tabs-destroy\",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass(\"ui-state-disabled\").attr(\"aria-disabled\",\"true\"):e(i).removeClass(\"ui-state-disabled\").removeAttr(\"aria-disabled\");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(\" \"),function(e,t){i[t]=\"_eventHandler\"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:\"_tabKeydown\"}),this._on(this.panels,{keydown:\"_panelKeydown\"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();\"fill\"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(\":visible\").each(function(){var t=e(this),s=t.css(\"position\");\"absolute\"!==s&&\"fixed\"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css(\"overflow\",\"auto\")):\"auto\"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height(\"\").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest(\"li\"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass(\"ui-state-disabled\")||a.hasClass(\"ui-tabs-loading\")||this.running||o&&!i.collapsible||this._trigger(\"beforeActivate\",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error(\"jQuery UI Tabs: Mismatching fragment identifier.\"),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger(\"activate\",t,i)}function n(){i.newTab.closest(\"li\").addClass(\"ui-tabs-active ui-state-active\"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest(\"li\").removeClass(\"ui-tabs-active ui-state-active\"),n()}):(i.oldTab.closest(\"li\").removeClass(\"ui-tabs-active ui-state-active\"),r.hide(),n()),r.attr(\"aria-hidden\",\"true\"),i.oldTab.attr({\"aria-selected\":\"false\",\"aria-expanded\":\"false\"}),o.length&&r.length?i.oldTab.attr(\"tabIndex\",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr(\"tabIndex\")}).attr(\"tabIndex\",-1),o.attr(\"aria-hidden\",\"false\"),i.newTab.attr({\"aria-selected\":\"true\",\"aria-expanded\":\"true\",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(\".ui-tabs-anchor\")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return\"string\"==typeof e&&(e=this.anchors.index(this.anchors.filter(\"[href$='\"+e+\"']\"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass(\"ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible\"),this.tablist.removeClass(\"ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all\").removeAttr(\"role\"),this.anchors.removeClass(\"ui-tabs-anchor\").removeAttr(\"role\").removeAttr(\"tabIndex\").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,\"ui-tabs-destroy\")?e(this).remove():e(this).removeClass(\"ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel\").removeAttr(\"tabIndex\").removeAttr(\"aria-live\").removeAttr(\"aria-busy\").removeAttr(\"aria-selected\").removeAttr(\"aria-labelledby\").removeAttr(\"aria-hidden\").removeAttr(\"aria-expanded\").removeAttr(\"role\")}),this.tabs.each(function(){var t=e(this),i=t.data(\"ui-tabs-aria-controls\");i?t.attr(\"aria-controls\",i).removeData(\"ui-tabs-aria-controls\"):t.removeAttr(\"aria-controls\")}),this.panels.show(),\"content\"!==this.options.heightStyle&&this.panels.css(\"height\",\"\")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(\".ui-tabs-anchor\"),o=this._getPanelForTab(n),r={tab:n,panel:o},h=function(e,t){\"abort\"===t&&s.panels.stop(!1,!0),n.removeClass(\"ui-tabs-loading\"),o.removeAttr(\"aria-busy\"),e===s.xhr&&delete s.xhr};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&\"canceled\"!==this.xhr.statusText&&(n.addClass(\"ui-tabs-loading\"),o.attr(\"aria-busy\",\"true\"),this.xhr.done(function(e,t,n){setTimeout(function(){o.html(e),s._trigger(\"load\",i,r),h(n,t)},1)}).fail(function(e,t){setTimeout(function(){h(e,t)},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr(\"href\"),beforeSend:function(t,a){return n._trigger(\"beforeLoad\",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr(\"aria-controls\");return this.element.find(this._sanitizeSelector(\"#\"+i))}});var o=\"ui-effects-\",r=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=c[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||\"rgba\";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?(\"0,0,0,0\"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o=\"backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor\",r=/^([\\-+])=\\s*(\\d+\\.?\\d*)/,h=[{re:/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,space:\"hsla\",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:\"byte\"},green:{idx:1,type:\"byte\"},blue:{idx:2,type:\"byte\"}}},hsla:{props:{hue:{idx:0,type:\"degrees\"},saturation:{idx:1,type:\"percent\"},lightness:{idx:2,type:\"percent\"}}}},c={\"byte\":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=e(\"
\")[0],f=e.each;p.style.cssText=\"background-color:rgba(1,1,1,.5)\",d.rgba=p.style.backgroundColor.indexOf(\"rgba\")>-1,f(u,function(e,t){t.cache=\"_\"+e,t.props.alpha={idx:3,type:\"percent\",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var c=this,d=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],d=\"array\"),\"string\"===d?this.parse(s(n)||a._default):\"array\"===d?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):\"object\"===d?(n instanceof l?f(u,function(e,t){n[t.cache]&&(c[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!c[a]&&s.to){if(\"alpha\"===e||null==n[e])return;c[a]=s.to(c._rgba)}c[a][t.idx]=i(n[e],t,!0)}),c[a]&&0>e.inArray(null,c[a].slice(0,3))&&(c[a][3]=1,s.from&&(c._rgba=s.from(c[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l(\"transparent\"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=c[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t=\"rgba(\",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t=\"rgb(\"),t+i.join()+\")\"},toHslaString:function(){var t=\"hsla(\",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+\"%\"),e});return 1===i[3]&&(i.pop(),t=\"hsl(\"),t+i.join()+\")\"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),\"#\"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?\"0\"+e:e}).join(\"\")},toString:function(){return 0===this._rgba[3]?\"transparent\":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,c=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=c?l/u:l/(2-u),[Math.round(t)%360,i,c,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),c=\"array\"===r||\"object\"===r?s:arguments,d=this[o].slice();return f(a,function(e,t){var s=c[\"object\"===r?e:t.idx];null==s&&(s=d[t.idx]),d[t.idx]=i(s,t)}),u?(n=l(u(d)),n[o]=d,n):l(d)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h=\"alpha\"===t?this._hsla?\"hsla\":\"rgba\":s,l=this[h](),u=l[i.idx];return\"undefined\"===o?u:(\"function\"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:(\"string\"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*(\"+\"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(\" \");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r=\"\";if(\"transparent\"!==n&&(\"string\"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!d.rgba&&1!==n._rgba[3]){for(o=\"backgroundColor\"===i?t.parentNode:t;(\"\"===r||\"transparent\"===r)&&o&&o.style;)try{r=e.css(o,\"backgroundColor\"),o=o.parentNode}catch(h){}n=n.blend(r&&\"transparent\"!==r?r:\"_default\")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f([\"Top\",\"Right\",\"Bottom\",\"Left\"],function(i,s){t[\"border\"+s+\"Color\"]=e}),t}},a=e.Color.names={aqua:\"#00ffff\",black:\"#000000\",blue:\"#0000ff\",fuchsia:\"#ff00ff\",gray:\"#808080\",green:\"#008000\",lime:\"#00ff00\",maroon:\"#800000\",navy:\"#000080\",olive:\"#808000\",purple:\"#800080\",red:\"#ff0000\",silver:\"#c0c0c0\",teal:\"#008080\",white:\"#ffffff\",yellow:\"#ffff00\",transparent:[null,null,null,0],_default:\"#ffffff\"}}(r),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],\"string\"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)\"string\"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=[\"add\",\"remove\",\"toggle\"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each([\"borderLeftStyle\",\"borderRightStyle\",\"borderBottomStyle\",\"borderTopStyle\"],function(t,i){e.fx.step[i]=function(e){(\"none\"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(r.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr(\"class\")||\"\",l=h.children?o.find(\"*\").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+\"Class\"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr(\"class\",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,\"\")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return\"boolean\"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),(\"number\"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:\"number\"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||\"number\"==typeof t||e.fx.speeds[t]?!0:\"string\"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:\"object\"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:\"1.11.4\",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(o+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(o+t[s]),void 0===i&&(i=\"\"),e.css(t[s],i))},setMode:function(e,t){return\"toggle\"===t&&(t=e.is(\":hidden\")?\"show\":\"hide\"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case\"top\":i=0;break;case\"middle\":i=.5;break;case\"bottom\":i=1;break;default:i=e[0]/t.height}switch(e[1]){case\"left\":s=0;break;case\"center\":s=.5;break;case\"right\":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(\".ui-effects-wrapper\"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),\"float\":t.css(\"float\")},s=e(\"
\").addClass(\"ui-effects-wrapper\").css({fontSize:\"100%\",background:\"transparent\",border:\"none\",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),\"static\"===t.css(\"position\")?(s.css({position:\"relative\"}),t.css({position:\"relative\"})):(e.extend(i,{position:t.css(\"position\"),zIndex:t.css(\"z-index\")}),e.each([\"top\",\"left\",\"bottom\",\"right\"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]=\"auto\")}),t.css({position:\"relative\",top:0,left:0,right:\"auto\",bottom:\"auto\"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(\".ui-effects-wrapper\")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(\":hidden\")?\"hide\"===r:\"show\"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||\"fx\",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode=\"show\",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode=\"hide\",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||\"boolean\"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode=\"toggle\",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each([\"em\",\"px\",\"%\",\"pt\"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each([\"Quad\",\"Cubic\",\"Quart\",\"Quint\",\"Expo\"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing[\"easeIn\"+t]=i,e.easing[\"easeOut\"+t]=function(e){return 1-i(1-e)},e.easing[\"easeInOut\"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||\"toggle\");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.slide=function(t,i){var s,n=e(this),a=[\"position\",\"top\",\"bottom\",\"left\",\"right\",\"width\",\"height\"],o=e.effects.setMode(n,t.mode||\"show\"),r=\"show\"===o,h=t.direction||\"left\",l=\"up\"===h||\"down\"===h?\"top\":\"left\",u=\"up\"===h||\"left\"===h,c={};e.effects.save(n,a),n.show(),s=t.distance||n[\"top\"===l?\"outerHeight\":\"outerWidth\"](!0),e.effects.createWrapper(n).css({overflow:\"hidden\"}),r&&n.css(l,u?isNaN(s)?\"-\"+s:-s:s),c[l]=(r?u?\"+=\":\"-=\":u?\"-=\":\"+=\")+s,n.animate(c,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){\"hide\"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})}});","/*!\r\n* jQuery Cycle2; version: 2.1.5 build: 20140415\r\n* http://jquery.malsup.com/cycle2/\r\n* Copyright (c) 2014 M. Alsup; Dual licensed: MIT/GPL\r\n*/\r\n\r\n/* Cycle2 core engine */\r\n;(function($) {\r\n\"use strict\";\r\n\r\nvar version = '2.1.5';\r\n\r\n$.fn.cycle = function( options ) {\r\n // fix mistakes with the ready state\r\n var o;\r\n if ( this.length === 0 && !$.isReady ) {\r\n o = { s: this.selector, c: this.context };\r\n $.fn.cycle.log('requeuing slideshow (dom not ready)');\r\n $(function() {\r\n $( o.s, o.c ).cycle(options);\r\n });\r\n return this;\r\n }\r\n\r\n return this.each(function() {\r\n var data, opts, shortName, val;\r\n var container = $(this);\r\n var log = $.fn.cycle.log;\r\n\r\n if ( container.data('cycle.opts') )\r\n return; // already initialized\r\n\r\n if ( container.data('cycle-log') === false ||\r\n ( options && options.log === false ) ||\r\n ( opts && opts.log === false) ) {\r\n log = $.noop;\r\n }\r\n\r\n log('--c2 init--');\r\n data = container.data();\r\n for (var p in data) {\r\n // allow props to be accessed sans 'cycle' prefix and log the overrides\r\n if (data.hasOwnProperty(p) && /^cycle[A-Z]+/.test(p) ) {\r\n val = data[p];\r\n shortName = p.match(/^cycle(.*)/)[1].replace(/^[A-Z]/, lowerCase);\r\n log(shortName+':', val, '('+typeof val +')');\r\n data[shortName] = val;\r\n }\r\n }\r\n\r\n opts = $.extend( {}, $.fn.cycle.defaults, data, options || {});\r\n\r\n opts.timeoutId = 0;\r\n opts.paused = opts.paused || false; // #57\r\n opts.container = container;\r\n opts._maxZ = opts.maxZ;\r\n\r\n opts.API = $.extend ( { _container: container }, $.fn.cycle.API );\r\n opts.API.log = log;\r\n opts.API.trigger = function( eventName, args ) {\r\n opts.container.trigger( eventName, args );\r\n return opts.API;\r\n };\r\n\r\n container.data( 'cycle.opts', opts );\r\n container.data( 'cycle.API', opts.API );\r\n\r\n // opportunity for plugins to modify opts and API\r\n opts.API.trigger('cycle-bootstrap', [ opts, opts.API ]);\r\n\r\n opts.API.addInitialSlides();\r\n opts.API.preInitSlideshow();\r\n\r\n if ( opts.slides.length )\r\n opts.API.initSlideshow();\r\n });\r\n};\r\n\r\n$.fn.cycle.API = {\r\n opts: function() {\r\n return this._container.data( 'cycle.opts' );\r\n },\r\n addInitialSlides: function() {\r\n var opts = this.opts();\r\n var slides = opts.slides;\r\n opts.slideCount = 0;\r\n opts.slides = $(); // empty set\r\n\r\n // add slides that already exist\r\n slides = slides.jquery ? slides : opts.container.find( slides );\r\n\r\n if ( opts.random ) {\r\n slides.sort(function() {return Math.random() - 0.5;});\r\n }\r\n\r\n opts.API.add( slides );\r\n },\r\n\r\n preInitSlideshow: function() {\r\n var opts = this.opts();\r\n opts.API.trigger('cycle-pre-initialize', [ opts ]);\r\n var tx = $.fn.cycle.transitions[opts.fx];\r\n if (tx && $.isFunction(tx.preInit))\r\n tx.preInit( opts );\r\n opts._preInitialized = true;\r\n },\r\n\r\n postInitSlideshow: function() {\r\n var opts = this.opts();\r\n opts.API.trigger('cycle-post-initialize', [ opts ]);\r\n var tx = $.fn.cycle.transitions[opts.fx];\r\n if (tx && $.isFunction(tx.postInit))\r\n tx.postInit( opts );\r\n },\r\n\r\n initSlideshow: function() {\r\n var opts = this.opts();\r\n var pauseObj = opts.container;\r\n var slideOpts;\r\n opts.API.calcFirstSlide();\r\n\r\n if ( opts.container.css('position') == 'static' )\r\n opts.container.css('position', 'relative');\r\n\r\n $(opts.slides[opts.currSlide]).css({\r\n opacity: 1,\r\n display: 'block',\r\n visibility: 'visible'\r\n });\r\n opts.API.stackSlides( opts.slides[opts.currSlide], opts.slides[opts.nextSlide], !opts.reverse );\r\n\r\n if ( opts.pauseOnHover ) {\r\n // allow pauseOnHover to specify an element\r\n if ( opts.pauseOnHover !== true )\r\n pauseObj = $( opts.pauseOnHover );\r\n\r\n pauseObj.hover(\r\n function(){ opts.API.pause( true ); },\r\n function(){ opts.API.resume( true ); }\r\n );\r\n }\r\n\r\n // stage initial transition\r\n if ( opts.timeout ) {\r\n slideOpts = opts.API.getSlideOpts( opts.currSlide );\r\n opts.API.queueTransition( slideOpts, slideOpts.timeout + opts.delay );\r\n }\r\n\r\n opts._initialized = true;\r\n opts.API.updateView( true );\r\n opts.API.trigger('cycle-initialized', [ opts ]);\r\n opts.API.postInitSlideshow();\r\n },\r\n\r\n pause: function( hover ) {\r\n var opts = this.opts(),\r\n slideOpts = opts.API.getSlideOpts(),\r\n alreadyPaused = opts.hoverPaused || opts.paused;\r\n\r\n if ( hover )\r\n opts.hoverPaused = true;\r\n else\r\n opts.paused = true;\r\n\r\n if ( ! alreadyPaused ) {\r\n opts.container.addClass('cycle-paused');\r\n opts.API.trigger('cycle-paused', [ opts ]).log('cycle-paused');\r\n\r\n if ( slideOpts.timeout ) {\r\n clearTimeout( opts.timeoutId );\r\n opts.timeoutId = 0;\r\n\r\n // determine how much time is left for the current slide\r\n opts._remainingTimeout -= ( $.now() - opts._lastQueue );\r\n if ( opts._remainingTimeout < 0 || isNaN(opts._remainingTimeout) )\r\n opts._remainingTimeout = undefined;\r\n }\r\n }\r\n },\r\n\r\n resume: function( hover ) {\r\n var opts = this.opts(),\r\n alreadyResumed = !opts.hoverPaused && !opts.paused,\r\n remaining;\r\n\r\n if ( hover )\r\n opts.hoverPaused = false;\r\n else\r\n opts.paused = false;\r\n\r\n\r\n if ( ! alreadyResumed ) {\r\n opts.container.removeClass('cycle-paused');\r\n // #gh-230; if an animation is in progress then don't queue a new transition; it will\r\n // happen naturally\r\n if ( opts.slides.filter(':animated').length === 0 )\r\n opts.API.queueTransition( opts.API.getSlideOpts(), opts._remainingTimeout );\r\n opts.API.trigger('cycle-resumed', [ opts, opts._remainingTimeout ] ).log('cycle-resumed');\r\n }\r\n },\r\n\r\n add: function( slides, prepend ) {\r\n var opts = this.opts();\r\n var oldSlideCount = opts.slideCount;\r\n var startSlideshow = false;\r\n var len;\r\n\r\n if ( $.type(slides) == 'string')\r\n slides = $.trim( slides );\r\n\r\n $( slides ).each(function(i) {\r\n var slideOpts;\r\n var slide = $(this);\r\n\r\n if ( prepend )\r\n opts.container.prepend( slide );\r\n else\r\n opts.container.append( slide );\r\n\r\n opts.slideCount++;\r\n slideOpts = opts.API.buildSlideOpts( slide );\r\n\r\n if ( prepend )\r\n opts.slides = $( slide ).add( opts.slides );\r\n else\r\n opts.slides = opts.slides.add( slide );\r\n\r\n opts.API.initSlide( slideOpts, slide, --opts._maxZ );\r\n\r\n slide.data('cycle.opts', slideOpts);\r\n opts.API.trigger('cycle-slide-added', [ opts, slideOpts, slide ]);\r\n });\r\n\r\n opts.API.updateView( true );\r\n\r\n startSlideshow = opts._preInitialized && (oldSlideCount < 2 && opts.slideCount >= 1);\r\n if ( startSlideshow ) {\r\n if ( !opts._initialized )\r\n opts.API.initSlideshow();\r\n else if ( opts.timeout ) {\r\n len = opts.slides.length;\r\n opts.nextSlide = opts.reverse ? len - 1 : 1;\r\n if ( !opts.timeoutId ) {\r\n opts.API.queueTransition( opts );\r\n }\r\n }\r\n }\r\n },\r\n\r\n calcFirstSlide: function() {\r\n var opts = this.opts();\r\n var firstSlideIndex;\r\n firstSlideIndex = parseInt( opts.startingSlide || 0, 10 );\r\n if (firstSlideIndex >= opts.slides.length || firstSlideIndex < 0)\r\n firstSlideIndex = 0;\r\n\r\n opts.currSlide = firstSlideIndex;\r\n if ( opts.reverse ) {\r\n opts.nextSlide = firstSlideIndex - 1;\r\n if (opts.nextSlide < 0)\r\n opts.nextSlide = opts.slides.length - 1;\r\n }\r\n else {\r\n opts.nextSlide = firstSlideIndex + 1;\r\n if (opts.nextSlide == opts.slides.length)\r\n opts.nextSlide = 0;\r\n }\r\n },\r\n\r\n calcNextSlide: function() {\r\n var opts = this.opts();\r\n var roll;\r\n if ( opts.reverse ) {\r\n roll = (opts.nextSlide - 1) < 0;\r\n opts.nextSlide = roll ? opts.slideCount - 1 : opts.nextSlide-1;\r\n opts.currSlide = roll ? 0 : opts.nextSlide+1;\r\n }\r\n else {\r\n roll = (opts.nextSlide + 1) == opts.slides.length;\r\n opts.nextSlide = roll ? 0 : opts.nextSlide+1;\r\n opts.currSlide = roll ? opts.slides.length-1 : opts.nextSlide-1;\r\n }\r\n },\r\n\r\n calcTx: function( slideOpts, manual ) {\r\n var opts = slideOpts;\r\n var tx;\r\n\r\n if ( opts._tempFx )\r\n tx = $.fn.cycle.transitions[opts._tempFx];\r\n else if ( manual && opts.manualFx )\r\n tx = $.fn.cycle.transitions[opts.manualFx];\r\n\r\n if ( !tx )\r\n tx = $.fn.cycle.transitions[opts.fx];\r\n\r\n opts._tempFx = null;\r\n this.opts()._tempFx = null;\r\n\r\n if (!tx) {\r\n tx = $.fn.cycle.transitions.fade;\r\n opts.API.log('Transition \"' + opts.fx + '\" not found. Using fade.');\r\n }\r\n return tx;\r\n },\r\n\r\n prepareTx: function( manual, fwd ) {\r\n var opts = this.opts();\r\n var after, curr, next, slideOpts, tx;\r\n\r\n if ( opts.slideCount < 2 ) {\r\n opts.timeoutId = 0;\r\n return;\r\n }\r\n if ( manual && ( !opts.busy || opts.manualTrump ) ) {\r\n opts.API.stopTransition();\r\n opts.busy = false;\r\n clearTimeout(opts.timeoutId);\r\n opts.timeoutId = 0;\r\n }\r\n if ( opts.busy )\r\n return;\r\n if ( opts.timeoutId === 0 && !manual )\r\n return;\r\n\r\n curr = opts.slides[opts.currSlide];\r\n next = opts.slides[opts.nextSlide];\r\n slideOpts = opts.API.getSlideOpts( opts.nextSlide );\r\n tx = opts.API.calcTx( slideOpts, manual );\r\n\r\n opts._tx = tx;\r\n\r\n if ( manual && slideOpts.manualSpeed !== undefined )\r\n slideOpts.speed = slideOpts.manualSpeed;\r\n\r\n // if ( opts.nextSlide === opts.currSlide )\r\n // opts.API.calcNextSlide();\r\n\r\n // ensure that:\r\n // 1. advancing to a different slide\r\n // 2. this is either a manual event (prev/next, pager, cmd) or\r\n // a timer event and slideshow is not paused\r\n if ( opts.nextSlide != opts.currSlide &&\r\n (manual || (!opts.paused && !opts.hoverPaused && opts.timeout) )) { // #62\r\n\r\n opts.API.trigger('cycle-before', [ slideOpts, curr, next, fwd ]);\r\n if ( tx.before )\r\n tx.before( slideOpts, curr, next, fwd );\r\n\r\n after = function() {\r\n opts.busy = false;\r\n // #76; bail if slideshow has been destroyed\r\n if (! opts.container.data( 'cycle.opts' ) )\r\n return;\r\n\r\n if (tx.after)\r\n tx.after( slideOpts, curr, next, fwd );\r\n opts.API.trigger('cycle-after', [ slideOpts, curr, next, fwd ]);\r\n opts.API.queueTransition( slideOpts);\r\n opts.API.updateView( true );\r\n };\r\n\r\n opts.busy = true;\r\n if (tx.transition)\r\n tx.transition(slideOpts, curr, next, fwd, after);\r\n else\r\n opts.API.doTransition( slideOpts, curr, next, fwd, after);\r\n\r\n opts.API.calcNextSlide();\r\n opts.API.updateView();\r\n } else {\r\n opts.API.queueTransition( slideOpts );\r\n }\r\n },\r\n\r\n // perform the actual animation\r\n doTransition: function( slideOpts, currEl, nextEl, fwd, callback) {\r\n var opts = slideOpts;\r\n var curr = $(currEl), next = $(nextEl);\r\n var fn = function() {\r\n // make sure animIn has something so that callback doesn't trigger immediately\r\n next.animate(opts.animIn || { opacity: 1}, opts.speed, opts.easeIn || opts.easing, callback);\r\n };\r\n\r\n next.css(opts.cssBefore || {});\r\n curr.animate(opts.animOut || {}, opts.speed, opts.easeOut || opts.easing, function() {\r\n curr.css(opts.cssAfter || {});\r\n if (!opts.sync) {\r\n fn();\r\n }\r\n });\r\n if (opts.sync) {\r\n fn();\r\n }\r\n },\r\n\r\n queueTransition: function( slideOpts, specificTimeout ) {\r\n var opts = this.opts();\r\n var timeout = specificTimeout !== undefined ? specificTimeout : slideOpts.timeout;\r\n if (opts.nextSlide === 0 && --opts.loop === 0) {\r\n opts.API.log('terminating; loop=0');\r\n opts.timeout = 0;\r\n if ( timeout ) {\r\n setTimeout(function() {\r\n opts.API.trigger('cycle-finished', [ opts ]);\r\n }, timeout);\r\n }\r\n else {\r\n opts.API.trigger('cycle-finished', [ opts ]);\r\n }\r\n // reset nextSlide\r\n opts.nextSlide = opts.currSlide;\r\n return;\r\n }\r\n if ( opts.continueAuto !== undefined ) {\r\n if ( opts.continueAuto === false ||\r\n ($.isFunction(opts.continueAuto) && opts.continueAuto() === false )) {\r\n opts.API.log('terminating automatic transitions');\r\n opts.timeout = 0;\r\n if ( opts.timeoutId )\r\n clearTimeout(opts.timeoutId);\r\n return;\r\n }\r\n }\r\n if ( timeout ) {\r\n opts._lastQueue = $.now();\r\n if ( specificTimeout === undefined )\r\n opts._remainingTimeout = slideOpts.timeout;\r\n\r\n if ( !opts.paused && ! opts.hoverPaused ) {\r\n opts.timeoutId = setTimeout(function() {\r\n opts.API.prepareTx( false, !opts.reverse );\r\n }, timeout );\r\n }\r\n }\r\n },\r\n\r\n stopTransition: function() {\r\n var opts = this.opts();\r\n if ( opts.slides.filter(':animated').length ) {\r\n opts.slides.stop(false, true);\r\n opts.API.trigger('cycle-transition-stopped', [ opts ]);\r\n }\r\n\r\n if ( opts._tx && opts._tx.stopTransition )\r\n opts._tx.stopTransition( opts );\r\n },\r\n\r\n // advance slide forward or back\r\n advanceSlide: function( val ) {\r\n var opts = this.opts();\r\n clearTimeout(opts.timeoutId);\r\n opts.timeoutId = 0;\r\n opts.nextSlide = opts.currSlide + val;\r\n\r\n if (opts.nextSlide < 0)\r\n opts.nextSlide = opts.slides.length - 1;\r\n else if (opts.nextSlide >= opts.slides.length)\r\n opts.nextSlide = 0;\r\n\r\n opts.API.prepareTx( true, val >= 0 );\r\n return false;\r\n },\r\n\r\n buildSlideOpts: function( slide ) {\r\n var opts = this.opts();\r\n var val, shortName;\r\n var slideOpts = slide.data() || {};\r\n for (var p in slideOpts) {\r\n // allow props to be accessed sans 'cycle' prefix and log the overrides\r\n if (slideOpts.hasOwnProperty(p) && /^cycle[A-Z]+/.test(p) ) {\r\n val = slideOpts[p];\r\n shortName = p.match(/^cycle(.*)/)[1].replace(/^[A-Z]/, lowerCase);\r\n opts.API.log('['+(opts.slideCount-1)+']', shortName+':', val, '('+typeof val +')');\r\n slideOpts[shortName] = val;\r\n }\r\n }\r\n\r\n slideOpts = $.extend( {}, $.fn.cycle.defaults, opts, slideOpts );\r\n slideOpts.slideNum = opts.slideCount;\r\n\r\n try {\r\n // these props should always be read from the master state object\r\n delete slideOpts.API;\r\n delete slideOpts.slideCount;\r\n delete slideOpts.currSlide;\r\n delete slideOpts.nextSlide;\r\n delete slideOpts.slides;\r\n } catch(e) {\r\n // no op\r\n }\r\n return slideOpts;\r\n },\r\n\r\n getSlideOpts: function( index ) {\r\n var opts = this.opts();\r\n if ( index === undefined )\r\n index = opts.currSlide;\r\n\r\n var slide = opts.slides[index];\r\n var slideOpts = $(slide).data('cycle.opts');\r\n return $.extend( {}, opts, slideOpts );\r\n },\r\n\r\n initSlide: function( slideOpts, slide, suggestedZindex ) {\r\n var opts = this.opts();\r\n slide.css( slideOpts.slideCss || {} );\r\n if ( suggestedZindex > 0 )\r\n slide.css( 'zIndex', suggestedZindex );\r\n\r\n // ensure that speed settings are sane\r\n if ( isNaN( slideOpts.speed ) )\r\n slideOpts.speed = $.fx.speeds[slideOpts.speed] || $.fx.speeds._default;\r\n if ( !slideOpts.sync )\r\n slideOpts.speed = slideOpts.speed / 2;\r\n\r\n slide.addClass( opts.slideClass );\r\n },\r\n\r\n updateView: function( isAfter, isDuring, forceEvent ) {\r\n var opts = this.opts();\r\n if ( !opts._initialized )\r\n return;\r\n var slideOpts = opts.API.getSlideOpts();\r\n var currSlide = opts.slides[ opts.currSlide ];\r\n\r\n if ( ! isAfter && isDuring !== true ) {\r\n opts.API.trigger('cycle-update-view-before', [ opts, slideOpts, currSlide ]);\r\n if ( opts.updateView < 0 )\r\n return;\r\n }\r\n\r\n if ( opts.slideActiveClass ) {\r\n opts.slides.removeClass( opts.slideActiveClass )\r\n .eq( opts.currSlide ).addClass( opts.slideActiveClass );\r\n }\r\n\r\n if ( isAfter && opts.hideNonActive )\r\n opts.slides.filter( ':not(.' + opts.slideActiveClass + ')' ).css('visibility', 'hidden');\r\n\r\n if ( opts.updateView === 0 ) {\r\n setTimeout(function() {\r\n opts.API.trigger('cycle-update-view', [ opts, slideOpts, currSlide, isAfter ]);\r\n }, slideOpts.speed / (opts.sync ? 2 : 1) );\r\n }\r\n\r\n if ( opts.updateView !== 0 )\r\n opts.API.trigger('cycle-update-view', [ opts, slideOpts, currSlide, isAfter ]);\r\n\r\n if ( isAfter )\r\n opts.API.trigger('cycle-update-view-after', [ opts, slideOpts, currSlide ]);\r\n },\r\n\r\n getComponent: function( name ) {\r\n var opts = this.opts();\r\n var selector = opts[name];\r\n if (typeof selector === 'string') {\r\n // if selector is a child, sibling combinator, adjancent selector then use find, otherwise query full dom\r\n return (/^\\s*[\\>|\\+|~]/).test( selector ) ? opts.container.find( selector ) : $( selector );\r\n }\r\n if (selector.jquery)\r\n return selector;\r\n\r\n return $(selector);\r\n },\r\n\r\n stackSlides: function( curr, next, fwd ) {\r\n var opts = this.opts();\r\n if ( !curr ) {\r\n curr = opts.slides[opts.currSlide];\r\n next = opts.slides[opts.nextSlide];\r\n fwd = !opts.reverse;\r\n }\r\n\r\n // reset the zIndex for the common case:\r\n // curr slide on top, next slide beneath, and the rest in order to be shown\r\n $(curr).css('zIndex', opts.maxZ);\r\n\r\n var i;\r\n var z = opts.maxZ - 2;\r\n var len = opts.slideCount;\r\n if (fwd) {\r\n for ( i = opts.currSlide + 1; i < len; i++ )\r\n $( opts.slides[i] ).css( 'zIndex', z-- );\r\n for ( i = 0; i < opts.currSlide; i++ )\r\n $( opts.slides[i] ).css( 'zIndex', z-- );\r\n }\r\n else {\r\n for ( i = opts.currSlide - 1; i >= 0; i-- )\r\n $( opts.slides[i] ).css( 'zIndex', z-- );\r\n for ( i = len - 1; i > opts.currSlide; i-- )\r\n $( opts.slides[i] ).css( 'zIndex', z-- );\r\n }\r\n\r\n $(next).css('zIndex', opts.maxZ - 1);\r\n },\r\n\r\n getSlideIndex: function( el ) {\r\n return this.opts().slides.index( el );\r\n }\r\n\r\n}; // API\r\n\r\n// default logger\r\n$.fn.cycle.log = function log() {\r\n /*global console:true */\r\n if (window.console && console.log)\r\n console.log('[cycle2] ' + Array.prototype.join.call(arguments, ' ') );\r\n};\r\n\r\n$.fn.cycle.version = function() { return 'Cycle2: ' + version; };\r\n\r\n// helper functions\r\n\r\nfunction lowerCase(s) {\r\n return (s || '').toLowerCase();\r\n}\r\n\r\n// expose transition object\r\n$.fn.cycle.transitions = {\r\n custom: {\r\n },\r\n none: {\r\n before: function( opts, curr, next, fwd ) {\r\n opts.API.stackSlides( next, curr, fwd );\r\n opts.cssBefore = { opacity: 1, visibility: 'visible', display: 'block' };\r\n }\r\n },\r\n fade: {\r\n before: function( opts, curr, next, fwd ) {\r\n var css = opts.API.getSlideOpts( opts.nextSlide ).slideCss || {};\r\n opts.API.stackSlides( curr, next, fwd );\r\n opts.cssBefore = $.extend(css, { opacity: 0, visibility: 'visible', display: 'block' });\r\n opts.animIn = { opacity: 1 };\r\n opts.animOut = { opacity: 0 };\r\n }\r\n },\r\n fadeout: {\r\n before: function( opts , curr, next, fwd ) {\r\n var css = opts.API.getSlideOpts( opts.nextSlide ).slideCss || {};\r\n opts.API.stackSlides( curr, next, fwd );\r\n opts.cssBefore = $.extend(css, { opacity: 1, visibility: 'visible', display: 'block' });\r\n opts.animOut = { opacity: 0 };\r\n }\r\n },\r\n scrollHorz: {\r\n before: function( opts, curr, next, fwd ) {\r\n opts.API.stackSlides( curr, next, fwd );\r\n var w = opts.container.css('overflow','hidden').width();\r\n opts.cssBefore = { left: fwd ? w : - w, top: 0, opacity: 1, visibility: 'visible', display: 'block' };\r\n opts.cssAfter = { zIndex: opts._maxZ - 2, left: 0 };\r\n opts.animIn = { left: 0 };\r\n opts.animOut = { left: fwd ? -w : w };\r\n }\r\n }\r\n};\r\n\r\n// @see: http://jquery.malsup.com/cycle2/api\r\n$.fn.cycle.defaults = {\r\n allowWrap: true,\r\n autoSelector: '.cycle-slideshow[data-cycle-auto-init!=false]',\r\n delay: 0,\r\n easing: null,\r\n fx: 'fade',\r\n hideNonActive: true,\r\n loop: 0,\r\n manualFx: undefined,\r\n manualSpeed: undefined,\r\n manualTrump: true,\r\n maxZ: 100,\r\n pauseOnHover: false,\r\n reverse: false,\r\n slideActiveClass: 'cycle-slide-active',\r\n slideClass: 'cycle-slide',\r\n slideCss: { position: 'absolute', top: 0, left: 0 },\r\n slides: '> img',\r\n speed: 500,\r\n startingSlide: 0,\r\n sync: true,\r\n timeout: 4000,\r\n updateView: 0\r\n};\r\n\r\n// automatically find and run slideshows\r\n$(document).ready(function() {\r\n $( $.fn.cycle.defaults.autoSelector ).cycle();\r\n});\r\n\r\n})(jQuery);\r\n\r\n/*! Cycle2 autoheight plugin; Copyright (c) M.Alsup, 2012; version: 20130913 */\r\n(function($) {\r\n\"use strict\";\r\n\r\n$.extend($.fn.cycle.defaults, {\r\n autoHeight: 0, // setting this option to false disables autoHeight logic\r\n autoHeightSpeed: 250,\r\n autoHeightEasing: null\r\n});\r\n\r\n$(document).on( 'cycle-initialized', function( e, opts ) {\r\n var autoHeight = opts.autoHeight;\r\n var t = $.type( autoHeight );\r\n var resizeThrottle = null;\r\n var ratio;\r\n\r\n if ( t !== 'string' && t !== 'number' )\r\n return;\r\n\r\n // bind events\r\n opts.container.on( 'cycle-slide-added cycle-slide-removed', initAutoHeight );\r\n opts.container.on( 'cycle-destroyed', onDestroy );\r\n\r\n if ( autoHeight == 'container' ) {\r\n opts.container.on( 'cycle-before', onBefore );\r\n }\r\n else if ( t === 'string' && /\\d+\\:\\d+/.test( autoHeight ) ) {\r\n // use ratio\r\n ratio = autoHeight.match(/(\\d+)\\:(\\d+)/);\r\n ratio = ratio[1] / ratio[2];\r\n opts._autoHeightRatio = ratio;\r\n }\r\n\r\n // if autoHeight is a number then we don't need to recalculate the sentinel\r\n // index on resize\r\n if ( t !== 'number' ) {\r\n // bind unique resize handler per slideshow (so it can be 'off-ed' in onDestroy)\r\n opts._autoHeightOnResize = function () {\r\n clearTimeout( resizeThrottle );\r\n resizeThrottle = setTimeout( onResize, 50 );\r\n };\r\n\r\n $(window).on( 'resize orientationchange', opts._autoHeightOnResize );\r\n }\r\n\r\n setTimeout( onResize, 30 );\r\n\r\n function onResize() {\r\n initAutoHeight( e, opts );\r\n }\r\n});\r\n\r\nfunction initAutoHeight( e, opts ) {\r\n var clone, height, sentinelIndex;\r\n var autoHeight = opts.autoHeight;\r\n\r\n if ( autoHeight == 'container' ) {\r\n height = $( opts.slides[ opts.currSlide ] ).outerHeight();\r\n opts.container.height( height );\r\n }\r\n else if ( opts._autoHeightRatio ) {\r\n opts.container.height( opts.container.width() / opts._autoHeightRatio );\r\n }\r\n else if ( autoHeight === 'calc' || ( $.type( autoHeight ) == 'number' && autoHeight >= 0 ) ) {\r\n if ( autoHeight === 'calc' )\r\n sentinelIndex = calcSentinelIndex( e, opts );\r\n else if ( autoHeight >= opts.slides.length )\r\n sentinelIndex = 0;\r\n else\r\n sentinelIndex = autoHeight;\r\n\r\n // only recreate sentinel if index is different\r\n if ( sentinelIndex == opts._sentinelIndex )\r\n return;\r\n\r\n opts._sentinelIndex = sentinelIndex;\r\n if ( opts._sentinel )\r\n opts._sentinel.remove();\r\n\r\n // clone existing slide as sentinel\r\n clone = $( opts.slides[ sentinelIndex ].cloneNode(true) );\r\n\r\n // #50; remove special attributes from cloned content\r\n clone.removeAttr( 'id name rel' ).find( '[id],[name],[rel]' ).removeAttr( 'id name rel' );\r\n\r\n clone.css({\r\n position: 'static',\r\n visibility: 'hidden',\r\n display: 'block'\r\n }).prependTo( opts.container ).addClass('cycle-sentinel cycle-slide').removeClass('cycle-slide-active');\r\n clone.find( '*' ).css( 'visibility', 'hidden' );\r\n\r\n opts._sentinel = clone;\r\n }\r\n}\r\n\r\nfunction calcSentinelIndex( e, opts ) {\r\n var index = 0, max = -1;\r\n\r\n // calculate tallest slide index\r\n opts.slides.each(function(i) {\r\n var h = $(this).height();\r\n if ( h > max ) {\r\n max = h;\r\n index = i;\r\n }\r\n });\r\n return index;\r\n}\r\n\r\nfunction onBefore( e, opts, outgoing, incoming, forward ) {\r\n var h = $(incoming).outerHeight();\r\n opts.container.animate( { height: h }, opts.autoHeightSpeed, opts.autoHeightEasing );\r\n}\r\n\r\nfunction onDestroy( e, opts ) {\r\n if ( opts._autoHeightOnResize ) {\r\n $(window).off( 'resize orientationchange', opts._autoHeightOnResize );\r\n opts._autoHeightOnResize = null;\r\n }\r\n opts.container.off( 'cycle-slide-added cycle-slide-removed', initAutoHeight );\r\n opts.container.off( 'cycle-destroyed', onDestroy );\r\n opts.container.off( 'cycle-before', onBefore );\r\n\r\n if ( opts._sentinel ) {\r\n opts._sentinel.remove();\r\n opts._sentinel = null;\r\n }\r\n}\r\n\r\n})(jQuery);\r\n\r\n/*! caption plugin for Cycle2; version: 20130306 */\r\n(function($) {\r\n\"use strict\";\r\n\r\n$.extend($.fn.cycle.defaults, {\r\n caption: '> .cycle-caption',\r\n captionTemplate: '{{slideNum}} / {{slideCount}}',\r\n overlay: '> .cycle-overlay',\r\n overlayTemplate: '
{{title}}
{{desc}}
',\r\n captionModule: 'caption'\r\n});\r\n\r\n$(document).on( 'cycle-update-view', function( e, opts, slideOpts, currSlide ) {\r\n if ( opts.captionModule !== 'caption' )\r\n return;\r\n var el;\r\n $.each(['caption','overlay'], function() {\r\n var name = this;\r\n var template = slideOpts[name+'Template'];\r\n var el = opts.API.getComponent( name );\r\n if( el.length && template ) {\r\n el.html( opts.API.tmpl( template, slideOpts, opts, currSlide ) );\r\n el.show();\r\n }\r\n else {\r\n el.hide();\r\n }\r\n });\r\n});\r\n\r\n$(document).on( 'cycle-destroyed', function( e, opts ) {\r\n var el;\r\n $.each(['caption','overlay'], function() {\r\n var name = this, template = opts[name+'Template'];\r\n if ( opts[name] && template ) {\r\n el = opts.API.getComponent( 'caption' );\r\n el.empty();\r\n }\r\n });\r\n});\r\n\r\n})(jQuery);\r\n\r\n/*! command plugin for Cycle2; version: 20140415 */\r\n(function($) {\r\n\"use strict\";\r\n\r\nvar c2 = $.fn.cycle;\r\n\r\n$.fn.cycle = function( options ) {\r\n var cmd, cmdFn, opts;\r\n var args = $.makeArray( arguments );\r\n\r\n if ( $.type( options ) == 'number' ) {\r\n return this.cycle( 'goto', options );\r\n }\r\n\r\n if ( $.type( options ) == 'string' ) {\r\n return this.each(function() {\r\n var cmdArgs;\r\n cmd = options;\r\n opts = $(this).data('cycle.opts');\r\n\r\n if ( opts === undefined ) {\r\n c2.log('slideshow must be initialized before sending commands; \"' + cmd + '\" ignored');\r\n return;\r\n }\r\n else {\r\n cmd = cmd == 'goto' ? 'jump' : cmd; // issue #3; change 'goto' to 'jump' internally\r\n cmdFn = opts.API[ cmd ];\r\n if ( $.isFunction( cmdFn )) {\r\n cmdArgs = $.makeArray( args );\r\n cmdArgs.shift();\r\n return cmdFn.apply( opts.API, cmdArgs );\r\n }\r\n else {\r\n c2.log( 'unknown command: ', cmd );\r\n }\r\n }\r\n });\r\n }\r\n else {\r\n return c2.apply( this, arguments );\r\n }\r\n};\r\n\r\n// copy props\r\n$.extend( $.fn.cycle, c2 );\r\n\r\n$.extend( c2.API, {\r\n next: function() {\r\n var opts = this.opts();\r\n if ( opts.busy && ! opts.manualTrump )\r\n return;\r\n\r\n var count = opts.reverse ? -1 : 1;\r\n if ( opts.allowWrap === false && ( opts.currSlide + count ) >= opts.slideCount )\r\n return;\r\n\r\n opts.API.advanceSlide( count );\r\n opts.API.trigger('cycle-next', [ opts ]).log('cycle-next');\r\n },\r\n\r\n prev: function() {\r\n var opts = this.opts();\r\n if ( opts.busy && ! opts.manualTrump )\r\n return;\r\n var count = opts.reverse ? 1 : -1;\r\n if ( opts.allowWrap === false && ( opts.currSlide + count ) < 0 )\r\n return;\r\n\r\n opts.API.advanceSlide( count );\r\n opts.API.trigger('cycle-prev', [ opts ]).log('cycle-prev');\r\n },\r\n\r\n destroy: function() {\r\n this.stop(); //#204\r\n\r\n var opts = this.opts();\r\n var clean = $.isFunction( $._data ) ? $._data : $.noop; // hack for #184 and #201\r\n clearTimeout(opts.timeoutId);\r\n opts.timeoutId = 0;\r\n opts.API.stop();\r\n opts.API.trigger( 'cycle-destroyed', [ opts ] ).log('cycle-destroyed');\r\n opts.container.removeData();\r\n clean( opts.container[0], 'parsedAttrs', false );\r\n\r\n // #75; remove inline styles\r\n if ( ! opts.retainStylesOnDestroy ) {\r\n opts.container.removeAttr( 'style' );\r\n opts.slides.removeAttr( 'style' );\r\n opts.slides.removeClass( opts.slideActiveClass );\r\n }\r\n opts.slides.each(function() {\r\n $(this).removeData();\r\n clean( this, 'parsedAttrs', false );\r\n });\r\n },\r\n\r\n jump: function( index, fx ) {\r\n // go to the requested slide\r\n var fwd;\r\n var opts = this.opts();\r\n if ( opts.busy && ! opts.manualTrump )\r\n return;\r\n var num = parseInt( index, 10 );\r\n if (isNaN(num) || num < 0 || num >= opts.slides.length) {\r\n opts.API.log('goto: invalid slide index: ' + num);\r\n return;\r\n }\r\n if (num == opts.currSlide) {\r\n opts.API.log('goto: skipping, already on slide', num);\r\n return;\r\n }\r\n opts.nextSlide = num;\r\n clearTimeout(opts.timeoutId);\r\n opts.timeoutId = 0;\r\n opts.API.log('goto: ', num, ' (zero-index)');\r\n fwd = opts.currSlide < opts.nextSlide;\r\n opts._tempFx = fx;\r\n opts.API.prepareTx( true, fwd );\r\n },\r\n\r\n stop: function() {\r\n var opts = this.opts();\r\n var pauseObj = opts.container;\r\n clearTimeout(opts.timeoutId);\r\n opts.timeoutId = 0;\r\n opts.API.stopTransition();\r\n if ( opts.pauseOnHover ) {\r\n if ( opts.pauseOnHover !== true )\r\n pauseObj = $( opts.pauseOnHover );\r\n pauseObj.off('mouseenter mouseleave');\r\n }\r\n opts.API.trigger('cycle-stopped', [ opts ]).log('cycle-stopped');\r\n },\r\n\r\n reinit: function() {\r\n var opts = this.opts();\r\n opts.API.destroy();\r\n opts.container.cycle();\r\n },\r\n\r\n remove: function( index ) {\r\n var opts = this.opts();\r\n var slide, slideToRemove, slides = [], slideNum = 1;\r\n for ( var i=0; i < opts.slides.length; i++ ) {\r\n slide = opts.slides[i];\r\n if ( i == index ) {\r\n slideToRemove = slide;\r\n }\r\n else {\r\n slides.push( slide );\r\n $( slide ).data('cycle.opts').slideNum = slideNum;\r\n slideNum++;\r\n }\r\n }\r\n if ( slideToRemove ) {\r\n opts.slides = $( slides );\r\n opts.slideCount--;\r\n $( slideToRemove ).remove();\r\n if (index == opts.currSlide)\r\n opts.API.advanceSlide( 1 );\r\n else if ( index < opts.currSlide )\r\n opts.currSlide--;\r\n else\r\n opts.currSlide++;\r\n\r\n opts.API.trigger('cycle-slide-removed', [ opts, index, slideToRemove ]).log('cycle-slide-removed');\r\n opts.API.updateView();\r\n }\r\n }\r\n\r\n});\r\n\r\n// listen for clicks on elements with data-cycle-cmd attribute\r\n$(document).on('click.cycle', '[data-cycle-cmd]', function(e) {\r\n // issue cycle command\r\n e.preventDefault();\r\n var el = $(this);\r\n var command = el.data('cycle-cmd');\r\n var context = el.data('cycle-context') || '.cycle-slideshow';\r\n $(context).cycle(command, el.data('cycle-arg'));\r\n});\r\n\r\n\r\n})(jQuery);\r\n\r\n/*! hash plugin for Cycle2; version: 20130905 */\r\n(function($) {\r\n\"use strict\";\r\n\r\n$(document).on( 'cycle-pre-initialize', function( e, opts ) {\r\n onHashChange( opts, true );\r\n\r\n opts._onHashChange = function() {\r\n onHashChange( opts, false );\r\n };\r\n\r\n $( window ).on( 'hashchange', opts._onHashChange);\r\n});\r\n\r\n$(document).on( 'cycle-update-view', function( e, opts, slideOpts ) {\r\n if ( slideOpts.hash && ( '#' + slideOpts.hash ) != window.location.hash ) {\r\n opts._hashFence = true;\r\n window.location.hash = slideOpts.hash;\r\n }\r\n});\r\n\r\n$(document).on( 'cycle-destroyed', function( e, opts) {\r\n if ( opts._onHashChange ) {\r\n $( window ).off( 'hashchange', opts._onHashChange );\r\n }\r\n});\r\n\r\nfunction onHashChange( opts, setStartingSlide ) {\r\n var hash;\r\n if ( opts._hashFence ) {\r\n opts._hashFence = false;\r\n return;\r\n }\r\n\r\n hash = window.location.hash.substring(1);\r\n\r\n opts.slides.each(function(i) {\r\n if ( $(this).data( 'cycle-hash' ) == hash ) {\r\n if ( setStartingSlide === true ) {\r\n opts.startingSlide = i;\r\n }\r\n else {\r\n var fwd = opts.currSlide < i;\r\n opts.nextSlide = i;\r\n opts.API.prepareTx( true, fwd );\r\n }\r\n return false;\r\n }\r\n });\r\n}\r\n\r\n})(jQuery);\r\n\r\n/*! loader plugin for Cycle2; version: 20131121 */\r\n(function($) {\r\n\"use strict\";\r\n\r\n$.extend($.fn.cycle.defaults, {\r\n loader: false\r\n});\r\n\r\n$(document).on( 'cycle-bootstrap', function( e, opts ) {\r\n var addFn;\r\n\r\n if ( !opts.loader )\r\n return;\r\n\r\n // override API.add for this slideshow\r\n addFn = opts.API.add;\r\n opts.API.add = add;\r\n\r\n function add( slides, prepend ) {\r\n var slideArr = [];\r\n if ( $.type( slides ) == 'string' )\r\n slides = $.trim( slides );\r\n else if ( $.type( slides) === 'array' ) {\r\n for (var i=0; i < slides.length; i++ )\r\n slides[i] = $(slides[i])[0];\r\n }\r\n\r\n slides = $( slides );\r\n var slideCount = slides.length;\r\n\r\n if ( ! slideCount )\r\n return;\r\n\r\n slides.css('visibility','hidden').appendTo('body').each(function(i) { // appendTo fixes #56\r\n var count = 0;\r\n var slide = $(this);\r\n var images = slide.is('img') ? slide : slide.find('img');\r\n slide.data('index', i);\r\n // allow some images to be marked as unimportant (and filter out images w/o src value)\r\n images = images.filter(':not(.cycle-loader-ignore)').filter(':not([src=\"\"])');\r\n if ( ! images.length ) {\r\n --slideCount;\r\n slideArr.push( slide );\r\n return;\r\n }\r\n\r\n count = images.length;\r\n images.each(function() {\r\n // add images that are already loaded\r\n if ( this.complete ) {\r\n imageLoaded();\r\n }\r\n else {\r\n $(this).load(function() {\r\n imageLoaded();\r\n }).on(\"error\", function() {\r\n if ( --count === 0 ) {\r\n // ignore this slide\r\n opts.API.log('slide skipped; img not loaded:', this.src);\r\n if ( --slideCount === 0 && opts.loader == 'wait') {\r\n addFn.apply( opts.API, [ slideArr, prepend ] );\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n function imageLoaded() {\r\n if ( --count === 0 ) {\r\n --slideCount;\r\n addSlide( slide );\r\n }\r\n }\r\n });\r\n\r\n if ( slideCount )\r\n opts.container.addClass('cycle-loading');\r\n\r\n\r\n function addSlide( slide ) {\r\n var curr;\r\n if ( opts.loader == 'wait' ) {\r\n slideArr.push( slide );\r\n if ( slideCount === 0 ) {\r\n // #59; sort slides into original markup order\r\n slideArr.sort( sorter );\r\n addFn.apply( opts.API, [ slideArr, prepend ] );\r\n opts.container.removeClass('cycle-loading');\r\n }\r\n }\r\n else {\r\n curr = $(opts.slides[opts.currSlide]);\r\n addFn.apply( opts.API, [ slide, prepend ] );\r\n curr.show();\r\n opts.container.removeClass('cycle-loading');\r\n }\r\n }\r\n\r\n function sorter(a, b) {\r\n return a.data('index') - b.data('index');\r\n }\r\n }\r\n});\r\n\r\n})(jQuery);\r\n\r\n/*! pager plugin for Cycle2; version: 20140415 */\r\n(function($) {\r\n\"use strict\";\r\n\r\n$.extend($.fn.cycle.defaults, {\r\n pager: '> .cycle-pager',\r\n pagerActiveClass: 'cycle-pager-active',\r\n pagerEvent: 'click.cycle',\r\n pagerEventBubble: undefined,\r\n pagerTemplate: '
•'\r\n});\r\n\r\n$(document).on( 'cycle-bootstrap', function( e, opts, API ) {\r\n // add method to API\r\n API.buildPagerLink = buildPagerLink;\r\n});\r\n\r\n$(document).on( 'cycle-slide-added', function( e, opts, slideOpts, slideAdded ) {\r\n if ( opts.pager ) {\r\n opts.API.buildPagerLink ( opts, slideOpts, slideAdded );\r\n opts.API.page = page;\r\n }\r\n});\r\n\r\n$(document).on( 'cycle-slide-removed', function( e, opts, index, slideRemoved ) {\r\n if ( opts.pager ) {\r\n var pagers = opts.API.getComponent( 'pager' );\r\n pagers.each(function() {\r\n var pager = $(this);\r\n $( pager.children()[index] ).remove();\r\n });\r\n }\r\n});\r\n\r\n$(document).on( 'cycle-update-view', function( e, opts, slideOpts ) {\r\n var pagers;\r\n\r\n if ( opts.pager ) {\r\n pagers = opts.API.getComponent( 'pager' );\r\n pagers.each(function() {\r\n $(this).children().removeClass( opts.pagerActiveClass )\r\n .eq( opts.currSlide ).addClass( opts.pagerActiveClass );\r\n });\r\n }\r\n});\r\n\r\n$(document).on( 'cycle-destroyed', function( e, opts ) {\r\n var pager = opts.API.getComponent( 'pager' );\r\n\r\n if ( pager ) {\r\n pager.children().off( opts.pagerEvent ); // #202\r\n if ( opts.pagerTemplate )\r\n pager.empty();\r\n }\r\n});\r\n\r\nfunction buildPagerLink( opts, slideOpts, slide ) {\r\n var pagerLink;\r\n var pagers = opts.API.getComponent( 'pager' );\r\n pagers.each(function() {\r\n var pager = $(this);\r\n if ( slideOpts.pagerTemplate ) {\r\n var markup = opts.API.tmpl( slideOpts.pagerTemplate, slideOpts, opts, slide[0] );\r\n pagerLink = $( markup ).appendTo( pager );\r\n }\r\n else {\r\n pagerLink = pager.children().eq( opts.slideCount - 1 );\r\n }\r\n pagerLink.on( opts.pagerEvent, function(e) {\r\n if ( ! opts.pagerEventBubble )\r\n e.preventDefault();\r\n opts.API.page( pager, e.currentTarget);\r\n });\r\n });\r\n}\r\n\r\nfunction page( pager, target ) {\r\n /*jshint validthis:true */\r\n var opts = this.opts();\r\n if ( opts.busy && ! opts.manualTrump )\r\n return;\r\n\r\n var index = pager.children().index( target );\r\n var nextSlide = index;\r\n var fwd = opts.currSlide < nextSlide;\r\n if (opts.currSlide == nextSlide) {\r\n return; // no op, clicked pager for the currently displayed slide\r\n }\r\n opts.nextSlide = nextSlide;\r\n opts._tempFx = opts.pagerFx;\r\n opts.API.prepareTx( true, fwd );\r\n opts.API.trigger('cycle-pager-activated', [opts, pager, target ]);\r\n}\r\n\r\n})(jQuery);\r\n\r\n/*! prevnext plugin for Cycle2; version: 20140408 */\r\n(function($) {\r\n\"use strict\";\r\n\r\n$.extend($.fn.cycle.defaults, {\r\n next: '> .cycle-next',\r\n nextEvent: 'click.cycle',\r\n disabledClass: 'disabled',\r\n prev: '> .cycle-prev',\r\n prevEvent: 'click.cycle',\r\n swipe: false\r\n});\r\n\r\n$(document).on( 'cycle-initialized', function( e, opts ) {\r\n opts.API.getComponent( 'next' ).on( opts.nextEvent, function(e) {\r\n e.preventDefault();\r\n opts.API.next();\r\n });\r\n\r\n opts.API.getComponent( 'prev' ).on( opts.prevEvent, function(e) {\r\n e.preventDefault();\r\n opts.API.prev();\r\n });\r\n\r\n if ( opts.swipe ) {\r\n var nextEvent = opts.swipeVert ? 'swipeUp.cycle' : 'swipeLeft.cycle swipeleft.cycle';\r\n var prevEvent = opts.swipeVert ? 'swipeDown.cycle' : 'swipeRight.cycle swiperight.cycle';\r\n opts.container.on( nextEvent, function(e) {\r\n opts._tempFx = opts.swipeFx;\r\n opts.API.next();\r\n });\r\n opts.container.on( prevEvent, function() {\r\n opts._tempFx = opts.swipeFx;\r\n opts.API.prev();\r\n });\r\n }\r\n});\r\n\r\n$(document).on( 'cycle-update-view', function( e, opts, slideOpts, currSlide ) {\r\n if ( opts.allowWrap )\r\n return;\r\n\r\n var cls = opts.disabledClass;\r\n var next = opts.API.getComponent( 'next' );\r\n var prev = opts.API.getComponent( 'prev' );\r\n var prevBoundry = opts._prevBoundry || 0;\r\n var nextBoundry = (opts._nextBoundry !== undefined)?opts._nextBoundry:opts.slideCount - 1;\r\n\r\n if ( opts.currSlide == nextBoundry )\r\n next.addClass( cls ).prop( 'disabled', true );\r\n else\r\n next.removeClass( cls ).prop( 'disabled', false );\r\n\r\n if ( opts.currSlide === prevBoundry )\r\n prev.addClass( cls ).prop( 'disabled', true );\r\n else\r\n prev.removeClass( cls ).prop( 'disabled', false );\r\n});\r\n\r\n\r\n$(document).on( 'cycle-destroyed', function( e, opts ) {\r\n opts.API.getComponent( 'prev' ).off( opts.nextEvent );\r\n opts.API.getComponent( 'next' ).off( opts.prevEvent );\r\n opts.container.off( 'swipeleft.cycle swiperight.cycle swipeLeft.cycle swipeRight.cycle swipeUp.cycle swipeDown.cycle' );\r\n});\r\n\r\n})(jQuery);\r\n\r\n/*! progressive loader plugin for Cycle2; version: 20130315 */\r\n(function($) {\r\n\"use strict\";\r\n\r\n$.extend($.fn.cycle.defaults, {\r\n progressive: false\r\n});\r\n\r\n$(document).on( 'cycle-pre-initialize', function( e, opts ) {\r\n if ( !opts.progressive )\r\n return;\r\n\r\n var API = opts.API;\r\n var nextFn = API.next;\r\n var prevFn = API.prev;\r\n var prepareTxFn = API.prepareTx;\r\n var type = $.type( opts.progressive );\r\n var slides, scriptEl;\r\n\r\n if ( type == 'array' ) {\r\n slides = opts.progressive;\r\n }\r\n else if ($.isFunction( opts.progressive ) ) {\r\n slides = opts.progressive( opts );\r\n }\r\n else if ( type == 'string' ) {\r\n scriptEl = $( opts.progressive );\r\n slides = $.trim( scriptEl.html() );\r\n if ( !slides )\r\n return;\r\n // is it json array?\r\n if ( /^(\\[)/.test( slides ) ) {\r\n try {\r\n slides = $.parseJSON( slides );\r\n }\r\n catch(err) {\r\n API.log( 'error parsing progressive slides', err );\r\n return;\r\n }\r\n }\r\n else {\r\n // plain text, split on delimeter\r\n slides = slides.split( new RegExp( scriptEl.data('cycle-split') || '\\n') );\r\n\r\n // #95; look for empty slide\r\n if ( ! slides[ slides.length - 1 ] )\r\n slides.pop();\r\n }\r\n }\r\n\r\n\r\n\r\n if ( prepareTxFn ) {\r\n API.prepareTx = function( manual, fwd ) {\r\n var index, slide;\r\n\r\n if ( manual || slides.length === 0 ) {\r\n prepareTxFn.apply( opts.API, [ manual, fwd ] );\r\n return;\r\n }\r\n\r\n if ( fwd && opts.currSlide == ( opts.slideCount-1) ) {\r\n slide = slides[ 0 ];\r\n slides = slides.slice( 1 );\r\n opts.container.one('cycle-slide-added', function(e, opts ) {\r\n setTimeout(function() {\r\n opts.API.advanceSlide( 1 );\r\n },50);\r\n });\r\n opts.API.add( slide );\r\n }\r\n else if ( !fwd && opts.currSlide === 0 ) {\r\n index = slides.length-1;\r\n slide = slides[ index ];\r\n slides = slides.slice( 0, index );\r\n opts.container.one('cycle-slide-added', function(e, opts ) {\r\n setTimeout(function() {\r\n opts.currSlide = 1;\r\n opts.API.advanceSlide( -1 );\r\n },50);\r\n });\r\n opts.API.add( slide, true );\r\n }\r\n else {\r\n prepareTxFn.apply( opts.API, [ manual, fwd ] );\r\n }\r\n };\r\n }\r\n\r\n if ( nextFn ) {\r\n API.next = function() {\r\n var opts = this.opts();\r\n if ( slides.length && opts.currSlide == ( opts.slideCount - 1 ) ) {\r\n var slide = slides[ 0 ];\r\n slides = slides.slice( 1 );\r\n opts.container.one('cycle-slide-added', function(e, opts ) {\r\n nextFn.apply( opts.API );\r\n opts.container.removeClass('cycle-loading');\r\n });\r\n opts.container.addClass('cycle-loading');\r\n opts.API.add( slide );\r\n }\r\n else {\r\n nextFn.apply( opts.API );\r\n }\r\n };\r\n }\r\n\r\n if ( prevFn ) {\r\n API.prev = function() {\r\n var opts = this.opts();\r\n if ( slides.length && opts.currSlide === 0 ) {\r\n var index = slides.length-1;\r\n var slide = slides[ index ];\r\n slides = slides.slice( 0, index );\r\n opts.container.one('cycle-slide-added', function(e, opts ) {\r\n opts.currSlide = 1;\r\n opts.API.advanceSlide( -1 );\r\n opts.container.removeClass('cycle-loading');\r\n });\r\n opts.container.addClass('cycle-loading');\r\n opts.API.add( slide, true );\r\n }\r\n else {\r\n prevFn.apply( opts.API );\r\n }\r\n };\r\n }\r\n});\r\n\r\n})(jQuery);\r\n\r\n/*! tmpl plugin for Cycle2; version: 20121227 */\r\n(function($) {\r\n\"use strict\";\r\n\r\n$.extend($.fn.cycle.defaults, {\r\n tmplRegex: '{{((.)?.*?)}}'\r\n});\r\n\r\n$.extend($.fn.cycle.API, {\r\n tmpl: function( str, opts /*, ... */) {\r\n var regex = new RegExp( opts.tmplRegex || $.fn.cycle.defaults.tmplRegex, 'g' );\r\n var args = $.makeArray( arguments );\r\n args.shift();\r\n return str.replace(regex, function(_, str) {\r\n var i, j, obj, prop, names = str.split('.');\r\n for (i=0; i < args.length; i++) {\r\n obj = args[i];\r\n if ( ! obj )\r\n continue;\r\n if (names.length > 1) {\r\n prop = obj;\r\n for (j=0; j < names.length; j++) {\r\n obj = prop;\r\n prop = prop[ names[j] ] || str;\r\n }\r\n } else {\r\n prop = obj[str];\r\n }\r\n\r\n if ($.isFunction(prop))\r\n return prop.apply(obj, args);\r\n if (prop !== undefined && prop !== null && prop != str)\r\n return prop;\r\n }\r\n return str;\r\n });\r\n }\r\n});\r\n\r\n})(jQuery);\r\n","/*!\r\n * typeahead.js 0.11.1\r\n * https://github.com/twitter/typeahead.js\r\n * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT\r\n */\r\n\r\n(function(root, factory) {\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"bloodhound\", [ \"jquery\" ], function(a0) {\r\n return root[\"Bloodhound\"] = factory(a0);\r\n });\r\n } else if (typeof exports === \"object\") {\r\n module.exports = factory(require(\"jquery\"));\r\n } else {\r\n root[\"Bloodhound\"] = factory(jQuery);\r\n }\r\n})(this, function($) {\r\n var _ = function() {\r\n \"use strict\";\r\n return {\r\n isMsie: function() {\r\n return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\\d+(.\\d+)?)/i)[2] : false;\r\n },\r\n isBlankString: function(str) {\r\n return !str || /^\\s*$/.test(str);\r\n },\r\n escapeRegExChars: function(str) {\r\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\r\n },\r\n isString: function(obj) {\r\n return typeof obj === \"string\";\r\n },\r\n isNumber: function(obj) {\r\n return typeof obj === \"number\";\r\n },\r\n isArray: $.isArray,\r\n isFunction: $.isFunction,\r\n isObject: $.isPlainObject,\r\n isUndefined: function(obj) {\r\n return typeof obj === \"undefined\";\r\n },\r\n isElement: function(obj) {\r\n return !!(obj && obj.nodeType === 1);\r\n },\r\n isJQuery: function(obj) {\r\n return obj instanceof $;\r\n },\r\n toStr: function toStr(s) {\r\n return _.isUndefined(s) || s === null ? \"\" : s + \"\";\r\n },\r\n bind: $.proxy,\r\n each: function(collection, cb) {\r\n $.each(collection, reverseArgs);\r\n function reverseArgs(index, value) {\r\n return cb(value, index);\r\n }\r\n },\r\n map: $.map,\r\n filter: $.grep,\r\n every: function(obj, test) {\r\n var result = true;\r\n if (!obj) {\r\n return result;\r\n }\r\n $.each(obj, function(key, val) {\r\n if (!(result = test.call(null, val, key, obj))) {\r\n return false;\r\n }\r\n });\r\n return !!result;\r\n },\r\n some: function(obj, test) {\r\n var result = false;\r\n if (!obj) {\r\n return result;\r\n }\r\n $.each(obj, function(key, val) {\r\n if (result = test.call(null, val, key, obj)) {\r\n return false;\r\n }\r\n });\r\n return !!result;\r\n },\r\n mixin: $.extend,\r\n identity: function(x) {\r\n return x;\r\n },\r\n clone: function(obj) {\r\n return $.extend(true, {}, obj);\r\n },\r\n getIdGenerator: function() {\r\n var counter = 0;\r\n return function() {\r\n return counter++;\r\n };\r\n },\r\n templatify: function templatify(obj) {\r\n return $.isFunction(obj) ? obj : template;\r\n function template() {\r\n return String(obj);\r\n }\r\n },\r\n defer: function(fn) {\r\n setTimeout(fn, 0);\r\n },\r\n debounce: function(func, wait, immediate) {\r\n var timeout, result;\r\n return function() {\r\n var context = this, args = arguments, later, callNow;\r\n later = function() {\r\n timeout = null;\r\n if (!immediate) {\r\n result = func.apply(context, args);\r\n }\r\n };\r\n callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) {\r\n result = func.apply(context, args);\r\n }\r\n return result;\r\n };\r\n },\r\n throttle: function(func, wait) {\r\n var context, args, timeout, result, previous, later;\r\n previous = 0;\r\n later = function() {\r\n previous = new Date();\r\n timeout = null;\r\n result = func.apply(context, args);\r\n };\r\n return function() {\r\n var now = new Date(), remaining = wait - (now - previous);\r\n context = this;\r\n args = arguments;\r\n if (remaining <= 0) {\r\n clearTimeout(timeout);\r\n timeout = null;\r\n previous = now;\r\n result = func.apply(context, args);\r\n } else if (!timeout) {\r\n timeout = setTimeout(later, remaining);\r\n }\r\n return result;\r\n };\r\n },\r\n stringify: function(val) {\r\n return _.isString(val) ? val : JSON.stringify(val);\r\n },\r\n noop: function() {}\r\n };\r\n }();\r\n var VERSION = \"0.11.1\";\r\n var tokenizers = function() {\r\n \"use strict\";\r\n return {\r\n nonword: nonword,\r\n whitespace: whitespace,\r\n obj: {\r\n nonword: getObjTokenizer(nonword),\r\n whitespace: getObjTokenizer(whitespace)\r\n }\r\n };\r\n function whitespace(str) {\r\n str = _.toStr(str);\r\n return str ? str.split(/\\s+/) : [];\r\n }\r\n function nonword(str) {\r\n str = _.toStr(str);\r\n return str ? str.split(/\\W+/) : [];\r\n }\r\n function getObjTokenizer(tokenizer) {\r\n return function setKey(keys) {\r\n keys = _.isArray(keys) ? keys : [].slice.call(arguments, 0);\r\n return function tokenize(o) {\r\n var tokens = [];\r\n _.each(keys, function(k) {\r\n tokens = tokens.concat(tokenizer(_.toStr(o[k])));\r\n });\r\n return tokens;\r\n };\r\n };\r\n }\r\n }();\r\n var LruCache = function() {\r\n \"use strict\";\r\n function LruCache(maxSize) {\r\n this.maxSize = _.isNumber(maxSize) ? maxSize : 100;\r\n this.reset();\r\n if (this.maxSize <= 0) {\r\n this.set = this.get = $.noop;\r\n }\r\n }\r\n _.mixin(LruCache.prototype, {\r\n set: function set(key, val) {\r\n var tailItem = this.list.tail, node;\r\n if (this.size >= this.maxSize) {\r\n this.list.remove(tailItem);\r\n delete this.hash[tailItem.key];\r\n this.size--;\r\n }\r\n if (node = this.hash[key]) {\r\n node.val = val;\r\n this.list.moveToFront(node);\r\n } else {\r\n node = new Node(key, val);\r\n this.list.add(node);\r\n this.hash[key] = node;\r\n this.size++;\r\n }\r\n },\r\n get: function get(key) {\r\n var node = this.hash[key];\r\n if (node) {\r\n this.list.moveToFront(node);\r\n return node.val;\r\n }\r\n },\r\n reset: function reset() {\r\n this.size = 0;\r\n this.hash = {};\r\n this.list = new List();\r\n }\r\n });\r\n function List() {\r\n this.head = this.tail = null;\r\n }\r\n _.mixin(List.prototype, {\r\n add: function add(node) {\r\n if (this.head) {\r\n node.next = this.head;\r\n this.head.prev = node;\r\n }\r\n this.head = node;\r\n this.tail = this.tail || node;\r\n },\r\n remove: function remove(node) {\r\n node.prev ? node.prev.next = node.next : this.head = node.next;\r\n node.next ? node.next.prev = node.prev : this.tail = node.prev;\r\n },\r\n moveToFront: function(node) {\r\n this.remove(node);\r\n this.add(node);\r\n }\r\n });\r\n function Node(key, val) {\r\n this.key = key;\r\n this.val = val;\r\n this.prev = this.next = null;\r\n }\r\n return LruCache;\r\n }();\r\n var PersistentStorage = function() {\r\n \"use strict\";\r\n var LOCAL_STORAGE;\r\n try {\r\n LOCAL_STORAGE = window.localStorage;\r\n LOCAL_STORAGE.setItem(\"~~~\", \"!\");\r\n LOCAL_STORAGE.removeItem(\"~~~\");\r\n } catch (err) {\r\n LOCAL_STORAGE = null;\r\n }\r\n function PersistentStorage(namespace, override) {\r\n this.prefix = [ \"__\", namespace, \"__\" ].join(\"\");\r\n this.ttlKey = \"__ttl__\";\r\n this.keyMatcher = new RegExp(\"^\" + _.escapeRegExChars(this.prefix));\r\n this.ls = override || LOCAL_STORAGE;\r\n !this.ls && this._noop();\r\n }\r\n _.mixin(PersistentStorage.prototype, {\r\n _prefix: function(key) {\r\n return this.prefix + key;\r\n },\r\n _ttlKey: function(key) {\r\n return this._prefix(key) + this.ttlKey;\r\n },\r\n _noop: function() {\r\n this.get = this.set = this.remove = this.clear = this.isExpired = _.noop;\r\n },\r\n _safeSet: function(key, val) {\r\n try {\r\n this.ls.setItem(key, val);\r\n } catch (err) {\r\n if (err.name === \"QuotaExceededError\") {\r\n this.clear();\r\n this._noop();\r\n }\r\n }\r\n },\r\n get: function(key) {\r\n if (this.isExpired(key)) {\r\n this.remove(key);\r\n }\r\n return decode(this.ls.getItem(this._prefix(key)));\r\n },\r\n set: function(key, val, ttl) {\r\n if (_.isNumber(ttl)) {\r\n this._safeSet(this._ttlKey(key), encode(now() + ttl));\r\n } else {\r\n this.ls.removeItem(this._ttlKey(key));\r\n }\r\n return this._safeSet(this._prefix(key), encode(val));\r\n },\r\n remove: function(key) {\r\n this.ls.removeItem(this._ttlKey(key));\r\n this.ls.removeItem(this._prefix(key));\r\n return this;\r\n },\r\n clear: function() {\r\n var i, keys = gatherMatchingKeys(this.keyMatcher);\r\n for (i = keys.length; i--; ) {\r\n this.remove(keys[i]);\r\n }\r\n return this;\r\n },\r\n isExpired: function(key) {\r\n var ttl = decode(this.ls.getItem(this._ttlKey(key)));\r\n return _.isNumber(ttl) && now() > ttl ? true : false;\r\n }\r\n });\r\n return PersistentStorage;\r\n function now() {\r\n return new Date().getTime();\r\n }\r\n function encode(val) {\r\n return JSON.stringify(_.isUndefined(val) ? null : val);\r\n }\r\n function decode(val) {\r\n return $.parseJSON(val);\r\n }\r\n function gatherMatchingKeys(keyMatcher) {\r\n var i, key, keys = [], len = LOCAL_STORAGE.length;\r\n for (i = 0; i < len; i++) {\r\n if ((key = LOCAL_STORAGE.key(i)).match(keyMatcher)) {\r\n keys.push(key.replace(keyMatcher, \"\"));\r\n }\r\n }\r\n return keys;\r\n }\r\n }();\r\n var Transport = function() {\r\n \"use strict\";\r\n var pendingRequestsCount = 0, pendingRequests = {}, maxPendingRequests = 6, sharedCache = new LruCache(10);\r\n function Transport(o) {\r\n o = o || {};\r\n this.cancelled = false;\r\n this.lastReq = null;\r\n this._send = o.transport;\r\n this._get = o.limiter ? o.limiter(this._get) : this._get;\r\n this._cache = o.cache === false ? new LruCache(0) : sharedCache;\r\n }\r\n Transport.setMaxPendingRequests = function setMaxPendingRequests(num) {\r\n maxPendingRequests = num;\r\n };\r\n Transport.resetCache = function resetCache() {\r\n sharedCache.reset();\r\n };\r\n _.mixin(Transport.prototype, {\r\n _fingerprint: function fingerprint(o) {\r\n o = o || {};\r\n return o.url + o.type + $.param(o.data || {});\r\n },\r\n _get: function(o, cb) {\r\n var that = this, fingerprint, jqXhr;\r\n fingerprint = this._fingerprint(o);\r\n if (this.cancelled || fingerprint !== this.lastReq) {\r\n return;\r\n }\r\n if (jqXhr = pendingRequests[fingerprint]) {\r\n jqXhr.done(done).fail(fail);\r\n } else if (pendingRequestsCount < maxPendingRequests) {\r\n pendingRequestsCount++;\r\n pendingRequests[fingerprint] = this._send(o).done(done).fail(fail).always(always);\r\n } else {\r\n this.onDeckRequestArgs = [].slice.call(arguments, 0);\r\n }\r\n function done(resp) {\r\n cb(null, resp);\r\n that._cache.set(fingerprint, resp);\r\n }\r\n function fail() {\r\n cb(true);\r\n }\r\n function always() {\r\n pendingRequestsCount--;\r\n delete pendingRequests[fingerprint];\r\n if (that.onDeckRequestArgs) {\r\n that._get.apply(that, that.onDeckRequestArgs);\r\n that.onDeckRequestArgs = null;\r\n }\r\n }\r\n },\r\n get: function(o, cb) {\r\n var resp, fingerprint;\r\n cb = cb || $.noop;\r\n o = _.isString(o) ? {\r\n url: o\r\n } : o || {};\r\n fingerprint = this._fingerprint(o);\r\n this.cancelled = false;\r\n this.lastReq = fingerprint;\r\n if (resp = this._cache.get(fingerprint)) {\r\n cb(null, resp);\r\n } else {\r\n this._get(o, cb);\r\n }\r\n },\r\n cancel: function() {\r\n this.cancelled = true;\r\n }\r\n });\r\n return Transport;\r\n }();\r\n var SearchIndex = window.SearchIndex = function() {\r\n \"use strict\";\r\n var CHILDREN = \"c\", IDS = \"i\";\r\n function SearchIndex(o) {\r\n o = o || {};\r\n if (!o.datumTokenizer || !o.queryTokenizer) {\r\n $.error(\"datumTokenizer and queryTokenizer are both required\");\r\n }\r\n this.identify = o.identify || _.stringify;\r\n this.datumTokenizer = o.datumTokenizer;\r\n this.queryTokenizer = o.queryTokenizer;\r\n this.reset();\r\n }\r\n _.mixin(SearchIndex.prototype, {\r\n bootstrap: function bootstrap(o) {\r\n this.datums = o.datums;\r\n this.trie = o.trie;\r\n },\r\n add: function(data) {\r\n var that = this;\r\n data = _.isArray(data) ? data : [ data ];\r\n _.each(data, function(datum) {\r\n var id, tokens;\r\n that.datums[id = that.identify(datum)] = datum;\r\n tokens = normalizeTokens(that.datumTokenizer(datum));\r\n _.each(tokens, function(token) {\r\n var node, chars, ch;\r\n node = that.trie;\r\n chars = token.split(\"\");\r\n while (ch = chars.shift()) {\r\n node = node[CHILDREN][ch] || (node[CHILDREN][ch] = newNode());\r\n node[IDS].push(id);\r\n }\r\n });\r\n });\r\n },\r\n get: function get(ids) {\r\n var that = this;\r\n return _.map(ids, function(id) {\r\n return that.datums[id];\r\n });\r\n },\r\n search: function search(query) {\r\n var that = this, tokens, matches;\r\n tokens = normalizeTokens(this.queryTokenizer(query));\r\n _.each(tokens, function(token) {\r\n var node, chars, ch, ids;\r\n if (matches && matches.length === 0) {\r\n return false;\r\n }\r\n node = that.trie;\r\n chars = token.split(\"\");\r\n while (node && (ch = chars.shift())) {\r\n node = node[CHILDREN][ch];\r\n }\r\n if (node && chars.length === 0) {\r\n ids = node[IDS].slice(0);\r\n matches = matches ? getIntersection(matches, ids) : ids;\r\n } else {\r\n matches = [];\r\n return false;\r\n }\r\n });\r\n return matches ? _.map(unique(matches), function(id) {\r\n return that.datums[id];\r\n }) : [];\r\n },\r\n all: function all() {\r\n var values = [];\r\n for (var key in this.datums) {\r\n values.push(this.datums[key]);\r\n }\r\n return values;\r\n },\r\n reset: function reset() {\r\n this.datums = {};\r\n this.trie = newNode();\r\n },\r\n serialize: function serialize() {\r\n return {\r\n datums: this.datums,\r\n trie: this.trie\r\n };\r\n }\r\n });\r\n return SearchIndex;\r\n function normalizeTokens(tokens) {\r\n tokens = _.filter(tokens, function(token) {\r\n return !!token;\r\n });\r\n tokens = _.map(tokens, function(token) {\r\n return token.toLowerCase();\r\n });\r\n return tokens;\r\n }\r\n function newNode() {\r\n var node = {};\r\n node[IDS] = [];\r\n node[CHILDREN] = {};\r\n return node;\r\n }\r\n function unique(array) {\r\n var seen = {}, uniques = [];\r\n for (var i = 0, len = array.length; i < len; i++) {\r\n if (!seen[array[i]]) {\r\n seen[array[i]] = true;\r\n uniques.push(array[i]);\r\n }\r\n }\r\n return uniques;\r\n }\r\n function getIntersection(arrayA, arrayB) {\r\n var ai = 0, bi = 0, intersection = [];\r\n arrayA = arrayA.sort();\r\n arrayB = arrayB.sort();\r\n var lenArrayA = arrayA.length, lenArrayB = arrayB.length;\r\n while (ai < lenArrayA && bi < lenArrayB) {\r\n if (arrayA[ai] < arrayB[bi]) {\r\n ai++;\r\n } else if (arrayA[ai] > arrayB[bi]) {\r\n bi++;\r\n } else {\r\n intersection.push(arrayA[ai]);\r\n ai++;\r\n bi++;\r\n }\r\n }\r\n return intersection;\r\n }\r\n }();\r\n var Prefetch = function() {\r\n \"use strict\";\r\n var keys;\r\n keys = {\r\n data: \"data\",\r\n protocol: \"protocol\",\r\n thumbprint: \"thumbprint\"\r\n };\r\n function Prefetch(o) {\r\n this.url = o.url;\r\n this.ttl = o.ttl;\r\n this.cache = o.cache;\r\n this.prepare = o.prepare;\r\n this.transform = o.transform;\r\n this.transport = o.transport;\r\n this.thumbprint = o.thumbprint;\r\n this.storage = new PersistentStorage(o.cacheKey);\r\n }\r\n _.mixin(Prefetch.prototype, {\r\n _settings: function settings() {\r\n return {\r\n url: this.url,\r\n type: \"GET\",\r\n dataType: \"json\"\r\n };\r\n },\r\n store: function store(data) {\r\n if (!this.cache) {\r\n return;\r\n }\r\n this.storage.set(keys.data, data, this.ttl);\r\n this.storage.set(keys.protocol, location.protocol, this.ttl);\r\n this.storage.set(keys.thumbprint, this.thumbprint, this.ttl);\r\n },\r\n fromCache: function fromCache() {\r\n var stored = {}, isExpired;\r\n if (!this.cache) {\r\n return null;\r\n }\r\n stored.data = this.storage.get(keys.data);\r\n stored.protocol = this.storage.get(keys.protocol);\r\n stored.thumbprint = this.storage.get(keys.thumbprint);\r\n isExpired = stored.thumbprint !== this.thumbprint || stored.protocol !== location.protocol;\r\n return stored.data && !isExpired ? stored.data : null;\r\n },\r\n fromNetwork: function(cb) {\r\n var that = this, settings;\r\n if (!cb) {\r\n return;\r\n }\r\n settings = this.prepare(this._settings());\r\n this.transport(settings).fail(onError).done(onResponse);\r\n function onError() {\r\n cb(true);\r\n }\r\n function onResponse(resp) {\r\n cb(null, that.transform(resp));\r\n }\r\n },\r\n clear: function clear() {\r\n this.storage.clear();\r\n return this;\r\n }\r\n });\r\n return Prefetch;\r\n }();\r\n var Remote = function() {\r\n \"use strict\";\r\n function Remote(o) {\r\n this.url = o.url;\r\n this.prepare = o.prepare;\r\n this.transform = o.transform;\r\n this.transport = new Transport({\r\n cache: o.cache,\r\n limiter: o.limiter,\r\n transport: o.transport\r\n });\r\n }\r\n _.mixin(Remote.prototype, {\r\n _settings: function settings() {\r\n return {\r\n url: this.url,\r\n type: \"GET\",\r\n dataType: \"json\"\r\n };\r\n },\r\n get: function get(query, cb) {\r\n var that = this, settings;\r\n if (!cb) {\r\n return;\r\n }\r\n query = query || \"\";\r\n settings = this.prepare(query, this._settings());\r\n return this.transport.get(settings, onResponse);\r\n function onResponse(err, resp) {\r\n err ? cb([]) : cb(that.transform(resp));\r\n }\r\n },\r\n cancelLastRequest: function cancelLastRequest() {\r\n this.transport.cancel();\r\n }\r\n });\r\n return Remote;\r\n }();\r\n var oParser = function() {\r\n \"use strict\";\r\n return function parse(o) {\r\n var defaults, sorter;\r\n defaults = {\r\n initialize: true,\r\n identify: _.stringify,\r\n datumTokenizer: null,\r\n queryTokenizer: null,\r\n sufficient: 5,\r\n sorter: null,\r\n local: [],\r\n prefetch: null,\r\n remote: null\r\n };\r\n o = _.mixin(defaults, o || {});\r\n !o.datumTokenizer && $.error(\"datumTokenizer is required\");\r\n !o.queryTokenizer && $.error(\"queryTokenizer is required\");\r\n sorter = o.sorter;\r\n o.sorter = sorter ? function(x) {\r\n return x.sort(sorter);\r\n } : _.identity;\r\n o.local = _.isFunction(o.local) ? o.local() : o.local;\r\n o.prefetch = parsePrefetch(o.prefetch);\r\n o.remote = parseRemote(o.remote);\r\n return o;\r\n };\r\n function parsePrefetch(o) {\r\n var defaults;\r\n if (!o) {\r\n return null;\r\n }\r\n defaults = {\r\n url: null,\r\n ttl: 24 * 60 * 60 * 1e3,\r\n cache: true,\r\n cacheKey: null,\r\n thumbprint: \"\",\r\n prepare: _.identity,\r\n transform: _.identity,\r\n transport: null\r\n };\r\n o = _.isString(o) ? {\r\n url: o\r\n } : o;\r\n o = _.mixin(defaults, o);\r\n !o.url && $.error(\"prefetch requires url to be set\");\r\n o.transform = o.filter || o.transform;\r\n o.cacheKey = o.cacheKey || o.url;\r\n o.thumbprint = VERSION + o.thumbprint;\r\n o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;\r\n return o;\r\n }\r\n function parseRemote(o) {\r\n var defaults;\r\n if (!o) {\r\n return;\r\n }\r\n defaults = {\r\n url: null,\r\n cache: true,\r\n prepare: null,\r\n replace: null,\r\n wildcard: null,\r\n limiter: null,\r\n rateLimitBy: \"debounce\",\r\n rateLimitWait: 300,\r\n transform: _.identity,\r\n transport: null\r\n };\r\n o = _.isString(o) ? {\r\n url: o\r\n } : o;\r\n o = _.mixin(defaults, o);\r\n !o.url && $.error(\"remote requires url to be set\");\r\n o.transform = o.filter || o.transform;\r\n o.prepare = toRemotePrepare(o);\r\n o.limiter = toLimiter(o);\r\n o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;\r\n delete o.replace;\r\n delete o.wildcard;\r\n delete o.rateLimitBy;\r\n delete o.rateLimitWait;\r\n return o;\r\n }\r\n function toRemotePrepare(o) {\r\n var prepare, replace, wildcard;\r\n prepare = o.prepare;\r\n replace = o.replace;\r\n wildcard = o.wildcard;\r\n if (prepare) {\r\n return prepare;\r\n }\r\n if (replace) {\r\n prepare = prepareByReplace;\r\n } else if (o.wildcard) {\r\n prepare = prepareByWildcard;\r\n } else {\r\n prepare = idenityPrepare;\r\n }\r\n return prepare;\r\n function prepareByReplace(query, settings) {\r\n settings.url = replace(settings.url, query);\r\n return settings;\r\n }\r\n function prepareByWildcard(query, settings) {\r\n settings.url = settings.url.replace(wildcard, encodeURIComponent(query));\r\n return settings;\r\n }\r\n function idenityPrepare(query, settings) {\r\n return settings;\r\n }\r\n }\r\n function toLimiter(o) {\r\n var limiter, method, wait;\r\n limiter = o.limiter;\r\n method = o.rateLimitBy;\r\n wait = o.rateLimitWait;\r\n if (!limiter) {\r\n limiter = /^throttle$/i.test(method) ? throttle(wait) : debounce(wait);\r\n }\r\n return limiter;\r\n function debounce(wait) {\r\n return function debounce(fn) {\r\n return _.debounce(fn, wait);\r\n };\r\n }\r\n function throttle(wait) {\r\n return function throttle(fn) {\r\n return _.throttle(fn, wait);\r\n };\r\n }\r\n }\r\n function callbackToDeferred(fn) {\r\n return function wrapper(o) {\r\n var deferred = $.Deferred();\r\n fn(o, onSuccess, onError);\r\n return deferred;\r\n function onSuccess(resp) {\r\n _.defer(function() {\r\n deferred.resolve(resp);\r\n });\r\n }\r\n function onError(err) {\r\n _.defer(function() {\r\n deferred.reject(err);\r\n });\r\n }\r\n };\r\n }\r\n }();\r\n var Bloodhound = function() {\r\n \"use strict\";\r\n var old;\r\n old = window && window.Bloodhound;\r\n function Bloodhound(o) {\r\n o = oParser(o);\r\n this.sorter = o.sorter;\r\n this.identify = o.identify;\r\n this.sufficient = o.sufficient;\r\n this.local = o.local;\r\n this.remote = o.remote ? new Remote(o.remote) : null;\r\n this.prefetch = o.prefetch ? new Prefetch(o.prefetch) : null;\r\n this.index = new SearchIndex({\r\n identify: this.identify,\r\n datumTokenizer: o.datumTokenizer,\r\n queryTokenizer: o.queryTokenizer\r\n });\r\n o.initialize !== false && this.initialize();\r\n }\r\n Bloodhound.noConflict = function noConflict() {\r\n window && (window.Bloodhound = old);\r\n return Bloodhound;\r\n };\r\n Bloodhound.tokenizers = tokenizers;\r\n _.mixin(Bloodhound.prototype, {\r\n __ttAdapter: function ttAdapter() {\r\n var that = this;\r\n return this.remote ? withAsync : withoutAsync;\r\n function withAsync(query, sync, async) {\r\n return that.search(query, sync, async);\r\n }\r\n function withoutAsync(query, sync) {\r\n return that.search(query, sync);\r\n }\r\n },\r\n _loadPrefetch: function loadPrefetch() {\r\n var that = this, deferred, serialized;\r\n deferred = $.Deferred();\r\n if (!this.prefetch) {\r\n deferred.resolve();\r\n } else if (serialized = this.prefetch.fromCache()) {\r\n this.index.bootstrap(serialized);\r\n deferred.resolve();\r\n } else {\r\n this.prefetch.fromNetwork(done);\r\n }\r\n return deferred.promise();\r\n function done(err, data) {\r\n if (err) {\r\n return deferred.reject();\r\n }\r\n that.add(data);\r\n that.prefetch.store(that.index.serialize());\r\n deferred.resolve();\r\n }\r\n },\r\n _initialize: function initialize() {\r\n var that = this, deferred;\r\n this.clear();\r\n (this.initPromise = this._loadPrefetch()).done(addLocalToIndex);\r\n return this.initPromise;\r\n function addLocalToIndex() {\r\n that.add(that.local);\r\n }\r\n },\r\n initialize: function initialize(force) {\r\n return !this.initPromise || force ? this._initialize() : this.initPromise;\r\n },\r\n add: function add(data) {\r\n this.index.add(data);\r\n return this;\r\n },\r\n get: function get(ids) {\r\n ids = _.isArray(ids) ? ids : [].slice.call(arguments);\r\n return this.index.get(ids);\r\n },\r\n search: function search(query, sync, async) {\r\n var that = this, local;\r\n local = this.sorter(this.index.search(query));\r\n sync(this.remote ? local.slice() : local);\r\n if (this.remote && local.length < this.sufficient) {\r\n this.remote.get(query, processRemote);\r\n } else if (this.remote) {\r\n this.remote.cancelLastRequest();\r\n }\r\n return this;\r\n function processRemote(remote) {\r\n var nonDuplicates = [];\r\n _.each(remote, function(r) {\r\n !_.some(local, function(l) {\r\n return that.identify(r) === that.identify(l);\r\n }) && nonDuplicates.push(r);\r\n });\r\n async && async(nonDuplicates);\r\n }\r\n },\r\n all: function all() {\r\n return this.index.all();\r\n },\r\n clear: function clear() {\r\n this.index.reset();\r\n return this;\r\n },\r\n clearPrefetchCache: function clearPrefetchCache() {\r\n this.prefetch && this.prefetch.clear();\r\n return this;\r\n },\r\n clearRemoteCache: function clearRemoteCache() {\r\n Transport.resetCache();\r\n return this;\r\n },\r\n ttAdapter: function ttAdapter() {\r\n return this.__ttAdapter();\r\n }\r\n });\r\n return Bloodhound;\r\n }();\r\n return Bloodhound;\r\n});\r\n\r\n(function(root, factory) {\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"typeahead.js\", [ \"jquery\" ], function(a0) {\r\n return factory(a0);\r\n });\r\n } else if (typeof exports === \"object\") {\r\n module.exports = factory(require(\"jquery\"));\r\n } else {\r\n factory(jQuery);\r\n }\r\n})(this, function($) {\r\n var _ = function() {\r\n \"use strict\";\r\n return {\r\n isMsie: function() {\r\n return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\\d+(.\\d+)?)/i)[2] : false;\r\n },\r\n isBlankString: function(str) {\r\n return !str || /^\\s*$/.test(str);\r\n },\r\n escapeRegExChars: function(str) {\r\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\r\n },\r\n isString: function(obj) {\r\n return typeof obj === \"string\";\r\n },\r\n isNumber: function(obj) {\r\n return typeof obj === \"number\";\r\n },\r\n isArray: $.isArray,\r\n isFunction: $.isFunction,\r\n isObject: $.isPlainObject,\r\n isUndefined: function(obj) {\r\n return typeof obj === \"undefined\";\r\n },\r\n isElement: function(obj) {\r\n return !!(obj && obj.nodeType === 1);\r\n },\r\n isJQuery: function(obj) {\r\n return obj instanceof $;\r\n },\r\n toStr: function toStr(s) {\r\n return _.isUndefined(s) || s === null ? \"\" : s + \"\";\r\n },\r\n bind: $.proxy,\r\n each: function(collection, cb) {\r\n $.each(collection, reverseArgs);\r\n function reverseArgs(index, value) {\r\n return cb(value, index);\r\n }\r\n },\r\n map: $.map,\r\n filter: $.grep,\r\n every: function(obj, test) {\r\n var result = true;\r\n if (!obj) {\r\n return result;\r\n }\r\n $.each(obj, function(key, val) {\r\n if (!(result = test.call(null, val, key, obj))) {\r\n return false;\r\n }\r\n });\r\n return !!result;\r\n },\r\n some: function(obj, test) {\r\n var result = false;\r\n if (!obj) {\r\n return result;\r\n }\r\n $.each(obj, function(key, val) {\r\n if (result = test.call(null, val, key, obj)) {\r\n return false;\r\n }\r\n });\r\n return !!result;\r\n },\r\n mixin: $.extend,\r\n identity: function(x) {\r\n return x;\r\n },\r\n clone: function(obj) {\r\n return $.extend(true, {}, obj);\r\n },\r\n getIdGenerator: function() {\r\n var counter = 0;\r\n return function() {\r\n return counter++;\r\n };\r\n },\r\n templatify: function templatify(obj) {\r\n return $.isFunction(obj) ? obj : template;\r\n function template() {\r\n return String(obj);\r\n }\r\n },\r\n defer: function(fn) {\r\n setTimeout(fn, 0);\r\n },\r\n debounce: function(func, wait, immediate) {\r\n var timeout, result;\r\n return function() {\r\n var context = this, args = arguments, later, callNow;\r\n later = function() {\r\n timeout = null;\r\n if (!immediate) {\r\n result = func.apply(context, args);\r\n }\r\n };\r\n callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) {\r\n result = func.apply(context, args);\r\n }\r\n return result;\r\n };\r\n },\r\n throttle: function(func, wait) {\r\n var context, args, timeout, result, previous, later;\r\n previous = 0;\r\n later = function() {\r\n previous = new Date();\r\n timeout = null;\r\n result = func.apply(context, args);\r\n };\r\n return function() {\r\n var now = new Date(), remaining = wait - (now - previous);\r\n context = this;\r\n args = arguments;\r\n if (remaining <= 0) {\r\n clearTimeout(timeout);\r\n timeout = null;\r\n previous = now;\r\n result = func.apply(context, args);\r\n } else if (!timeout) {\r\n timeout = setTimeout(later, remaining);\r\n }\r\n return result;\r\n };\r\n },\r\n stringify: function(val) {\r\n return _.isString(val) ? val : JSON.stringify(val);\r\n },\r\n noop: function() {}\r\n };\r\n }();\r\n var WWW = function() {\r\n \"use strict\";\r\n var defaultClassNames = {\r\n wrapper: \"twitter-typeahead\",\r\n input: \"tt-input\",\r\n hint: \"tt-hint\",\r\n menu: \"tt-menu\",\r\n dataset: \"tt-dataset\",\r\n suggestion: \"tt-suggestion\",\r\n selectable: \"tt-selectable\",\r\n empty: \"tt-empty\",\r\n open: \"tt-open\",\r\n cursor: \"tt-cursor\",\r\n highlight: \"tt-highlight\"\r\n };\r\n return build;\r\n function build(o) {\r\n var www, classes;\r\n classes = _.mixin({}, defaultClassNames, o);\r\n www = {\r\n css: buildCss(),\r\n classes: classes,\r\n html: buildHtml(classes),\r\n selectors: buildSelectors(classes)\r\n };\r\n return {\r\n css: www.css,\r\n html: www.html,\r\n classes: www.classes,\r\n selectors: www.selectors,\r\n mixin: function(o) {\r\n _.mixin(o, www);\r\n }\r\n };\r\n }\r\n function buildHtml(c) {\r\n return {\r\n wrapper: '
',\r\n menu: '
'\r\n };\r\n }\r\n function buildSelectors(classes) {\r\n var selectors = {};\r\n _.each(classes, function(v, k) {\r\n selectors[k] = \".\" + v;\r\n });\r\n return selectors;\r\n }\r\n function buildCss() {\r\n var css = {\r\n wrapper: {\r\n position: \"relative\",\r\n display: \"inline-block\"\r\n },\r\n hint: {\r\n position: \"absolute\",\r\n top: \"0\",\r\n left: \"0\",\r\n borderColor: \"transparent\",\r\n boxShadow: \"none\",\r\n opacity: \"1\"\r\n },\r\n input: {\r\n position: \"relative\",\r\n verticalAlign: \"top\",\r\n backgroundColor: \"transparent\"\r\n },\r\n inputWithNoHint: {\r\n position: \"relative\",\r\n verticalAlign: \"top\"\r\n },\r\n menu: {\r\n position: \"absolute\",\r\n top: \"100%\",\r\n left: \"0\",\r\n zIndex: \"100\",\r\n display: \"none\"\r\n },\r\n ltr: {\r\n left: \"0\",\r\n right: \"auto\"\r\n },\r\n rtl: {\r\n left: \"auto\",\r\n right: \" 0\"\r\n }\r\n };\r\n if (_.isMsie()) {\r\n _.mixin(css.input, {\r\n backgroundImage: \"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)\"\r\n });\r\n }\r\n return css;\r\n }\r\n }();\r\n var EventBus = function() {\r\n \"use strict\";\r\n var namespace, deprecationMap;\r\n namespace = \"typeahead:\";\r\n deprecationMap = {\r\n render: \"rendered\",\r\n cursorchange: \"cursorchanged\",\r\n select: \"selected\",\r\n autocomplete: \"autocompleted\"\r\n };\r\n function EventBus(o) {\r\n if (!o || !o.el) {\r\n $.error(\"EventBus initialized without el\");\r\n }\r\n this.$el = $(o.el);\r\n }\r\n _.mixin(EventBus.prototype, {\r\n _trigger: function(type, args) {\r\n var $e;\r\n $e = $.Event(namespace + type);\r\n (args = args || []).unshift($e);\r\n this.$el.trigger.apply(this.$el, args);\r\n return $e;\r\n },\r\n before: function(type) {\r\n var args, $e;\r\n args = [].slice.call(arguments, 1);\r\n $e = this._trigger(\"before\" + type, args);\r\n return $e.isDefaultPrevented();\r\n },\r\n trigger: function(type) {\r\n var deprecatedType;\r\n this._trigger(type, [].slice.call(arguments, 1));\r\n if (deprecatedType = deprecationMap[type]) {\r\n this._trigger(deprecatedType, [].slice.call(arguments, 1));\r\n }\r\n }\r\n });\r\n return EventBus;\r\n }();\r\n var EventEmitter = function() {\r\n \"use strict\";\r\n var splitter = /\\s+/, nextTick = getNextTick();\r\n return {\r\n onSync: onSync,\r\n onAsync: onAsync,\r\n off: off,\r\n trigger: trigger\r\n };\r\n function on(method, types, cb, context) {\r\n var type;\r\n if (!cb) {\r\n return this;\r\n }\r\n types = types.split(splitter);\r\n cb = context ? bindContext(cb, context) : cb;\r\n this._callbacks = this._callbacks || {};\r\n while (type = types.shift()) {\r\n this._callbacks[type] = this._callbacks[type] || {\r\n sync: [],\r\n async: []\r\n };\r\n this._callbacks[type][method].push(cb);\r\n }\r\n return this;\r\n }\r\n function onAsync(types, cb, context) {\r\n return on.call(this, \"async\", types, cb, context);\r\n }\r\n function onSync(types, cb, context) {\r\n return on.call(this, \"sync\", types, cb, context);\r\n }\r\n function off(types) {\r\n var type;\r\n if (!this._callbacks) {\r\n return this;\r\n }\r\n types = types.split(splitter);\r\n while (type = types.shift()) {\r\n delete this._callbacks[type];\r\n }\r\n return this;\r\n }\r\n function trigger(types) {\r\n var type, callbacks, args, syncFlush, asyncFlush;\r\n if (!this._callbacks) {\r\n return this;\r\n }\r\n types = types.split(splitter);\r\n args = [].slice.call(arguments, 1);\r\n while ((type = types.shift()) && (callbacks = this._callbacks[type])) {\r\n syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));\r\n asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));\r\n syncFlush() && nextTick(asyncFlush);\r\n }\r\n return this;\r\n }\r\n function getFlush(callbacks, context, args) {\r\n return flush;\r\n function flush() {\r\n var cancelled;\r\n for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {\r\n cancelled = callbacks[i].apply(context, args) === false;\r\n }\r\n return !cancelled;\r\n }\r\n }\r\n function getNextTick() {\r\n var nextTickFn;\r\n if (window.setImmediate) {\r\n nextTickFn = function nextTickSetImmediate(fn) {\r\n setImmediate(function() {\r\n fn();\r\n });\r\n };\r\n } else {\r\n nextTickFn = function nextTickSetTimeout(fn) {\r\n setTimeout(function() {\r\n fn();\r\n }, 0);\r\n };\r\n }\r\n return nextTickFn;\r\n }\r\n function bindContext(fn, context) {\r\n return fn.bind ? fn.bind(context) : function() {\r\n fn.apply(context, [].slice.call(arguments, 0));\r\n };\r\n }\r\n }();\r\n var highlight = function(doc) {\r\n \"use strict\";\r\n var defaults = {\r\n node: null,\r\n pattern: null,\r\n tagName: \"strong\",\r\n className: null,\r\n wordsOnly: false,\r\n caseSensitive: false\r\n };\r\n return function hightlight(o) {\r\n var regex;\r\n o = _.mixin({}, defaults, o);\r\n if (!o.node || !o.pattern) {\r\n return;\r\n }\r\n o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];\r\n regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);\r\n traverse(o.node, hightlightTextNode);\r\n function hightlightTextNode(textNode) {\r\n var match, patternNode, wrapperNode;\r\n if (match = regex.exec(textNode.data)) {\r\n wrapperNode = doc.createElement(o.tagName);\r\n o.className && (wrapperNode.className = o.className);\r\n patternNode = textNode.splitText(match.index);\r\n patternNode.splitText(match[0].length);\r\n wrapperNode.appendChild(patternNode.cloneNode(true));\r\n textNode.parentNode.replaceChild(wrapperNode, patternNode);\r\n }\r\n return !!match;\r\n }\r\n function traverse(el, hightlightTextNode) {\r\n var childNode, TEXT_NODE_TYPE = 3;\r\n for (var i = 0; i < el.childNodes.length; i++) {\r\n childNode = el.childNodes[i];\r\n if (childNode.nodeType === TEXT_NODE_TYPE) {\r\n i += hightlightTextNode(childNode) ? 1 : 0;\r\n } else {\r\n traverse(childNode, hightlightTextNode);\r\n }\r\n }\r\n }\r\n };\r\n function getRegex(patterns, caseSensitive, wordsOnly) {\r\n var escapedPatterns = [], regexStr;\r\n for (var i = 0, len = patterns.length; i < len; i++) {\r\n escapedPatterns.push(_.escapeRegExChars(patterns[i]));\r\n }\r\n regexStr = wordsOnly ? \"\\\\b(\" + escapedPatterns.join(\"|\") + \")\\\\b\" : \"(\" + escapedPatterns.join(\"|\") + \")\";\r\n return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, \"i\");\r\n }\r\n }(window.document);\r\n var Input = function() {\r\n \"use strict\";\r\n var specialKeyCodeMap;\r\n specialKeyCodeMap = {\r\n 9: \"tab\",\r\n 27: \"esc\",\r\n 37: \"left\",\r\n 39: \"right\",\r\n 13: \"enter\",\r\n 38: \"up\",\r\n 40: \"down\"\r\n };\r\n function Input(o, www) {\r\n o = o || {};\r\n if (!o.input) {\r\n $.error(\"input is missing\");\r\n }\r\n www.mixin(this);\r\n this.$hint = $(o.hint);\r\n this.$input = $(o.input);\r\n this.query = this.$input.val();\r\n this.queryWhenFocused = this.hasFocus() ? this.query : null;\r\n this.$overflowHelper = buildOverflowHelper(this.$input);\r\n this._checkLanguageDirection();\r\n if (this.$hint.length === 0) {\r\n this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;\r\n }\r\n }\r\n Input.normalizeQuery = function(str) {\r\n return _.toStr(str).replace(/^\\s*/g, \"\").replace(/\\s{2,}/g, \" \");\r\n };\r\n _.mixin(Input.prototype, EventEmitter, {\r\n _onBlur: function onBlur() {\r\n this.resetInputValue();\r\n this.trigger(\"blurred\");\r\n },\r\n _onFocus: function onFocus() {\r\n this.queryWhenFocused = this.query;\r\n this.trigger(\"focused\");\r\n },\r\n _onKeydown: function onKeydown($e) {\r\n var keyName = specialKeyCodeMap[$e.which || $e.keyCode];\r\n this._managePreventDefault(keyName, $e);\r\n if (keyName && this._shouldTrigger(keyName, $e)) {\r\n this.trigger(keyName + \"Keyed\", $e);\r\n }\r\n },\r\n _onInput: function onInput() {\r\n this._setQuery(this.getInputValue());\r\n this.clearHintIfInvalid();\r\n this._checkLanguageDirection();\r\n },\r\n _managePreventDefault: function managePreventDefault(keyName, $e) {\r\n var preventDefault;\r\n switch (keyName) {\r\n case \"up\":\r\n case \"down\":\r\n preventDefault = !withModifier($e);\r\n break;\r\n\r\n default:\r\n preventDefault = false;\r\n }\r\n preventDefault && $e.preventDefault();\r\n },\r\n _shouldTrigger: function shouldTrigger(keyName, $e) {\r\n var trigger;\r\n switch (keyName) {\r\n case \"tab\":\r\n trigger = !withModifier($e);\r\n break;\r\n\r\n default:\r\n trigger = true;\r\n }\r\n return trigger;\r\n },\r\n _checkLanguageDirection: function checkLanguageDirection() {\r\n var dir = (this.$input.css(\"direction\") || \"ltr\").toLowerCase();\r\n if (this.dir !== dir) {\r\n this.dir = dir;\r\n this.$hint.attr(\"dir\", dir);\r\n this.trigger(\"langDirChanged\", dir);\r\n }\r\n },\r\n _setQuery: function setQuery(val, silent) {\r\n var areEquivalent, hasDifferentWhitespace;\r\n areEquivalent = areQueriesEquivalent(val, this.query);\r\n hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false;\r\n this.query = val;\r\n if (!silent && !areEquivalent) {\r\n this.trigger(\"queryChanged\", this.query);\r\n } else if (!silent && hasDifferentWhitespace) {\r\n this.trigger(\"whitespaceChanged\", this.query);\r\n }\r\n },\r\n bind: function() {\r\n var that = this, onBlur, onFocus, onKeydown, onInput;\r\n onBlur = _.bind(this._onBlur, this);\r\n onFocus = _.bind(this._onFocus, this);\r\n onKeydown = _.bind(this._onKeydown, this);\r\n onInput = _.bind(this._onInput, this);\r\n this.$input.on(\"blur.tt\", onBlur).on(\"focus.tt\", onFocus).on(\"keydown.tt\", onKeydown);\r\n if (!_.isMsie() || _.isMsie() > 9) {\r\n this.$input.on(\"input.tt\", onInput);\r\n } else {\r\n this.$input.on(\"keydown.tt keypress.tt cut.tt paste.tt\", function($e) {\r\n if (specialKeyCodeMap[$e.which || $e.keyCode]) {\r\n return;\r\n }\r\n _.defer(_.bind(that._onInput, that, $e));\r\n });\r\n }\r\n return this;\r\n },\r\n focus: function focus() {\r\n this.$input.focus();\r\n },\r\n blur: function blur() {\r\n this.$input.blur();\r\n },\r\n getLangDir: function getLangDir() {\r\n return this.dir;\r\n },\r\n getQuery: function getQuery() {\r\n return this.query || \"\";\r\n },\r\n setQuery: function setQuery(val, silent) {\r\n this.setInputValue(val);\r\n this._setQuery(val, silent);\r\n },\r\n hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {\r\n return this.query !== this.queryWhenFocused;\r\n },\r\n getInputValue: function getInputValue() {\r\n return this.$input.val();\r\n },\r\n setInputValue: function setInputValue(value) {\r\n this.$input.val(value);\r\n this.clearHintIfInvalid();\r\n this._checkLanguageDirection();\r\n },\r\n resetInputValue: function resetInputValue() {\r\n this.setInputValue(this.query);\r\n },\r\n getHint: function getHint() {\r\n return this.$hint.val();\r\n },\r\n setHint: function setHint(value) {\r\n this.$hint.val(value);\r\n },\r\n clearHint: function clearHint() {\r\n this.setHint(\"\");\r\n },\r\n clearHintIfInvalid: function clearHintIfInvalid() {\r\n var val, hint, valIsPrefixOfHint, isValid;\r\n val = this.getInputValue();\r\n hint = this.getHint();\r\n valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;\r\n isValid = val !== \"\" && valIsPrefixOfHint && !this.hasOverflow();\r\n !isValid && this.clearHint();\r\n },\r\n hasFocus: function hasFocus() {\r\n return this.$input.is(\":focus\");\r\n },\r\n hasOverflow: function hasOverflow() {\r\n var constraint = this.$input.width() - 2;\r\n this.$overflowHelper.text(this.getInputValue());\r\n return this.$overflowHelper.width() >= constraint;\r\n },\r\n isCursorAtEnd: function() {\r\n var valueLength, selectionStart, range;\r\n valueLength = this.$input.val().length;\r\n selectionStart = this.$input[0].selectionStart;\r\n if (_.isNumber(selectionStart)) {\r\n return selectionStart === valueLength;\r\n } else if (document.selection) {\r\n range = document.selection.createRange();\r\n range.moveStart(\"character\", -valueLength);\r\n return valueLength === range.text.length;\r\n }\r\n return true;\r\n },\r\n destroy: function destroy() {\r\n this.$hint.off(\".tt\");\r\n this.$input.off(\".tt\");\r\n this.$overflowHelper.remove();\r\n this.$hint = this.$input = this.$overflowHelper = $(\"
\");\r\n }\r\n });\r\n return Input;\r\n function buildOverflowHelper($input) {\r\n return $('
').css({\r\n position: \"absolute\",\r\n visibility: \"hidden\",\r\n whiteSpace: \"pre\",\r\n fontFamily: $input.css(\"font-family\"),\r\n fontSize: $input.css(\"font-size\"),\r\n fontStyle: $input.css(\"font-style\"),\r\n fontVariant: $input.css(\"font-variant\"),\r\n fontWeight: $input.css(\"font-weight\"),\r\n wordSpacing: $input.css(\"word-spacing\"),\r\n letterSpacing: $input.css(\"letter-spacing\"),\r\n textIndent: $input.css(\"text-indent\"),\r\n textRendering: $input.css(\"text-rendering\"),\r\n textTransform: $input.css(\"text-transform\")\r\n }).insertAfter($input);\r\n }\r\n function areQueriesEquivalent(a, b) {\r\n return Input.normalizeQuery(a) === Input.normalizeQuery(b);\r\n }\r\n function withModifier($e) {\r\n return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;\r\n }\r\n }();\r\n var Dataset = function() {\r\n \"use strict\";\r\n var keys, nameGenerator;\r\n keys = {\r\n val: \"tt-selectable-display\",\r\n obj: \"tt-selectable-object\"\r\n };\r\n nameGenerator = _.getIdGenerator();\r\n function Dataset(o, www) {\r\n o = o || {};\r\n o.templates = o.templates || {};\r\n o.templates.notFound = o.templates.notFound || o.templates.empty;\r\n if (!o.source) {\r\n $.error(\"missing source\");\r\n }\r\n if (!o.node) {\r\n $.error(\"missing node\");\r\n }\r\n if (o.name && !isValidName(o.name)) {\r\n $.error(\"invalid dataset name: \" + o.name);\r\n }\r\n www.mixin(this);\r\n this.highlight = !!o.highlight;\r\n this.name = o.name || nameGenerator();\r\n this.limit = o.limit || 5;\r\n this.displayFn = getDisplayFn(o.display || o.displayKey);\r\n this.templates = getTemplates(o.templates, this.displayFn);\r\n this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;\r\n this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;\r\n this._resetLastSuggestion();\r\n this.$el = $(o.node).addClass(this.classes.dataset).addClass(this.classes.dataset + \"-\" + this.name);\r\n }\r\n Dataset.extractData = function extractData(el) {\r\n var $el = $(el);\r\n if ($el.data(keys.obj)) {\r\n return {\r\n val: $el.data(keys.val) || \"\",\r\n obj: $el.data(keys.obj) || null\r\n };\r\n }\r\n return null;\r\n };\r\n _.mixin(Dataset.prototype, EventEmitter, {\r\n _overwrite: function overwrite(query, suggestions) {\r\n suggestions = suggestions || [];\r\n if (suggestions.length) {\r\n this._renderSuggestions(query, suggestions);\r\n } else if (this.async && this.templates.pending) {\r\n this._renderPending(query);\r\n } else if (!this.async && this.templates.notFound) {\r\n this._renderNotFound(query);\r\n } else {\r\n this._empty();\r\n }\r\n this.trigger(\"rendered\", this.name, suggestions, false);\r\n },\r\n _append: function append(query, suggestions) {\r\n suggestions = suggestions || [];\r\n if (suggestions.length && this.$lastSuggestion.length) {\r\n this._appendSuggestions(query, suggestions);\r\n } else if (suggestions.length) {\r\n this._renderSuggestions(query, suggestions);\r\n } else if (!this.$lastSuggestion.length && this.templates.notFound) {\r\n this._renderNotFound(query);\r\n }\r\n this.trigger(\"rendered\", this.name, suggestions, true);\r\n },\r\n _renderSuggestions: function renderSuggestions(query, suggestions) {\r\n var $fragment;\r\n $fragment = this._getSuggestionsFragment(query, suggestions);\r\n this.$lastSuggestion = $fragment.children().last();\r\n this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions));\r\n },\r\n _appendSuggestions: function appendSuggestions(query, suggestions) {\r\n var $fragment, $lastSuggestion;\r\n $fragment = this._getSuggestionsFragment(query, suggestions);\r\n $lastSuggestion = $fragment.children().last();\r\n this.$lastSuggestion.after($fragment);\r\n this.$lastSuggestion = $lastSuggestion;\r\n },\r\n _renderPending: function renderPending(query) {\r\n var template = this.templates.pending;\r\n this._resetLastSuggestion();\r\n template && this.$el.html(template({\r\n query: query,\r\n dataset: this.name\r\n }));\r\n },\r\n _renderNotFound: function renderNotFound(query) {\r\n var template = this.templates.notFound;\r\n this._resetLastSuggestion();\r\n template && this.$el.html(template({\r\n query: query,\r\n dataset: this.name\r\n }));\r\n },\r\n _empty: function empty() {\r\n this.$el.empty();\r\n this._resetLastSuggestion();\r\n },\r\n _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) {\r\n var that = this, fragment;\r\n fragment = document.createDocumentFragment();\r\n _.each(suggestions, function getSuggestionNode(suggestion) {\r\n var $el, context;\r\n context = that._injectQuery(query, suggestion);\r\n $el = $(that.templates.suggestion(context)).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + \" \" + that.classes.selectable);\r\n fragment.appendChild($el[0]);\r\n });\r\n this.highlight && highlight({\r\n className: this.classes.highlight,\r\n node: fragment,\r\n pattern: query\r\n });\r\n return $(fragment);\r\n },\r\n _getFooter: function getFooter(query, suggestions) {\r\n return this.templates.footer ? this.templates.footer({\r\n query: query,\r\n suggestions: suggestions,\r\n dataset: this.name\r\n }) : null;\r\n },\r\n _getHeader: function getHeader(query, suggestions) {\r\n return this.templates.header ? this.templates.header({\r\n query: query,\r\n suggestions: suggestions,\r\n dataset: this.name\r\n }) : null;\r\n },\r\n _resetLastSuggestion: function resetLastSuggestion() {\r\n this.$lastSuggestion = $();\r\n },\r\n _injectQuery: function injectQuery(query, obj) {\r\n return _.isObject(obj) ? _.mixin({\r\n _query: query\r\n }, obj) : obj;\r\n },\r\n update: function update(query) {\r\n var that = this, canceled = false, syncCalled = false, rendered = 0;\r\n this.cancel();\r\n this.cancel = function cancel() {\r\n canceled = true;\r\n that.cancel = $.noop;\r\n that.async && that.trigger(\"asyncCanceled\", query);\r\n };\r\n this.source(query, sync, async);\r\n !syncCalled && sync([]);\r\n function sync(suggestions) {\r\n if (syncCalled) {\r\n return;\r\n }\r\n syncCalled = true;\r\n suggestions = (suggestions || []).slice(0, that.limit);\r\n rendered = suggestions.length;\r\n that._overwrite(query, suggestions);\r\n if (rendered < that.limit && that.async) {\r\n that.trigger(\"asyncRequested\", query);\r\n }\r\n }\r\n function async(suggestions) {\r\n suggestions = suggestions || [];\r\n if (!canceled && rendered < that.limit) {\r\n that.cancel = $.noop;\r\n rendered += suggestions.length;\r\n that._append(query, suggestions.slice(0, that.limit - rendered));\r\n that.async && that.trigger(\"asyncReceived\", query);\r\n }\r\n }\r\n },\r\n cancel: $.noop,\r\n clear: function clear() {\r\n this._empty();\r\n this.cancel();\r\n this.trigger(\"cleared\");\r\n },\r\n isEmpty: function isEmpty() {\r\n return this.$el.is(\":empty\");\r\n },\r\n destroy: function destroy() {\r\n this.$el = $(\"
\");\r\n }\r\n });\r\n return Dataset;\r\n function getDisplayFn(display) {\r\n display = display || _.stringify;\r\n return _.isFunction(display) ? display : displayFn;\r\n function displayFn(obj) {\r\n return obj[display];\r\n }\r\n }\r\n function getTemplates(templates, displayFn) {\r\n return {\r\n notFound: templates.notFound && _.templatify(templates.notFound),\r\n pending: templates.pending && _.templatify(templates.pending),\r\n header: templates.header && _.templatify(templates.header),\r\n footer: templates.footer && _.templatify(templates.footer),\r\n suggestion: templates.suggestion || suggestionTemplate\r\n };\r\n function suggestionTemplate(context) {\r\n return $(\"
\").text(displayFn(context));\r\n }\r\n }\r\n function isValidName(str) {\r\n return /^[_a-zA-Z0-9-]+$/.test(str);\r\n }\r\n }();\r\n var Menu = function() {\r\n \"use strict\";\r\n function Menu(o, www) {\r\n var that = this;\r\n o = o || {};\r\n if (!o.node) {\r\n $.error(\"node is required\");\r\n }\r\n www.mixin(this);\r\n this.$node = $(o.node);\r\n this.query = null;\r\n this.datasets = _.map(o.datasets, initializeDataset);\r\n function initializeDataset(oDataset) {\r\n var node = that.$node.find(oDataset.node).first();\r\n oDataset.node = node.length ? node : $(\"
\").appendTo(that.$node);\r\n return new Dataset(oDataset, www);\r\n }\r\n }\r\n _.mixin(Menu.prototype, EventEmitter, {\r\n _onSelectableClick: function onSelectableClick($e) {\r\n this.trigger(\"selectableClicked\", $($e.currentTarget));\r\n },\r\n _onRendered: function onRendered(type, dataset, suggestions, async) {\r\n this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\r\n this.trigger(\"datasetRendered\", dataset, suggestions, async);\r\n },\r\n _onCleared: function onCleared() {\r\n this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\r\n this.trigger(\"datasetCleared\");\r\n },\r\n _propagate: function propagate() {\r\n this.trigger.apply(this, arguments);\r\n },\r\n _allDatasetsEmpty: function allDatasetsEmpty() {\r\n return _.every(this.datasets, isDatasetEmpty);\r\n function isDatasetEmpty(dataset) {\r\n return dataset.isEmpty();\r\n }\r\n },\r\n _getSelectables: function getSelectables() {\r\n return this.$node.find(this.selectors.selectable);\r\n },\r\n _removeCursor: function _removeCursor() {\r\n var $selectable = this.getActiveSelectable();\r\n $selectable && $selectable.removeClass(this.classes.cursor);\r\n },\r\n _ensureVisible: function ensureVisible($el) {\r\n var elTop, elBottom, nodeScrollTop, nodeHeight;\r\n elTop = $el.position().top;\r\n elBottom = elTop + $el.outerHeight(true);\r\n nodeScrollTop = this.$node.scrollTop();\r\n nodeHeight = this.$node.height() + parseInt(this.$node.css(\"paddingTop\"), 10) + parseInt(this.$node.css(\"paddingBottom\"), 10);\r\n if (elTop < 0) {\r\n this.$node.scrollTop(nodeScrollTop + elTop);\r\n } else if (nodeHeight < elBottom) {\r\n this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));\r\n }\r\n },\r\n bind: function() {\r\n var that = this, onSelectableClick;\r\n onSelectableClick = _.bind(this._onSelectableClick, this);\r\n this.$node.on(\"click.tt\", this.selectors.selectable, onSelectableClick);\r\n _.each(this.datasets, function(dataset) {\r\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);\r\n });\r\n return this;\r\n },\r\n isOpen: function isOpen() {\r\n return this.$node.hasClass(this.classes.open);\r\n },\r\n open: function open() {\r\n this.$node.addClass(this.classes.open);\r\n },\r\n close: function close() {\r\n this.$node.removeClass(this.classes.open);\r\n this._removeCursor();\r\n },\r\n setLanguageDirection: function setLanguageDirection(dir) {\r\n this.$node.attr(\"dir\", dir);\r\n },\r\n selectableRelativeToCursor: function selectableRelativeToCursor(delta) {\r\n var $selectables, $oldCursor, oldIndex, newIndex;\r\n $oldCursor = this.getActiveSelectable();\r\n $selectables = this._getSelectables();\r\n oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;\r\n newIndex = oldIndex + delta;\r\n newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;\r\n newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;\r\n return newIndex === -1 ? null : $selectables.eq(newIndex);\r\n },\r\n setCursor: function setCursor($selectable) {\r\n this._removeCursor();\r\n if ($selectable = $selectable && $selectable.first()) {\r\n $selectable.addClass(this.classes.cursor);\r\n this._ensureVisible($selectable);\r\n }\r\n },\r\n getSelectableData: function getSelectableData($el) {\r\n return $el && $el.length ? Dataset.extractData($el) : null;\r\n },\r\n getActiveSelectable: function getActiveSelectable() {\r\n var $selectable = this._getSelectables().filter(this.selectors.cursor).first();\r\n return $selectable.length ? $selectable : null;\r\n },\r\n getTopSelectable: function getTopSelectable() {\r\n var $selectable = this._getSelectables().first();\r\n return $selectable.length ? $selectable : null;\r\n },\r\n update: function update(query) {\r\n var isValidUpdate = query !== this.query;\r\n if (isValidUpdate) {\r\n this.query = query;\r\n _.each(this.datasets, updateDataset);\r\n }\r\n return isValidUpdate;\r\n function updateDataset(dataset) {\r\n dataset.update(query);\r\n }\r\n },\r\n empty: function empty() {\r\n _.each(this.datasets, clearDataset);\r\n this.query = null;\r\n this.$node.addClass(this.classes.empty);\r\n function clearDataset(dataset) {\r\n dataset.clear();\r\n }\r\n },\r\n destroy: function destroy() {\r\n this.$node.off(\".tt\");\r\n this.$node = $(\"
\");\r\n _.each(this.datasets, destroyDataset);\r\n function destroyDataset(dataset) {\r\n dataset.destroy();\r\n }\r\n }\r\n });\r\n return Menu;\r\n }();\r\n var DefaultMenu = function() {\r\n \"use strict\";\r\n var s = Menu.prototype;\r\n function DefaultMenu() {\r\n Menu.apply(this, [].slice.call(arguments, 0));\r\n }\r\n _.mixin(DefaultMenu.prototype, Menu.prototype, {\r\n open: function open() {\r\n !this._allDatasetsEmpty() && this._show();\r\n return s.open.apply(this, [].slice.call(arguments, 0));\r\n },\r\n close: function close() {\r\n this._hide();\r\n return s.close.apply(this, [].slice.call(arguments, 0));\r\n },\r\n _onRendered: function onRendered() {\r\n if (this._allDatasetsEmpty()) {\r\n this._hide();\r\n } else {\r\n this.isOpen() && this._show();\r\n }\r\n return s._onRendered.apply(this, [].slice.call(arguments, 0));\r\n },\r\n _onCleared: function onCleared() {\r\n if (this._allDatasetsEmpty()) {\r\n this._hide();\r\n } else {\r\n this.isOpen() && this._show();\r\n }\r\n return s._onCleared.apply(this, [].slice.call(arguments, 0));\r\n },\r\n setLanguageDirection: function setLanguageDirection(dir) {\r\n this.$node.css(dir === \"ltr\" ? this.css.ltr : this.css.rtl);\r\n return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));\r\n },\r\n _hide: function hide() {\r\n this.$node.hide();\r\n },\r\n _show: function show() {\r\n this.$node.css(\"display\", \"block\");\r\n }\r\n });\r\n return DefaultMenu;\r\n }();\r\n var Typeahead = function() {\r\n \"use strict\";\r\n function Typeahead(o, www) {\r\n var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;\r\n o = o || {};\r\n if (!o.input) {\r\n $.error(\"missing input\");\r\n }\r\n if (!o.menu) {\r\n $.error(\"missing menu\");\r\n }\r\n if (!o.eventBus) {\r\n $.error(\"missing event bus\");\r\n }\r\n www.mixin(this);\r\n this.eventBus = o.eventBus;\r\n this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;\r\n this.input = o.input;\r\n this.menu = o.menu;\r\n this.enabled = true;\r\n this.active = false;\r\n this.input.hasFocus() && this.activate();\r\n this.dir = this.input.getLangDir();\r\n this._hacks();\r\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);\r\n onFocused = c(this, \"activate\", \"open\", \"_onFocused\");\r\n onBlurred = c(this, \"deactivate\", \"_onBlurred\");\r\n onEnterKeyed = c(this, \"isActive\", \"isOpen\", \"_onEnterKeyed\");\r\n onTabKeyed = c(this, \"isActive\", \"isOpen\", \"_onTabKeyed\");\r\n onEscKeyed = c(this, \"isActive\", \"_onEscKeyed\");\r\n onUpKeyed = c(this, \"isActive\", \"open\", \"_onUpKeyed\");\r\n onDownKeyed = c(this, \"isActive\", \"open\", \"_onDownKeyed\");\r\n onLeftKeyed = c(this, \"isActive\", \"isOpen\", \"_onLeftKeyed\");\r\n onRightKeyed = c(this, \"isActive\", \"isOpen\", \"_onRightKeyed\");\r\n onQueryChanged = c(this, \"_openIfActive\", \"_onQueryChanged\");\r\n onWhitespaceChanged = c(this, \"_openIfActive\", \"_onWhitespaceChanged\");\r\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);\r\n }\r\n _.mixin(Typeahead.prototype, {\r\n _hacks: function hacks() {\r\n var $input, $menu;\r\n $input = this.input.$input || $(\"
\");\r\n $menu = this.menu.$node || $(\"
\");\r\n $input.on(\"blur.tt\", function($e) {\r\n var active, isActive, hasActive;\r\n active = document.activeElement;\r\n isActive = $menu.is(active);\r\n hasActive = $menu.has(active).length > 0;\r\n if (_.isMsie() && (isActive || hasActive)) {\r\n $e.preventDefault();\r\n $e.stopImmediatePropagation();\r\n _.defer(function() {\r\n $input.focus();\r\n });\r\n }\r\n });\r\n $menu.on(\"mousedown.tt\", function($e) {\r\n $e.preventDefault();\r\n });\r\n },\r\n _onSelectableClicked: function onSelectableClicked(type, $el) {\r\n this.select($el);\r\n },\r\n _onDatasetCleared: function onDatasetCleared() {\r\n this._updateHint();\r\n },\r\n _onDatasetRendered: function onDatasetRendered(type, dataset, suggestions, async) {\r\n this._updateHint();\r\n this.eventBus.trigger(\"render\", suggestions, async, dataset);\r\n },\r\n _onAsyncRequested: function onAsyncRequested(type, dataset, query) {\r\n this.eventBus.trigger(\"asyncrequest\", query, dataset);\r\n },\r\n _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {\r\n this.eventBus.trigger(\"asynccancel\", query, dataset);\r\n },\r\n _onAsyncReceived: function onAsyncReceived(type, dataset, query) {\r\n this.eventBus.trigger(\"asyncreceive\", query, dataset);\r\n },\r\n _onFocused: function onFocused() {\r\n this._minLengthMet() && this.menu.update(this.input.getQuery());\r\n },\r\n _onBlurred: function onBlurred() {\r\n if (this.input.hasQueryChangedSinceLastFocus()) {\r\n this.eventBus.trigger(\"change\", this.input.getQuery());\r\n }\r\n },\r\n _onEnterKeyed: function onEnterKeyed(type, $e) {\r\n var $selectable;\r\n if ($selectable = this.menu.getActiveSelectable()) {\r\n this.select($selectable) && $e.preventDefault();\r\n }\r\n },\r\n _onTabKeyed: function onTabKeyed(type, $e) {\r\n var $selectable;\r\n if ($selectable = this.menu.getActiveSelectable()) {\r\n this.select($selectable) && $e.preventDefault();\r\n } else if ($selectable = this.menu.getTopSelectable()) {\r\n this.autocomplete($selectable) && $e.preventDefault();\r\n }\r\n },\r\n _onEscKeyed: function onEscKeyed() {\r\n this.close();\r\n },\r\n _onUpKeyed: function onUpKeyed() {\r\n this.moveCursor(-1);\r\n },\r\n _onDownKeyed: function onDownKeyed() {\r\n this.moveCursor(+1);\r\n },\r\n _onLeftKeyed: function onLeftKeyed() {\r\n if (this.dir === \"rtl\" && this.input.isCursorAtEnd()) {\r\n this.autocomplete(this.menu.getTopSelectable());\r\n }\r\n },\r\n _onRightKeyed: function onRightKeyed() {\r\n if (this.dir === \"ltr\" && this.input.isCursorAtEnd()) {\r\n this.autocomplete(this.menu.getTopSelectable());\r\n }\r\n },\r\n _onQueryChanged: function onQueryChanged(e, query) {\r\n this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();\r\n },\r\n _onWhitespaceChanged: function onWhitespaceChanged() {\r\n this._updateHint();\r\n },\r\n _onLangDirChanged: function onLangDirChanged(e, dir) {\r\n if (this.dir !== dir) {\r\n this.dir = dir;\r\n this.menu.setLanguageDirection(dir);\r\n }\r\n },\r\n _openIfActive: function openIfActive() {\r\n this.isActive() && this.open();\r\n },\r\n _minLengthMet: function minLengthMet(query) {\r\n query = _.isString(query) ? query : this.input.getQuery() || \"\";\r\n return query.length >= this.minLength;\r\n },\r\n _updateHint: function updateHint() {\r\n var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;\r\n $selectable = this.menu.getTopSelectable();\r\n data = this.menu.getSelectableData($selectable);\r\n val = this.input.getInputValue();\r\n if (data && !_.isBlankString(val) && !this.input.hasOverflow()) {\r\n query = Input.normalizeQuery(val);\r\n escapedQuery = _.escapeRegExChars(query);\r\n frontMatchRegEx = new RegExp(\"^(?:\" + escapedQuery + \")(.+$)\", \"i\");\r\n match = frontMatchRegEx.exec(data.val);\r\n match && this.input.setHint(val + match[1]);\r\n } else {\r\n this.input.clearHint();\r\n }\r\n },\r\n isEnabled: function isEnabled() {\r\n return this.enabled;\r\n },\r\n enable: function enable() {\r\n this.enabled = true;\r\n },\r\n disable: function disable() {\r\n this.enabled = false;\r\n },\r\n isActive: function isActive() {\r\n return this.active;\r\n },\r\n activate: function activate() {\r\n if (this.isActive()) {\r\n return true;\r\n } else if (!this.isEnabled() || this.eventBus.before(\"active\")) {\r\n return false;\r\n } else {\r\n this.active = true;\r\n this.eventBus.trigger(\"active\");\r\n return true;\r\n }\r\n },\r\n deactivate: function deactivate() {\r\n if (!this.isActive()) {\r\n return true;\r\n } else if (this.eventBus.before(\"idle\")) {\r\n return false;\r\n } else {\r\n this.active = false;\r\n this.close();\r\n this.eventBus.trigger(\"idle\");\r\n return true;\r\n }\r\n },\r\n isOpen: function isOpen() {\r\n return this.menu.isOpen();\r\n },\r\n open: function open() {\r\n if (!this.isOpen() && !this.eventBus.before(\"open\")) {\r\n this.menu.open();\r\n this._updateHint();\r\n this.eventBus.trigger(\"open\");\r\n }\r\n return this.isOpen();\r\n },\r\n close: function close() {\r\n if (this.isOpen() && !this.eventBus.before(\"close\")) {\r\n this.menu.close();\r\n this.input.clearHint();\r\n this.input.resetInputValue();\r\n this.eventBus.trigger(\"close\");\r\n }\r\n return !this.isOpen();\r\n },\r\n setVal: function setVal(val) {\r\n this.input.setQuery(_.toStr(val));\r\n },\r\n getVal: function getVal() {\r\n return this.input.getQuery();\r\n },\r\n select: function select($selectable) {\r\n var data = this.menu.getSelectableData($selectable);\r\n if (data && !this.eventBus.before(\"select\", data.obj)) {\r\n this.input.setQuery(data.val, true);\r\n this.eventBus.trigger(\"select\", data.obj);\r\n this.close();\r\n return true;\r\n }\r\n return false;\r\n },\r\n autocomplete: function autocomplete($selectable) {\r\n var query, data, isValid;\r\n query = this.input.getQuery();\r\n data = this.menu.getSelectableData($selectable);\r\n isValid = data && query !== data.val;\r\n if (isValid && !this.eventBus.before(\"autocomplete\", data.obj)) {\r\n this.input.setQuery(data.val);\r\n this.eventBus.trigger(\"autocomplete\", data.obj);\r\n return true;\r\n }\r\n return false;\r\n },\r\n moveCursor: function moveCursor(delta) {\r\n var query, $candidate, data, payload, cancelMove;\r\n query = this.input.getQuery();\r\n $candidate = this.menu.selectableRelativeToCursor(delta);\r\n data = this.menu.getSelectableData($candidate);\r\n payload = data ? data.obj : null;\r\n cancelMove = this._minLengthMet() && this.menu.update(query);\r\n if (!cancelMove && !this.eventBus.before(\"cursorchange\", payload)) {\r\n this.menu.setCursor($candidate);\r\n if (data) {\r\n this.input.setInputValue(data.val);\r\n } else {\r\n this.input.resetInputValue();\r\n this._updateHint();\r\n }\r\n this.eventBus.trigger(\"cursorchange\", payload);\r\n return true;\r\n }\r\n return false;\r\n },\r\n destroy: function destroy() {\r\n this.input.destroy();\r\n this.menu.destroy();\r\n }\r\n });\r\n return Typeahead;\r\n function c(ctx) {\r\n var methods = [].slice.call(arguments, 1);\r\n return function() {\r\n var args = [].slice.call(arguments);\r\n _.each(methods, function(method) {\r\n return ctx[method].apply(ctx, args);\r\n });\r\n };\r\n }\r\n }();\r\n (function() {\r\n \"use strict\";\r\n var old, keys, methods;\r\n old = $.fn.typeahead;\r\n keys = {\r\n www: \"tt-www\",\r\n attrs: \"tt-attrs\",\r\n typeahead: \"tt-typeahead\"\r\n };\r\n methods = {\r\n initialize: function initialize(o, datasets) {\r\n var www;\r\n datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);\r\n o = o || {};\r\n www = WWW(o.classNames);\r\n return this.each(attach);\r\n function attach() {\r\n var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, typeahead, MenuConstructor;\r\n _.each(datasets, function(d) {\r\n d.highlight = !!o.highlight;\r\n });\r\n $input = $(this);\r\n $wrapper = $(www.html.wrapper);\r\n $hint = $elOrNull(o.hint);\r\n $menu = $elOrNull(o.menu);\r\n defaultHint = o.hint !== false && !$hint;\r\n defaultMenu = o.menu !== false && !$menu;\r\n defaultHint && ($hint = buildHintFromInput($input, www));\r\n defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));\r\n $hint && $hint.val(\"\");\r\n $input = prepInput($input, www);\r\n if (defaultHint || defaultMenu) {\r\n $wrapper.css(www.css.wrapper);\r\n $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint);\r\n $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null);\r\n }\r\n MenuConstructor = defaultMenu ? DefaultMenu : Menu;\r\n eventBus = new EventBus({\r\n el: $input\r\n });\r\n input = new Input({\r\n hint: $hint,\r\n input: $input\r\n }, www);\r\n menu = new MenuConstructor({\r\n node: $menu,\r\n datasets: datasets\r\n }, www);\r\n typeahead = new Typeahead({\r\n input: input,\r\n menu: menu,\r\n eventBus: eventBus,\r\n minLength: o.minLength\r\n }, www);\r\n $input.data(keys.www, www);\r\n $input.data(keys.typeahead, typeahead);\r\n }\r\n },\r\n isEnabled: function isEnabled() {\r\n var enabled;\r\n ttEach(this.first(), function(t) {\r\n enabled = t.isEnabled();\r\n });\r\n return enabled;\r\n },\r\n enable: function enable() {\r\n ttEach(this, function(t) {\r\n t.enable();\r\n });\r\n return this;\r\n },\r\n disable: function disable() {\r\n ttEach(this, function(t) {\r\n t.disable();\r\n });\r\n return this;\r\n },\r\n isActive: function isActive() {\r\n var active;\r\n ttEach(this.first(), function(t) {\r\n active = t.isActive();\r\n });\r\n return active;\r\n },\r\n activate: function activate() {\r\n ttEach(this, function(t) {\r\n t.activate();\r\n });\r\n return this;\r\n },\r\n deactivate: function deactivate() {\r\n ttEach(this, function(t) {\r\n t.deactivate();\r\n });\r\n return this;\r\n },\r\n isOpen: function isOpen() {\r\n var open;\r\n ttEach(this.first(), function(t) {\r\n open = t.isOpen();\r\n });\r\n return open;\r\n },\r\n open: function open() {\r\n ttEach(this, function(t) {\r\n t.open();\r\n });\r\n return this;\r\n },\r\n close: function close() {\r\n ttEach(this, function(t) {\r\n t.close();\r\n });\r\n return this;\r\n },\r\n select: function select(el) {\r\n var success = false, $el = $(el);\r\n ttEach(this.first(), function(t) {\r\n success = t.select($el);\r\n });\r\n return success;\r\n },\r\n autocomplete: function autocomplete(el) {\r\n var success = false, $el = $(el);\r\n ttEach(this.first(), function(t) {\r\n success = t.autocomplete($el);\r\n });\r\n return success;\r\n },\r\n moveCursor: function moveCursoe(delta) {\r\n var success = false;\r\n ttEach(this.first(), function(t) {\r\n success = t.moveCursor(delta);\r\n });\r\n return success;\r\n },\r\n val: function val(newVal) {\r\n var query;\r\n if (!arguments.length) {\r\n ttEach(this.first(), function(t) {\r\n query = t.getVal();\r\n });\r\n return query;\r\n } else {\r\n ttEach(this, function(t) {\r\n t.setVal(newVal);\r\n });\r\n return this;\r\n }\r\n },\r\n destroy: function destroy() {\r\n ttEach(this, function(typeahead, $input) {\r\n revert($input);\r\n typeahead.destroy();\r\n });\r\n return this;\r\n }\r\n };\r\n $.fn.typeahead = function(method) {\r\n if (methods[method]) {\r\n return methods[method].apply(this, [].slice.call(arguments, 1));\r\n } else {\r\n return methods.initialize.apply(this, arguments);\r\n }\r\n };\r\n $.fn.typeahead.noConflict = function noConflict() {\r\n $.fn.typeahead = old;\r\n return this;\r\n };\r\n function ttEach($els, fn) {\r\n $els.each(function() {\r\n var $input = $(this), typeahead;\r\n (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input);\r\n });\r\n }\r\n function buildHintFromInput($input, www) {\r\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({\r\n autocomplete: \"off\",\r\n spellcheck: \"false\",\r\n tabindex: -1\r\n });\r\n }\r\n function prepInput($input, www) {\r\n $input.data(keys.attrs, {\r\n dir: $input.attr(\"dir\"),\r\n autocomplete: $input.attr(\"autocomplete\"),\r\n spellcheck: $input.attr(\"spellcheck\"),\r\n style: $input.attr(\"style\")\r\n });\r\n $input.addClass(www.classes.input).attr({\r\n autocomplete: \"off\",\r\n spellcheck: false\r\n });\r\n try {\r\n !$input.attr(\"dir\") && $input.attr(\"dir\", \"auto\");\r\n } catch (e) {}\r\n return $input;\r\n }\r\n function getBackgroundStyles($el) {\r\n return {\r\n backgroundAttachment: $el.css(\"background-attachment\"),\r\n backgroundClip: $el.css(\"background-clip\"),\r\n backgroundColor: $el.css(\"background-color\"),\r\n backgroundImage: $el.css(\"background-image\"),\r\n backgroundOrigin: $el.css(\"background-origin\"),\r\n backgroundPosition: $el.css(\"background-position\"),\r\n backgroundRepeat: $el.css(\"background-repeat\"),\r\n backgroundSize: $el.css(\"background-size\")\r\n };\r\n }\r\n function revert($input) {\r\n var www, $wrapper;\r\n www = $input.data(keys.www);\r\n $wrapper = $input.parent().filter(www.selectors.wrapper);\r\n _.each($input.data(keys.attrs), function(val, key) {\r\n _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);\r\n });\r\n $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);\r\n if ($wrapper.length) {\r\n $input.detach().insertAfter($wrapper);\r\n $wrapper.remove();\r\n }\r\n }\r\n function $elOrNull(obj) {\r\n var isValid, $el;\r\n isValid = _.isJQuery(obj) || _.isElement(obj);\r\n $el = isValid ? $(obj).first() : [];\r\n return $el.length ? $el : null;\r\n }\r\n })();\r\n});"]}