@@ -4,11 +4,27 @@ var autoSuggest = (function(){
44var _currentInputOptions = { } ;
55var _autoSuggestActive = false ;
66
7- var _delayRender = function ( options ) {
8- render ( options ) ;
7+ var mod = { } ;
8+
9+ mod . open = function ( ) {
10+ helper . setObject ( {
11+ object : state . get ( ) ,
12+ path : "autoSuggest" ,
13+ newValue : true
14+ } ) ;
15+ } ;
16+
17+ mod . close = function ( ) {
18+ helper . setObject ( {
19+ object : state . get ( ) ,
20+ path : "autoSuggest" ,
21+ newValue : false
22+ } ) ;
923} ;
1024
11- var bind = function ( override ) {
25+ var bind = { } ;
26+
27+ bind . input = function ( override ) {
1228var options = {
1329input : null ,
1430type : null ,
@@ -21,17 +37,17 @@ var autoSuggest = (function(){
2137options . input . addEventListener ( "focus" , function ( ) {
2238if ( ! _autoSuggestActive ) {
2339clearTimeout ( _timer ) ;
24- _timer = setTimeout ( _delayRender , 300 , options ) ;
40+ _timer = setTimeout ( render . delay , 300 , options ) ;
2541} ;
2642} , false ) ;
2743options . input . addEventListener ( "input" , function ( ) {
2844clearTimeout ( _timer ) ;
29- _timer = setTimeout ( _delayRender , 300 , options ) ;
45+ _timer = setTimeout ( render . delay , 300 , options ) ;
3046} , false ) ;
3147} ;
3248} ;
3349
34- var _navigateResults = function ( event ) {
50+ bind . navigateResults = function ( event ) {
3551var elementToFocus = null ;
3652var focusIndex = null ;
3753var allSuggestItems = helper . eA ( ".auto-suggest-link" ) ;
@@ -108,15 +124,15 @@ var autoSuggest = (function(){
108124if ( ! event . shiftKey && event . keyCode == 9 && document . activeElement == allSuggestItems [ allSuggestItems . length - 1 ] ) {
109125event . preventDefault ( ) ;
110126elementToFocus = _currentInputOptions . postFocus ;
111- destroy ( ) ;
127+ render . close ( ) ;
112128} ;
113129// shift tab
114130if ( event . shiftKey && event . keyCode == 9 && document . activeElement == allSuggestItems [ 0 ] ) {
115131event . preventDefault ( ) ;
116132elementToFocus = _currentInputOptions . input ;
117133} ;
118134if ( event . shiftKey && event . keyCode == 9 && document . activeElement == _currentInputOptions . input ) {
119- destroy ( ) ;
135+ render . close ( ) ;
120136} ;
121137} ;
122138_findInput ( ) ;
@@ -127,71 +143,35 @@ var autoSuggest = (function(){
127143} ;
128144} ;
129145
130- var _addDocumentEvent = function ( ) {
131- document . addEventListener ( "click" , _checkClick , false ) ;
132- document . addEventListener ( "keydown" , _navigateResults , false ) ;
146+ var documentEvent = { } ;
147+
148+ documentEvent . add = function ( ) {
149+ document . addEventListener ( "click" , documentEvent . clickOut , false ) ;
150+ document . addEventListener ( "keydown" , bind . navigateResults , false ) ;
133151} ;
134152
135- var _removeDocumentEvent = function ( ) {
136- document . removeEventListener ( "click" , _checkClick , false ) ;
137- document . removeEventListener ( "keydown" , _navigateResults , false ) ;
153+ documentEvent . remove = function ( ) {
154+ document . removeEventListener ( "click" , documentEvent . clickOut , false ) ;
155+ document . removeEventListener ( "keydown" , bind . navigateResults , false ) ;
138156} ;
139157
140- var _checkClick = function ( event ) {
158+ documentEvent . clickOut = function ( event ) {
141159if ( ! ( event . target . classList . contains ( "auto-suggest-list" ) ) && ! ( event . target . classList . contains ( "auto-suggest-input" ) ) ) {
142- destroy ( ) ;
160+ render . close ( ) ;
143161} ;
144162} ;
145163
146- var destroy = function ( ) {
147- var autoSuggestList = helper . e ( ".auto-suggest-list" ) ;
148- if ( autoSuggestList ) {
149- autoSuggestList . remove ( ) ;
150- _removeDocumentEvent ( ) ;
151- helper . setObject ( {
152- object : state . get ( ) ,
153- path : "autoSuggest" ,
154- newValue : false
155- } ) ;
156- _currentInputOptions = { } ;
157- _autoSuggestActive = false ;
158- } ;
159- } ;
164+ var render = { } ;
160165
161- var _getSuggestItems = function ( ) {
162- var searchTerm = _currentInputOptions . input . value . replace ( / ^ \s + / , "" ) . replace ( / \s + $ / , "" ) . toLowerCase ( ) ;
163- var action = {
164- fontawesomeIcon : function ( ) {
165- if ( searchTerm == "" || searchTerm == undefined ) {
166- return fontawesome . icons ;
167- } else {
168- return fontawesome . icons . filter ( function ( item ) {
169- var match = false ;
170- if ( item . name . toLowerCase ( ) . includes ( searchTerm ) || item . label . toLowerCase ( ) . includes ( searchTerm ) ) {
171- match = true ;
172- } ;
173- item . search . forEach ( function ( item , index ) {
174- if ( item . toLowerCase ( ) . includes ( searchTerm ) ) {
175- match = true ;
176- } ;
177- } ) ;
178- item . styles . forEach ( function ( item , index ) {
179- if ( item . toLowerCase ( ) . includes ( searchTerm ) ) {
180- match = true ;
181- } ;
182- } ) ;
183- return match ;
184- } ) ;
185- } ;
186- }
187- } ;
188- return action [ _currentInputOptions . type ] ( ) ;
166+ render . delay = function ( options ) {
167+ mod . open ( ) ;
168+ render . open ( options ) ;
189169} ;
190170
191- var render = function ( options ) {
171+ render . open = function ( options ) {
192172_currentInputOptions = options ;
193173var body = helper . e ( "body" ) ;
194- var suggestItems = _getSuggestItems ( options ) ;
174+ var suggestItems = render . suggestItems ( options ) ;
195175var _populateList = function ( list ) {
196176var action = {
197177fontawesomeIcon : function ( ) {
@@ -217,8 +197,7 @@ var autoSuggest = (function(){
217197} ;
218198action [ _currentInputOptions . type ] ( ) ;
219199} ;
220-
221- var _render_autoSuggestList = function ( ) {
200+ var _renderAutoSuggestList = function ( ) {
222201var autoSuggestWrapper = helper . e ( ".auto-suggest-wrapper" ) ;
223202var autoSuggestList = helper . e ( ".auto-suggest-list" ) ;
224203if ( autoSuggestList ) {
@@ -234,27 +213,68 @@ var autoSuggest = (function(){
234213var autoSuggestList = helper . node ( "ul|class:auto-suggest-list list-unstyled" ) ;
235214body . appendChild ( autoSuggestList ) ;
236215autoSuggestList . setAttribute ( "style" , "width: " + style . width + "px; top: " + style . top + "px; left: " + style . left + "px;" ) ;
237- _addDocumentEvent ( ) ;
216+ documentEvent . add ( ) ;
238217} ;
239218_populateList ( autoSuggestList ) ;
240219} ;
241220if ( suggestItems . length > 0 ) {
242221_autoSuggestActive = true ;
243- helper . setObject ( {
244- object : state . get ( ) ,
245- path : "autoSuggest" ,
246- newValue : true
247- } ) ;
248- _render_autoSuggestList ( ) ;
222+ _renderAutoSuggestList ( ) ;
249223} else {
250- destroy ( ) ;
224+ render . close ( ) ;
251225} ;
252226} ;
253227
228+ render . close = function ( ) {
229+ mod . close ( ) ;
230+ var autoSuggestList = helper . e ( ".auto-suggest-list" ) ;
231+ if ( autoSuggestList ) {
232+ autoSuggestList . remove ( ) ;
233+ documentEvent . remove ( ) ;
234+ _currentInputOptions = { } ;
235+ _autoSuggestActive = false ;
236+ } ;
237+ } ;
238+
239+ render . suggestItems = function ( ) {
240+ var searchTerm = _currentInputOptions . input . value . replace ( / ^ \s + / , "" ) . replace ( / \s + $ / , "" ) . toLowerCase ( ) ;
241+ var action = {
242+ fontawesomeIcon : function ( ) {
243+ if ( searchTerm == "" || searchTerm == undefined ) {
244+ return fontawesome . icons ;
245+ } else {
246+ return fontawesome . icons . filter ( function ( item ) {
247+ var match = false ;
248+ if ( item . name . toLowerCase ( ) . includes ( searchTerm ) || item . label . toLowerCase ( ) . includes ( searchTerm ) ) {
249+ match = true ;
250+ } ;
251+ item . search . forEach ( function ( item , index ) {
252+ if ( item . toLowerCase ( ) . includes ( searchTerm ) ) {
253+ match = true ;
254+ } ;
255+ } ) ;
256+ item . styles . forEach ( function ( item , index ) {
257+ if ( item . toLowerCase ( ) . includes ( searchTerm ) ) {
258+ match = true ;
259+ } ;
260+ } ) ;
261+ return match ;
262+ } ) ;
263+ } ;
264+ }
265+ } ;
266+ return action [ _currentInputOptions . type ] ( ) ;
267+ } ;
268+
269+ var close = function ( ) {
270+ render . close ( ) ;
271+ } ;
272+
254273// exposed methods
255274return {
256275bind : bind ,
257- destroy : destroy
276+ render : render ,
277+ close : close
258278} ;
259279
260280} ) ( ) ;
0 commit comments