]>
git.immae.eu Git - github/shaarli/Shaarli.git/blob - inc/awesomplete.min.js
1 // Awesomplete - Lea Verou - MIT license
2 ( function (){ function h ( a
){ a
= Array
. isArray ( a
)?{ label : a
[ 0 ], value : a
[ 1 ]}: "object" === typeof a
&& "label" in a
&& "value" in a
? a :{ label : a
, value : a
}; this . label
= a
. label
|| a
. value
; this . value
= a
. value
} function n ( a
, b
, d
){ for ( var g
in b
){ var f
= b
[ g
], c
= a
. input
. getAttribute ( "data-" + g
. toLowerCase ()); a
[ g
]= "number" === typeof f
? parseInt ( c
):! 1 === f
? null !== c : f
instanceof Function
? null : c
; a
[ g
]|| 0 === a
[ g
]||( a
[ g
]= g
in d
? d
[ g
]: f
)}} function c ( a
, b
){ return "string" === typeof a
?( b
|| document
). querySelector ( a
): a
|| null } function k ( a
, b
){ return l
. call (( b
||
3 document
). querySelectorAll ( a
))} function m (){ k ( "input.awesomplete" ). forEach ( function ( a
){ new e ( a
)})} var e = function ( a
, b
){ var d
= this ; this . input
= c ( a
); this . input
. setAttribute ( "autocomplete" , "off" ); this . input
. setAttribute ( "aria-autocomplete" , "list" ); b
= b
||{}; n ( this ,{ minChars : 2 , maxItems : 10 , autoFirst :! 1 , data : e
. DATA
, filter : e
. FILTER_CONTAINS
, sort : e
. SORT_BYLENGTH
, item : e
. ITEM
, replace : e
. REPLACE
}, b
); this . index
=- 1 ; this . container
= c
. create ( "div" ,{ className : "awesomplete" , around : a
}); this . ul
= c
. create ( "ul" ,{ hidden : "hidden" ,
4 inside : this . container
}); this . status
= c
. create ( "span" ,{ className : "visually-hidden" , role : "status" , "aria-live" : "assertive" , "aria-relevant" : "additions" , inside : this . container
}); c
. bind ( this . input
,{ input : this . evaluate
. bind ( this ), blur : this . close
. bind ( this ), keydown : function ( a
){ var b
= a
. keyCode
; if ( d
. opened
) if ( 13 === b
&& d
. selected
) a
. preventDefault (), d
. select (); else if ( 27 === b
) d
. close (); else if ( 38 === b
|| 40 === b
) a
. preventDefault (), d
[ 38 === b
? "previous" : "next" ]()}}); c
. bind ( this . input
. form
,{ submit : this . close
. bind ( this )});
5 c
. bind ( this . ul
,{ mousedown : function ( a
){ var b
= a
. target
; if ( b
!== this ){ for (; b
&&! /li/i . test ( b
. nodeName
);) b
= b
. parentNode
; b
&& 0 === a
. button
&&( a
. preventDefault (), d
. select ( b
, a
. target
))}}}); this . input
. hasAttribute ( "list" )?( this . list
= "#" + this . input
. getAttribute ( "list" ), this . input
. removeAttribute ( "list" )): this . list
= this . input
. getAttribute ( "data-list" )|| b
. list
||[]; e
. all
. push ( this )}; e
. prototype ={ set list ( a
){ if ( Array
. isArray ( a
)) this . _list
= a
; else if ( "string" === typeof a
&&- 1 < a
. indexOf ( "," )) this . _list
= a
. split ( /\s*,\s*/ );
6 else if (( a
= c ( a
))&& a
. children
){ var b
=[]; l
. apply ( a
. children
). forEach ( function ( a
){ if (! a
. disabled
){ var c
= a
. textContent
. trim (), f
= a
. value
|| c
; a
= a
. label
|| c
; "" !== f
&& b
. push ({ label : a
, value : f
})}}); this . _list
= b
} document
. activeElement
=== this . input
&& this . evaluate ()}, get selected (){ return - 1 < this . index
}, get opened (){ return ! this . ul
. hasAttribute ( "hidden" )}, close : function (){ this . ul
. setAttribute ( "hidden" , "" ); this . index
=- 1 ; c
. fire ( this . input
, "awesomplete-close" )}, open : function (){ this . ul
. removeAttribute ( "hidden" ); this . autoFirst
&&
7 - 1 === this . index
&& this [ "goto" ]( 0 ); c
. fire ( this . input
, "awesomplete-open" )}, next : function (){ this [ "goto" ]( this . index
< this . ul
. children
. length
- 1 ? this . index
+ 1 :- 1 )}, previous : function (){ var a
= this . ul
. children
. length
; this [ "goto" ]( this . selected
? this . index
- 1 : a
- 1 )}, "goto" : function ( a
){ var b
= this . ul
. children
; this . selected
&& b
[ this . index
]. setAttribute ( "aria-selected" , "false" ); this . index
= a
;- 1 < a
&& 0 < b
. length
&&( b
[ a
]. setAttribute ( "aria-selected" , "true" ), this . status
. textContent
= b
[ a
]. textContent
, c
. fire ( this . input
, "awesomplete-highlight" ,
8 { text : this . suggestions
[ this . index
]}))}, select : function ( a
, b
){ a
? this . index
= c
. siblingIndex ( a
): a
= this . ul
. children
[ this . index
]; if ( a
){ var d
= this . suggestions
[ this . index
]; c
. fire ( this . input
, "awesomplete-select" ,{ text : d
, origin : b
|| a
})&&( this . replace ( d
), this . close (), c
. fire ( this . input
, "awesomplete-selectcomplete" ,{ text : d
}))}}, evaluate : function (){ var a
= this , b
= this . input
. value
; b
. length
>= this . minChars
&& 0 < this . _list
. length
?( this . index
=- 1 , this . ul
. innerHTML
= "" , this . suggestions
= this . _list
. map ( function ( d
){ return new h ( a
. data ( d
,
9 b
))}). filter ( function ( d
){ return a
. filter ( d
, b
)}). sort ( this . sort
). slice ( 0 , this . maxItems
), this . suggestions
. forEach ( function ( d
){ a
. ul
. appendChild ( a
. item ( d
, b
))}), 0 === this . ul
. children
. length
? this . close (): this . open ()): this . close ()}}; e
. all
=[]; e
. FILTER_CONTAINS = function ( a
, b
){ return RegExp ( c
. regExpEscape ( b
. trim ()), "i" ). test ( a
)}; e
. FILTER_STARTSWITH = function ( a
, b
){ return RegExp ( "^" + c
. regExpEscape ( b
. trim ()), "i" ). test ( a
)}; e
. SORT_BYLENGTH = function ( a
, b
){ return a
. length
!== b
. length
? a
. length
- b
. length : a
< b
?- 1 : 1 }; e
. ITEM
=
10 function ( a
, b
){ var d
= "" === b
? a : a
. replace ( RegExp ( c
. regExpEscape ( b
. trim ()), "gi" ), "<mark>$&</mark>" ); return c
. create ( "li" ,{ innerHTML : d
, "aria-selected" : "false" })}; e
. REPLACE = function ( a
){ this . input
. value
= a
. value
}; e
. DATA = function ( a
){ return a
}; Object
. defineProperty ( h
. prototype = Object
. create ( String
. prototype ), "length" ,{ get : function (){ return this . label
. length
}}); h
. prototype . toString
= h
. prototype . valueOf = function (){ return "" + this . label
}; var l
= Array
. prototype . slice
; c
. create = function ( a
, b
){ var d
= document
. createElement ( a
),
11 g
; for ( g
in b
){ var f
= b
[ g
]; "inside" === g
? c ( f
). appendChild ( d
): "around" === g
?( f
= c ( f
), f
. parentNode
. insertBefore ( d
, f
), d
. appendChild ( f
)): g
in d
? d
[ g
]= f : d
. setAttribute ( g
, f
)} return d
}; c
. bind = function ( a
, b
){ if ( a
) for ( var d
in b
){ var c
= b
[ d
]; d
. split ( /\s+/ ). forEach ( function ( b
){ a
. addEventListener ( b
, c
)})}}; c
. fire = function ( a
, b
, c
){ var e
= document
. createEvent ( "HTMLEvents" ); e
. initEvent ( b
,! 0 ,! 0 ); for ( var f
in c
) e
[ f
]= c
[ f
]; return a
. dispatchEvent ( e
)}; c
. regExpEscape = function ( a
){ return a
. replace ( /[-\\^$*+?.()|[\]{}]/g , " \\ $&" )};
12 c
. siblingIndex = function ( a
){ for ( var b
= 0 ; a
= a
. previousElementSibling
; b
++); return b
}; "undefined" !== typeof Document
&&( "loading" !== document
. readyState
? m (): document
. addEventListener ( "DOMContentLoaded" , m
)); e
.$= c
; e
.$$= k
; "undefined" !== typeof self
&&( self
. Awesomplete
= e
); "object" === typeof module
&& module
. exports
&&( module
. exports
= e
); return e
})();