2013-05-26 13:47:14 +02:00
/ *
* Copyright 2012 , Google Inc .
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are
* met :
*
* * Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* * Redistributions in binary form must reproduce the above
* copyright notice , this list of conditions and the following disclaimer
* in the documentation and / or other materials provided with the
* distribution .
* * Neither the name of Google Inc . nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
* SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
* LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* Additional Licenses for Third Party components can be found here :
* http : //wiki.freebase.com/wiki/Freebase_Site_License
*
* /
( function ( c , r ) { if ( ! ( "console" in window ) ) { var p = window . console = { } ; p . log = p . warn = p . error = p . debug = function ( ) { } } c ( function ( ) { var a = c ( "<div>" ) ; c ( document . body ) . append ( a ) ; var b = setTimeout ( function ( ) { if ( c . cleanData ) { var a = c . cleanData ; c . cleanData = function ( b ) { for ( var f = 0 , g ; null != ( g = b [ f ] ) ; f ++ ) c ( g ) . triggerHandler ( "remove" ) ; a ( b ) } } else { var b = c . fn . remove ; c . fn . remove = function ( a , e ) { return this . each ( function ( ) { e || ( ! a || c . filter ( a , [ this ] ) . length ) && c ( "*" , this ) . add ( [ this ] ) . each ( function ( ) { c ( this ) . triggerHandler ( "remove" ) } ) ;
2013-05-26 13:48:51 +02:00
return b . call ( c ( this ) , a , e ) } ) } } } , 1 ) ; a . bind ( "remove" , function ( ) { clearTimeout ( b ) } ) ; a . remove ( ) } ) ; var q = { key : 1 , filter : 1 , spell : 1 , exact : 1 , lang : 1 , scoring : 1 , prefixed : 1 , stemmed : 1 , format : 1 , mql _output : 1 , output : 1 , type : 1 } ; c . suggest = function ( a , b ) { c . fn [ a ] = function ( b ) { this . length || console . warn ( "Suggest: invoked on empty element set" ) ; return this . each ( function ( ) { this . nodeName && ( "INPUT" === this . nodeName . toUpperCase ( ) ? this . type && "TEXT" !== this . type . toUpperCase ( ) && console . warn ( "Suggest: unsupported INPUT type: " + this . type ) : console . warn ( "Suggest: unsupported DOM element: " +
2013-05-26 13:47:14 +02:00
this . nodeName ) ) ; var g = c . data ( this , a ) ; g && g . _destroy ( ) ; c . data ( this , a , new c . suggest [ a ] ( this , b ) ) . _init ( ) } ) } ; c . suggest [ a ] = function ( b , g ) { var d = this , f = this . options = c . extend ( ! 0 , { } , c . suggest . defaults , c . suggest [ a ] . defaults , g ) , i = f . css _prefix = f . css _prefix || "" , h = f . css ; this . name = a ; c . each ( h , function ( a ) { h [ a ] = i + h [ a ] } ) ; f . ac _param = { } ; c . each ( q , function ( a ) { var b = f [ a ] ; null === b || "" === b || ( f . ac _param [ a ] = b ) } ) ; f . flyout _lang = null ; if ( f . ac _param . lang ) { var j = f . ac _param . lang ; c . isArray ( j ) && j . length && ( j = j . join ( "," ) ) ; j && ( f . flyout _lang =
j ) } this . _status = { START : "" , LOADING : "" , SELECT : "" , ERROR : "" } ; f . status && ( f . status instanceof Array && 3 <= f . status . length ) && ( this . _status . START = f . status [ 0 ] || "" , this . _status . LOADING = f . status [ 1 ] || "" , this . _status . SELECT = f . status [ 2 ] || "" , 4 === f . status . length && ( this . _status . ERROR = f . status [ 3 ] || "" ) ) ; var j = this . status = c ( '<div style="display:none;">' ) . addClass ( h . status ) , l = this . list = c ( "<ul>" ) . addClass ( h . list ) , k = this . pane = c ( '<div style="display:none;" class="fbs-reset">' ) . addClass ( h . pane ) ; k . append ( j ) . append ( l ) ; f . parent ?
c ( f . parent ) . append ( k ) : ( k . css ( "position" , "absolute" ) , f . zIndex && k . css ( "z-index" , f . zIndex ) , c ( document . body ) . append ( k ) ) ; k . bind ( "mousedown" , function ( a ) { d . input . data ( "dont_hide" , true ) ; a . stopPropagation ( ) } ) . bind ( "mouseup" , function ( a ) { d . input . data ( "dont_hide" ) && d . input . focus ( ) ; d . input . removeData ( "dont_hide" ) ; a . stopPropagation ( ) } ) . bind ( "click" , function ( a ) { a . stopPropagation ( ) ; if ( a = d . get _selected ( ) ) { d . onselect ( a , true ) ; d . hide _all ( ) } } ) ; l . hover ( function ( a ) { d . hoverover _list ( a ) } , function ( a ) { d . hoverout _list ( a ) } ) ;
this . input = c ( b ) . attr ( "autocomplete" , "off" ) . unbind ( ".suggest" ) . bind ( "remove.suggest" , function ( ) { d . _destroy ( ) } ) . bind ( "keydown.suggest" , function ( a ) { d . keydown ( a ) } ) . bind ( "keypress.suggest" , function ( a ) { d . keypress ( a ) } ) . bind ( "keyup.suggest" , function ( a ) { d . keyup ( a ) } ) . bind ( "blur.suggest" , function ( a ) { d . blur ( a ) } ) . bind ( "textchange.suggest" , function ( ) { d . textchange ( ) } ) . bind ( "focus.suggest" , function ( a ) { d . focus ( a ) } ) . bind ( c . browser . msie ? "paste.suggest" : "input.suggest" , function ( ) { clearTimeout ( d . paste _timeout ) ; d . paste _timeout =
setTimeout ( function ( ) { d . textchange ( ) } , 0 ) } ) ; this . onresize = function ( ) { d . invalidate _position ( ) ; if ( k . is ( ":visible" ) ) { d . position ( ) ; if ( f . flyout && d . flyoutpane && d . flyoutpane . is ( ":visible" ) ) { var a = d . get _selected ( ) ; a && d . flyout _position ( a ) } } } ; c ( window ) . bind ( "resize.suggest" , this . onresize ) . bind ( "scroll.suggest" , this . onresize ) } ; c . suggest [ a ] . prototype = c . extend ( { } , c . suggest . prototype , b ) } ; c . suggest . prototype = { _init : function ( ) { } , _destroy : function ( ) { this . pane . remove ( ) ; this . list . remove ( ) ; this . input . unbind ( ".suggest" ) ;
c ( window ) . unbind ( "resize.suggest" , this . onresize ) . unbind ( "scroll.suggest" , this . onresize ) ; this . input . removeData ( "data.suggest" ) } , invalidate _position : function ( ) { self . _position = null } , status _start : function ( ) { this . hide _all ( ) ; this . status . siblings ( ) . hide ( ) ; this . _status . START && ( this . status . text ( this . _status . START ) . show ( ) , this . pane . is ( ":visible" ) || ( this . position ( ) , this . pane _show ( ) ) ) ; this . _status . LOADING && this . status . removeClass ( "loading" ) } , status _loading : function ( ) { this . status . siblings ( ) . show ( ) ; this . _status . LOADING ?
( this . status . addClass ( "loading" ) . text ( this . _status . LOADING ) . show ( ) , this . pane . is ( ":visible" ) || ( this . position ( ) , this . pane _show ( ) ) ) : this . status . hide ( ) } , status _select : function ( ) { this . status . siblings ( ) . show ( ) ; this . _status . SELECT ? this . status . text ( this . _status . SELECT ) . show ( ) : this . status . hide ( ) ; this . _status . LOADING && this . status . removeClass ( "loading" ) } , status _error : function ( ) { this . status . siblings ( ) . show ( ) ; this . _status . ERROR ? this . status . text ( this . _status . ERROR ) . show ( ) : this . status . hide ( ) ; this . _status . LOADING &&
this . status . removeClass ( "loading" ) } , focus : function ( a ) { "" === this . input . val ( ) ? this . status _start ( ) : this . focus _hook ( a ) } , focus _hook : function ( ) { ! this . input . data ( "data.suggest" ) && ( ! this . pane . is ( ":visible" ) && c ( "." + this . options . css . item , this . list ) . length ) && ( this . position ( ) , this . pane _show ( ) ) } , keydown : function ( a ) { var b = a . keyCode ; if ( 9 === b ) this . tab ( a ) ; else if ( 38 === b || 40 === b ) a . shiftKey || a . preventDefault ( ) } , keypress : function ( a ) { var b = a . keyCode ; 38 === b || 40 === b ? a . shiftKey || a . preventDefault ( ) : 13 === b && this . enter ( a ) } ,
keyup : function ( a ) { var b = a . keyCode ; if ( 38 === b ) a . preventDefault ( ) , this . up ( a ) ; else if ( 40 === b ) a . preventDefault ( ) , this . down ( a ) ; else if ( a . ctrlKey && 77 === b ) c ( ".fbs-more-link" , this . pane ) . click ( ) ; else if ( c . suggest . is _char ( a ) ) { clearTimeout ( this . keypress . timeout ) ; var e = this ; this . keypress . timeout = setTimeout ( function ( ) { e . textchange ( ) } , 0 ) } else 27 === b && this . escape ( a ) ; return ! 0 } , blur : function ( ) { this . input . data ( "dont_hide" ) || ( this . input . data ( "data.suggest" ) , this . hide _all ( ) ) } , tab : function ( a ) { if ( ! a . shiftKey && ! a . metaKey &&
! a . ctrlKey ) { var a = this . options , a = this . pane . is ( ":visible" ) && c ( "." + a . css . item , this . list ) . length , b = this . get _selected ( ) ; a && b && ( this . onselect ( b ) , this . hide _all ( ) ) } } , enter : function ( a ) { var b = this . options ; if ( this . pane . is ( ":visible" ) ) { if ( a . shiftKey ) { this . shift _enter ( a ) ; a . preventDefault ( ) ; return } if ( c ( "." + b . css . item , this . list ) . length ) { var e = this . get _selected ( ) ; if ( e ) { this . onselect ( e ) ; this . hide _all ( ) ; a . preventDefault ( ) ; return } if ( ! b . soft && ( this . input . data ( "data.suggest" ) , c ( "." + this . options . css . item + ":visible" , this . list ) . length ) ) { this . updown ( ! 1 ) ;
a . preventDefault ( ) ; return } } } b . soft ? this . soft _enter ( ) : a . preventDefault ( ) } , soft _enter : function ( ) { } , shift _enter : function ( ) { } , escape : function ( ) { this . hide _all ( ) } , up : function ( a ) { this . updown ( ! 0 , a . ctrlKey || a . shiftKey ) } , down : function ( a ) { this . updown ( ! 1 , null , a . ctrlKey || a . shiftKey ) } , updown : function ( a , b , e ) { var g = this . options . css , d = this . list ; if ( this . pane . is ( ":visible" ) ) { var f = c ( "." + g . item + ":visible" , d ) ; if ( f . length ) { var d = c ( f [ 0 ] ) , f = c ( f [ f . length - 1 ] ) , i = this . get _selected ( ) || [ ] ; clearTimeout ( this . ignore _mouseover . timeout ) ;
this . _ignore _mouseover = ! 1 ; a ? b ? this . _goto ( d ) : i . length ? i [ 0 ] == d [ 0 ] ? ( d . removeClass ( g . selected ) , this . input . val ( this . input . data ( "original.suggest" ) ) , this . hoverout _list ( ) ) : ( a = i . prevAll ( "." + g . item + ":visible:first" ) , this . _goto ( a ) ) : this . _goto ( f ) : e ? this . _goto ( f ) : i . length ? i [ 0 ] == f [ 0 ] ? ( f . removeClass ( g . selected ) , this . input . val ( this . input . data ( "original.suggest" ) ) , this . hoverout _list ( ) ) : ( a = i . nextAll ( "." + g . item + ":visible:first" ) , this . _goto ( a ) ) : this . _goto ( d ) } } else a || this . textchange ( ) } , _goto : function ( a ) { a . trigger ( "mouseover.suggest" ) ;
var b = a . data ( "data.suggest" ) ; this . input . val ( b ? b . name : this . input . data ( "original.suggest" ) ) ; this . scroll _to ( a ) } , scroll _to : function ( a ) { var b = this . list , c = b . scrollTop ( ) , g = c + b . innerHeight ( ) , d = a . outerHeight ( ) , a = a . prevAll ( ) . length * d , d = a + d ; a < c ? ( this . ignore _mouseover ( ) , b . scrollTop ( a ) ) : d > g && ( this . ignore _mouseover ( ) , b . scrollTop ( c + d - g ) ) } , textchange : function ( ) { this . input . removeData ( "data.suggest" ) ; this . input . trigger ( "fb-textchange" , this ) ; var a = this . input . val ( ) ; "" === a ? this . status _start ( ) : ( this . status _loading ( ) , this . request ( a ) ) } ,
request : function ( ) { } , response : function ( a ) { if ( a && ( "cost" in a && this . trackEvent ( this . name , "response" , "cost" , a . cost ) , this . check _response ( a ) ) ) { var b = [ ] ; c . isArray ( a ) ? b = a : "result" in a && ( b = a . result ) ; var e = c . map ( arguments , function ( a ) { return a } ) ; this . response _hook . apply ( this , e ) ; var g = null , d = this , f = this . options ; c . each ( b , function ( b , c ) { if ( ! c . id && c . mid ) c . id = c . mid ; var e = d . create _item ( c , a ) . bind ( "mouseover.suggest" , function ( a ) { d . mouseover _item ( a ) } ) ; e . data ( "data.suggest" , c ) ; d . list . append ( e ) ; b === 0 && ( g = e ) } ) ; this . input . data ( "original.suggest" ,
this . input . val ( ) ) ; if ( 0 === c ( "." + f . css . item , this . list ) . length && f . nomatch ) { b = c ( '<li class="fbs-nomatch">' ) ; if ( "string" === typeof f . nomatch ) b . text ( f . nomatch ) ; else if ( f . nomatch . title && b . append ( c ( '<em class="fbs-nomatch-text">' ) . text ( f . nomatch . title ) ) , f . nomatch . heading && b . append ( c ( "<h3>" ) . text ( f . nomatch . heading ) ) , ( f = f . nomatch . tips ) && f . length ) { var i = c ( '<ul class="fbs-search-tips">' ) ; c . each ( f , function ( a , b ) { i . append ( c ( "<li>" ) . text ( b ) ) } ) ; b . append ( i ) } b . bind ( "click.suggest" , function ( a ) { a . stopPropagation ( ) } ) ; this . list . append ( b ) } e . push ( g ) ;
this . show _hook . apply ( this , e ) ; this . position ( ) ; this . pane _show ( ) } } , pane _show : function ( ) { var a = ! 1 ; c ( "> li" , this . list ) . length && ( a = ! 0 ) ; a || this . pane . children ( ":not(." + this . options . css . list + ")" ) . each ( function ( ) { if ( "none" != c ( this ) . css ( "display" ) ) return a = ! 0 , ! 1 } ) ; if ( a ) if ( this . options . animate ) { var b = this ; this . pane . slideDown ( "fast" , function ( ) { b . input . trigger ( "fb-pane-show" , b ) } ) } else this . pane . show ( ) , this . input . trigger ( "fb-pane-show" , this ) ; else this . pane . hide ( ) , this . input . trigger ( "fb-pane-hide" , this ) } , create _item : function ( a ) { var b =
this . options . css , e = c ( "<li>" ) . addClass ( b . item ) , a = c ( "<label>" ) . text ( a . name ) ; e . append ( c ( "<div>" ) . addClass ( b . item _name ) . append ( a ) ) ; return e } , mouseover _item : function ( a ) { if ( ! this . _ignore _mouseover ) { a = a . target ; "li" !== a . nodeName . toLowerCase ( ) && ( a = c ( a ) . parents ( "li:first" ) ) ; var b = c ( a ) , e = this . options . css ; c ( "." + e . item , this . list ) . each ( function ( ) { this !== b [ 0 ] && c ( this ) . removeClass ( e . selected ) } ) ; b . hasClass ( e . selected ) || ( b . addClass ( e . selected ) , this . mouseover _item _hook ( b ) ) } } , mouseover _item _hook : function ( ) { } , hoverover _list : function ( ) { } ,
hoverout _list : function ( ) { } , check _response : function ( ) { return ! 0 } , response _hook : function ( ) { this . list . empty ( ) } , show _hook : function ( ) { this . status _select ( ) } , position : function ( ) { var a = this . pane , b = this . options ; if ( ! b . parent ) { if ( ! self . _position ) { var e = this . input , g = e . offset ( ) , d = e . outerWidth ( ! 0 ) , f = e . outerHeight ( ! 0 ) ; g . top += f ; var i = a . outerWidth ( ) , h = a . outerHeight ( ) , j = g . top + h / 2 , l = c ( window ) . scrollLeft ( ) , e = c ( window ) . scrollTop ( ) , k = c ( window ) . width ( ) , n = c ( window ) . height ( ) + e , m = ! 0 ; "left" == b . align ? m = ! 0 : "right" == b . align ? m =
! 1 : g . left > l + k / 2 && ( m = ! 1 ) ; m || ( m = g . left - ( i - d ) , m > l && ( g . left = m ) ) ; j > n && ( b = g . top - f - h , b > e && ( g . top = b ) ) ; this . _position = g } a . css ( { top : this . _position . top , left : this . _position . left } ) } } , ignore _mouseover : function ( ) { this . _ignore _mouseover = ! 0 ; var a = this ; this . ignore _mouseover . timeout = setTimeout ( function ( ) { a . ignore _mouseover _reset ( ) } , 1E3 ) } , ignore _mouseover _reset : function ( ) { this . _ignore _mouseover = ! 1 } , get _selected : function ( ) { var a = null , b = this . options . css . selected ; c ( "li" , this . list ) . each ( function ( ) { var e = c ( this ) ; if ( e . hasClass ( b ) &&
e . is ( ":visible" ) ) return a = e , ! 1 } ) ; return a } , onselect : function ( a ) { var b = a . data ( "data.suggest" ) ; b && ( this . input . val ( b . name ) . data ( "data.suggest" , b ) . trigger ( "fb-select" , b ) , this . trackEvent ( this . name , "fb-select" , "index" , a . prevAll ( ) . length ) ) } , trackEvent : function ( a , b , c , g ) { this . input . trigger ( "fb-track-event" , { category : a , action : b , label : c , value : g } ) } , hide _all : function ( ) { this . pane . hide ( ) ; this . input . trigger ( "fb-pane-hide" , this ) } } ; c . extend ( c . suggest , { defaults : { status : [ "Start typing to get suggestions..." , "Searching..." ,
"Select an item from the list:" , "Sorry, something went wrong. Please try again later" ] , soft : ! 1 , nomatch : "no matches" , css : { pane : "fbs-pane" , list : "fbs-list" , item : "fbs-item" , item _name : "fbs-item-name" , selected : "fbs-selected" , status : "fbs-status" } , css _prefix : null , parent : null , animate : ! 1 , zIndex : null } , strongify : function ( a , b ) { var e , g = a . toLowerCase ( ) . indexOf ( b . toLowerCase ( ) ) ; if ( 0 <= g ) { var d = b . length ; e = document . createTextNode ( a . substring ( 0 , g ) ) ; var f = c ( "<strong>" ) . text ( a . substring ( g , g + d ) ) , g = document . createTextNode ( a . substring ( g +
d ) ) ; e = c ( "<div>" ) . append ( e ) . append ( f ) . append ( g ) } else e = c ( "<div>" ) . text ( a ) ; return e } , keyCode : { CAPS _LOCK : 20 , CONTROL : 17 , DOWN : 40 , END : 35 , ENTER : 13 , ESCAPE : 27 , HOME : 36 , INSERT : 45 , LEFT : 37 , NUMPAD _ENTER : 108 , PAGE _DOWN : 34 , PAGE _UP : 33 , RIGHT : 39 , SHIFT : 16 , SPACE : 32 , TAB : 9 , UP : 38 , OPTION : 18 , APPLE : 224 } , is _char : function ( a ) { if ( "keypress" === a . type ) { if ( ( a . metaKey || a . ctrlKey ) && 118 === a . charCode ) return ! 0 ; if ( "isChar" in a ) return a . isChar } else { var b = c . suggest . keyCode . not _char ; b || ( b = { } , c . each ( c . suggest . keyCode , function ( a , c ) { b [ "" + c ] = 1 } ) ,
c . suggest . keyCode . not _char = b ) ; return ! ( "" + a . keyCode in b ) } } , parse _input : function ( a ) { for ( var b = /(\S+)\:(?:\"([^\"]+)\"|(\S+))/g , e = a , g = [ ] , d = { } , f = b . exec ( a ) ; f ; ) f [ 1 ] in q ? d [ f [ 1 ] ] = c . isEmptyObject ( f [ 2 ] ) ? f [ 3 ] : f [ 2 ] : g . push ( f [ 0 ] ) , e = e . replace ( f [ 0 ] , "" ) , f = b . exec ( a ) ; e = c . trim ( e . replace ( /\s+/g , " " ) ) ; return [ e , g , d ] } , mqlkey _fast : /^[_A-Za-z0-9][A-Za-z0-9_-]*$/ , mqlkey _slow : /^(?:[A-Za-z0-9]|\$[A-F0-9]{4})(?:[A-Za-z0-9_-]|\$[A-F0-9]{4})*$/ , check _mql _key : function ( a ) { return c . suggest . mqlkey _fast . test ( a ) || c . suggest . mqlkey _slow . test ( a ) ?
! 0 : ! 1 } , check _mql _id : function ( a ) { if ( 0 === a . indexOf ( "/" ) ) { a = a . split ( "/" ) ; a . shift ( ) ; if ( ! ( 1 == a . length && "" === a [ 0 ] ) ) for ( var b = 0 , e = a . length ; b < e ; b ++ ) if ( ! c . suggest . check _mql _key ( a [ b ] ) ) return ! 1 ; return ! 0 } return ! 1 } , is _system _type : function ( a ) { return null == a ? ! 1 : 0 === a . indexOf ( "/type/" ) } } ) ; var s = c . suggest . prototype . _destroy , t = c . suggest . prototype . show _hook ; c . suggest ( "suggest" , { _init : function ( ) { var a = this , b = this . options ; null == b . flyout _service _url && ( b . flyout _service _url = b . service _url ) ; this . flyout _url = b . flyout _service _url ;
b . flyout _service _path && ( this . flyout _url += b . flyout _service _path ) ; this . flyout _url = this . flyout _url . replace ( /\$\{key\}/g , b . key ) ; null == b . flyout _image _service _url && ( b . flyout _image _service _url = b . service _url ) ; this . flyout _image _url = b . flyout _image _service _url ; b . flyout _image _service _path && ( this . flyout _image _url += b . flyout _image _service _path ) ; this . flyout _image _url = this . flyout _image _url . replace ( /\$\{key\}/g , b . key ) ; c . suggest . cache || ( c . suggest . cache = { } ) ; if ( b . flyout && ( this . flyoutpane = c ( '<div style="display:none;" class="fbs-reset">' ) . addClass ( b . css . flyoutpane ) ,
b . flyout _parent ? c ( b . flyout _parent ) . append ( this . flyoutpane ) : ( this . flyoutpane . css ( "position" , "absolute" ) , b . zIndex && this . flyoutpane . css ( "z-index" , b . zIndex ) , c ( document . body ) . append ( this . flyoutpane ) ) , this . flyoutpane . hover ( function ( b ) { a . hoverover _list ( b ) } , function ( b ) { a . hoverout _list ( b ) } ) . bind ( "mousedown.suggest" , function ( b ) { b . stopPropagation ( ) ; a . pane . click ( ) } ) , c . suggest . flyout || ( c . suggest . flyout = { } ) , ! c . suggest . flyout . cache ) ) c . suggest . flyout . cache = { } } , _destroy : function ( ) { s . call ( this ) ; this . flyoutpane && this . flyoutpane . remove ( ) ;
this . input . removeData ( "request.count.suggest" ) ; this . input . removeData ( "flyout.request.count.suggest" ) } , shift _enter : function ( ) { this . options . suggest _new && ( this . suggest _new ( ) , this . hide _all ( ) ) } , hide _all : function ( ) { this . pane . hide ( ) ; this . flyoutpane && this . flyoutpane . hide ( ) ; this . input . trigger ( "fb-pane-hide" , this ) ; this . input . trigger ( "fb-flyoutpane-hide" , this ) } , request : function ( a , b ) { var e = this , g = this . options , d = a , f = g . ac _param . filter || [ ] , i = null ; "string" === c . type ( f ) && ( f = [ f ] ) ; f = f . slice ( ) ; if ( g . advanced ) { var h = c . suggest . parse _input ( d ) ,
d = h [ 0 ] ; h [ 1 ] . length && f . push ( "(all " + h [ 1 ] . join ( " " ) + ")" ) ; i = h [ 2 ] ; c . suggest . check _mql _id ( d ) && ( f . push ( '(any alias{start}:"' + d + '" mid:"' + d + '")' ) , i . prefixed = ! 0 , d = "" ) } h = { } ; h [ g . query _param _name ] = d ; b && ( h . cursor = b ) ; c . extend ( h , g . ac _param , i ) ; f . length && ( h . filter = f ) ; var j = g . service _url + g . service _path + "?" + c . param ( h , ! 0 ) ; if ( d = c . suggest . cache [ j ] ) this . response ( d , b ? b : - 1 , ! 0 ) ; else { clearTimeout ( this . request . timeout ) ; var l = { url : g . service _url + g . service _path , data : h , traditional : ! 0 , beforeSend : function ( ) { var a = e . input . data ( "request.count.suggest" ) ||
0 ; a || e . trackEvent ( e . name , "start_session" ) ; a = a + 1 ; e . trackEvent ( e . name , "request" , "count" , a ) ; e . input . data ( "request.count.suggest" , a ) } , success : function ( d ) { c . suggest . cache [ j ] = d ; d . prefix = a ; e . response ( d , b ? b : - 1 ) } , error : function ( a ) { e . status _error ( ) ; e . trackEvent ( e . name , "request" , "error" , { url : this . url , response : a ? a . responseText : "" } ) ; e . input . trigger ( "fb-error" , Array . prototype . slice . call ( arguments ) ) } , complete : function ( a ) { a && e . trackEvent ( e . name , "request" , "tid" , a . getResponseHeader ( "X-Metaweb-TID" ) ) } , dataType : "jsonp" ,
cache : ! 0 } ; this . request . timeout = setTimeout ( function ( ) { c . ajax ( l ) } , g . xhr _delay ) } } , create _item : function ( a , b ) { var e = this . options . css , g = c ( "<li>" ) . addClass ( e . item ) , d = c ( "<label>" ) . append ( c . suggest . strongify ( a . name || a . id , b . prefix ) ) , f = c ( "<div>" ) . addClass ( e . item _name ) . append ( d ) , i = a . notable ; a . under && c ( ":first" , d ) . append ( c ( "<small>" ) . text ( " (" + a . under + ")" ) ) ; ( null != i && c . suggest . is _system _type ( i . id ) || null != this . options . scoring && "SCHEMA" === this . options . scoring . toUpperCase ( ) ) && c ( ":first" , d ) . append ( c ( "<small>" ) . text ( " (" +
a . id + ")" ) ) ; g . append ( f ) ; e = c ( "<div>" ) . addClass ( e . item _type ) ; i && i . name ? e . text ( i . name ) : this . options . show _id && a . id && e . text ( a . id ) ; f . prepend ( e ) ; return g } , mouseover _item _hook : function ( a ) { a = a . data ( "data.suggest" ) ; this . options . flyout && a && this . flyout _request ( a ) } , check _response : function ( a ) { return a . prefix === this . input . val ( ) } , response _hook : function ( a , b ) { this . flyoutpane && this . flyoutpane . hide ( ) ; 0 < b ? c ( ".fbs-more" , this . pane ) . remove ( ) : this . list . empty ( ) } , show _hook : function ( a , b , e ) { t . apply ( this , [ a ] ) ; var g = this . options ,
d = this , f = this . pane , i = this . list , h = a . result , j = c ( ".fbs-more" , f ) , l = c ( ".fbs-suggestnew" , f ) ; c ( ".fbs-status" , f ) ; var k = a . correction ; if ( k && k . length ) { var n = c ( '<a class="fbs-spell-link" href="#">' ) . append ( k [ 0 ] ) . bind ( "click.suggest" , function ( a ) { a . preventDefault ( ) ; a . stopPropagation ( ) ; d . input . val ( k [ 0 ] ) . trigger ( "textchange" ) } ) ; d . status . empty ( ) . append ( "Search instead for " ) . append ( n ) . show ( ) } h && h . length && "cursor" in a ? ( j . length || ( h = c ( '<a class="fbs-more-link" href="#" title="(Ctrl+m)">view more</a>' ) , j = c ( '<div class="fbs-more">' ) . append ( h ) ,
h . bind ( "click.suggest" , function ( a ) { a . preventDefault ( ) ; a . stopPropagation ( ) ; a = c ( this ) . parent ( ".fbs-more" ) ; d . more ( a . data ( "cursor.suggest" ) ) } ) , i . after ( j ) ) , j . data ( "cursor.suggest" , a . cursor ) , j . show ( ) ) : j . remove ( ) ; g . suggest _new ? ( l . length || ( a = c ( '<button class="fbs-suggestnew-button">' ) , a . text ( g . suggest _new ) , l = c ( '<div class="fbs-suggestnew">' ) . append ( '<div class="fbs-suggestnew-description">Your item not in the list?</div>' ) . append ( a ) . append ( '<span class="fbs-suggestnew-shortcut">(Shift+Enter)</span>' ) . bind ( "click.suggest" ,
function ( a ) { a . stopPropagation ( ) ; d . suggest _new ( a ) } ) , f . append ( l ) ) , l . show ( ) ) : l . remove ( ) ; e && ( e . length && 0 < b ) && ( b = e . prevAll ( ) . length * e . outerHeight ( ) , i . scrollTop ( ) , i . animate ( { scrollTop : b } , "slow" , function ( ) { e . trigger ( "mouseover.suggest" ) } ) ) } , suggest _new : function ( ) { var a = this . input . val ( ) ; "" !== a && ( this . input . data ( "data.suggest" , a ) . trigger ( "fb-select-new" , a ) , this . trackEvent ( this . name , "fb-select-new" , "index" , "new" ) , this . hide _all ( ) ) } , more : function ( a ) { if ( a ) { var b = this . input . data ( "original.suggest" ) ; null !== b && this . input . val ( b ) ;
this . request ( this . input . val ( ) , a ) ; this . trackEvent ( this . name , "more" , "cursor" , a ) } return ! 1 } , flyout _request : function ( a ) { var b = this , e = this . options , g = this . flyoutpane . data ( "data.suggest" ) ; if ( g && a . id === g . id ) this . flyoutpane . is ( ":visible" ) || ( a = this . get _selected ( ) , this . flyout _position ( a ) , this . flyoutpane . show ( ) , this . input . trigger ( "fb-flyoutpane-show" , this ) ) ; else if ( ( g = c . suggest . flyout . cache [ a . id ] ) && g . id && g . html ) this . flyout _response ( g ) ; else { var d = a . id , f = { url : this . flyout _url . replace ( /\$\{id\}/g , a . id ) , traditional : ! 0 ,
beforeSend : function ( ) { var a = b . input . data ( "flyout.request.count.suggest" ) || 0 , a = a + 1 ; b . trackEvent ( b . name , "flyout.request" , "count" , a ) ; b . input . data ( "flyout.request.count.suggest" , a ) } , success : function ( a ) { a [ "req:id" ] = d ; a . result && a . result . length && ( a . html = c . suggest . suggest . create _flyout ( a . result [ 0 ] , b . flyout _image _url ) ) ; c . suggest . flyout . cache [ d ] = a ; b . flyout _response ( a ) } , error : function ( a ) { b . trackEvent ( b . name , "flyout" , "error" , { url : this . url , response : a ? a . responseText : "" } ) } , complete : function ( a ) { a && b . trackEvent ( b . name ,
"flyout" , "tid" , a . getResponseHeader ( "X-Metaweb-TID" ) ) } , dataType : "jsonp" , cache : ! 0 } ; e . flyout _lang && ( f . data = { lang : e . flyout _lang } ) ; clearTimeout ( this . flyout _request . timeout ) ; this . flyout _request . timeout = setTimeout ( function ( ) { c . ajax ( f ) } , e . xhr _delay ) ; this . input . trigger ( "fb-request-flyout" , f ) } } , flyout _response : function ( a ) { var b = this . pane , c = this . get _selected ( ) || [ ] ; if ( b . is ( ":visible" ) && c . length && ( b = c . data ( "data.suggest" ) ) && a [ "req:id" ] === b . id && a . html ) this . flyoutpane . html ( a . html ) , this . flyout _position ( c ) , this . flyoutpane . show ( ) . data ( "data.suggest" ,
b ) , this . input . trigger ( "fb-flyoutpane-show" , this ) } , flyout _position : function ( a ) { if ( ! this . options . flyout _parent ) { var b = this . pane , e = this . flyoutpane , g = this . options . css , d = r , f = parseInt ( e . css ( "top" ) , 10 ) , i = parseInt ( e . css ( "left" ) , 10 ) , h = b . offset ( ) , j = b . outerWidth ( ) , l = e . outerHeight ( ) , k = e . outerWidth ( ) ; if ( "bottom" === this . options . flyout ) d = h , j = this . input . offset ( ) , d . top = h . top < j . top ? d . top - l : d . top + b . outerHeight ( ) , e . addClass ( g . flyoutpane + "-bottom" ) ; else { d = a . offset ( ) ; a = a . outerHeight ( ) ; d . left += j ; var n = d . left + k , b = c ( document . body ) . scrollLeft ( ) ,
m = c ( window ) . width ( ) + b ; d . top = d . top + a - l ; d . top < h . top && ( d . top = h . top ) ; n > m && ( h = d . left - ( j + k ) , h > b && ( d . left = h ) ) ; e . removeClass ( g . flyoutpane + "-bottom" ) } d . top === f && d . left === i || e . css ( { top : d . top , left : d . left } ) } } , hoverout _list : function ( ) { this . flyoutpane && ! this . get _selected ( ) && this . flyoutpane . hide ( ) } } ) ; c . extend ( c . suggest . suggest , { defaults : { filter : null , spell : "always" , exact : ! 1 , scoring : null , lang : null , key : null , prefixed : ! 0 , stemmed : null , format : null , advanced : ! 0 , show _id : ! 0 , query _param _name : "query" , service _url : "https://www.googleapis.com/freebase/v1" ,
service _path : "/search" , align : null , flyout : ! 0 , flyout _service _url : null , flyout _service _path : "/search?filter=(all mid:${id})&output=(notable:/client/summary description type)&key=${key}" , flyout _image _service _url : null , flyout _image _service _path : "/image${id}?maxwidth=75&key=${key}&errorid=/freebase/no_image_png" , flyout _parent : null , suggest _new : null , nomatch : { title : "No suggested matches" , heading : "Tips on getting better suggestions:" , tips : [ "Enter more or fewer characters" , "Add words related to your original search" ,
"Try alternate spellings" , "Check your spelling" ] } , css : { item _type : "fbs-item-type" , flyoutpane : "fbs-flyout-pane" } , xhr _delay : 200 } , get _value : function ( a , b , e ) { if ( null == a || null == b || 0 == b . length ) return null ; c . isArray ( b ) || ( b = [ b ] ) ; var g = null ; c . each ( b , function ( b , c ) { g = a [ c ] ; if ( null == g ) return ! 1 ; a = g ; return ! 0 } ) ; if ( e ) { if ( null == g ) return [ ] ; c . isArray ( g ) || ( g = [ g ] ) ; var d = [ ] ; c . each ( g , function ( a , b ) { if ( "object" === c . type ( b ) ) if ( null != b . name ) b = b . name ; else if ( b . id || b . mid ) b = b . id || b . mid ; else if ( null != b . value ) { var e = [ ] ; c . each ( b , function ( a ,
b ) { "value" !== a && e . push ( b ) } ) ; b = b . value ; e . length && ( b += " (" + e . join ( ", " ) + ")" ) } c . isArray ( b ) && b . length && ( b = b [ 0 ] . value ) ; null != b && d . push ( b ) } ) ; return d } return null == g ? null : g } , is _commons _id : function ( a ) { return /^\/base\// . test ( a ) || /^\/user\// . test ( a ) ? ! 1 : ! 0 } , create _flyout : function ( a , b ) { var e = c . suggest . suggest . get _value , g = c . suggest . is _system _type , d = a . name , f = null , i = null , h = [ ] , j = [ ] , l = { } ; if ( ( f = e ( a , "notable" ) ) && f . name ) j . push ( f . name ) , l [ f . name ] = ! 0 ; f && g ( f . id ) ? f = a . id : ( f = a . mid , i = b . replace ( /\$\{id\}/g , f ) ) ; var g = "freebase" ,
k = e ( a , [ "output" , "description" , "wikipedia" ] , ! 0 ) ; k && k . length ? g = "wikipedia" : k = e ( a , [ "output" , "description" , "freebase" ] , ! 0 ) ; var k = k && k . length ? k [ 0 ] : null , n = e ( a , [ "output" , "notable:/client/summary" ] ) ; if ( n ) { var m = e ( n , "/common/topic/notable_paths" ) ; m && m . length && c . each ( m , function ( a , b ) { var c = e ( n , b , true ) ; if ( c && c . length ) { var d = b . split ( "/" ) . pop ( ) ; h . push ( [ d , c . join ( ", " ) ] ) } } ) } ( m = e ( a , [ "output" , "type" , "/type/object/type" ] , ! 0 ) ) && m . length && c . each ( m , function ( a , b ) { if ( ! l [ b ] ) { j . push ( b ) ; l [ b ] = true } } ) ; var o = c ( '<div class="fbs-flyout-content">' ) ;
d && o . append ( c ( '<h1 id="fbs-flyout-title">' ) . text ( d ) ) ; o . append ( c ( '<h3 class="fbs-topic-properties fbs-flyout-id">' ) . text ( f ) ) ; c . each ( h , function ( a , b ) { o . append ( c ( '<h3 class="fbs-topic-properties">' ) . append ( c ( "<strong>" ) . text ( b [ 0 ] + ": " ) ) . append ( document . createTextNode ( b [ 1 ] ) ) ) } ) ; k && o . append ( c ( '<p class="fbs-topic-article">' ) . append ( c ( '<em class="fbs-citation">' ) . text ( "[" + g + "] " ) ) . append ( document . createTextNode ( k ) ) ) ; i && ( o . children ( ) . addClass ( "fbs-flyout-image-true" ) , o . prepend ( c ( '<img id="fbs-topic-image" class="fbs-flyout-image-true" src="' +
i + '">' ) ) ) ; d = c ( '<span class="fbs-flyout-types">' ) . text ( j . slice ( 0 , 10 ) . join ( ", " ) ) ; d = c ( '<div class="fbs-attribution">' ) . append ( d ) ; return c ( "<div>" ) . append ( o ) . append ( d ) . html ( ) } } ) ; document . createElement ( "input" ) } ) ( jQuery ) ;