Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
O
OpnSense
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kulya
OpnSense
Commits
1e0365fd
Commit
1e0365fd
authored
Jan 22, 2016
by
Ad Schellevis
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(ui) add bootstrap3-typeahead to core
parent
fb059fa7
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
485 additions
and
0 deletions
+485
-0
bootstrap3-typeahead.js
src/opnsense/www/js/bootstrap3-typeahead.js
+484
-0
bootstrap3-typeahead.min.js
src/opnsense/www/js/bootstrap3-typeahead.min.js
+1
-0
No files found.
src/opnsense/www/js/bootstrap3-typeahead.js
0 → 100644
View file @
1e0365fd
/* =============================================================
* bootstrap3-typeahead.js v3.1.0
* https://github.com/bassjobsen/Bootstrap-3-Typeahead
* =============================================================
* Original written by @mdo and @fat
* =============================================================
* Copyright 2014 Bass Jobsen @bassjobsen
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
(
function
(
root
,
factory
)
{
'
use strict
'
;
// CommonJS module is defined
if
(
typeof
module
!==
'
undefined
'
&&
module
.
exports
)
{
module
.
exports
=
factory
(
require
(
'
jquery
'
));
}
// AMD module is defined
else
if
(
typeof
define
===
'
function
'
&&
define
.
amd
)
{
define
([
'
jquery
'
],
function
(
$
)
{
return
factory
(
$
);
});
}
else
{
factory
(
root
.
jQuery
);
}
}(
this
,
function
(
$
)
{
'
use strict
'
;
// jshint laxcomma: true
/* TYPEAHEAD PUBLIC CLASS DEFINITION
* ================================= */
var
Typeahead
=
function
(
element
,
options
)
{
this
.
$element
=
$
(
element
);
this
.
options
=
$
.
extend
({},
$
.
fn
.
typeahead
.
defaults
,
options
);
this
.
matcher
=
this
.
options
.
matcher
||
this
.
matcher
;
this
.
sorter
=
this
.
options
.
sorter
||
this
.
sorter
;
this
.
select
=
this
.
options
.
select
||
this
.
select
;
this
.
autoSelect
=
typeof
this
.
options
.
autoSelect
==
'
boolean
'
?
this
.
options
.
autoSelect
:
true
;
this
.
highlighter
=
this
.
options
.
highlighter
||
this
.
highlighter
;
this
.
render
=
this
.
options
.
render
||
this
.
render
;
this
.
updater
=
this
.
options
.
updater
||
this
.
updater
;
this
.
displayText
=
this
.
options
.
displayText
||
this
.
displayText
;
this
.
source
=
this
.
options
.
source
;
this
.
delay
=
this
.
options
.
delay
;
this
.
$menu
=
$
(
this
.
options
.
menu
);
this
.
$appendTo
=
this
.
options
.
appendTo
?
$
(
this
.
options
.
appendTo
)
:
null
;
this
.
shown
=
false
;
this
.
listen
();
this
.
showHintOnFocus
=
typeof
this
.
options
.
showHintOnFocus
==
'
boolean
'
?
this
.
options
.
showHintOnFocus
:
false
;
this
.
afterSelect
=
this
.
options
.
afterSelect
;
this
.
addItem
=
false
;
};
Typeahead
.
prototype
=
{
constructor
:
Typeahead
,
select
:
function
()
{
var
val
=
this
.
$menu
.
find
(
'
.active
'
).
data
(
'
value
'
);
this
.
$element
.
data
(
'
active
'
,
val
);
if
(
this
.
autoSelect
||
val
)
{
var
newVal
=
this
.
updater
(
val
);
// Updater can be set to any random functions via "options" parameter in constructor above.
// Add null check for cases when upadter returns void or undefined.
if
(
!
newVal
)
{
newVal
=
""
;
}
this
.
$element
.
val
(
this
.
displayText
(
newVal
)
||
newVal
)
.
change
();
this
.
afterSelect
(
newVal
);
}
return
this
.
hide
();
},
updater
:
function
(
item
)
{
return
item
;
},
setSource
:
function
(
source
)
{
this
.
source
=
source
;
},
show
:
function
()
{
var
pos
=
$
.
extend
({},
this
.
$element
.
position
(),
{
height
:
this
.
$element
[
0
].
offsetHeight
}),
scrollHeight
;
scrollHeight
=
typeof
this
.
options
.
scrollHeight
==
'
function
'
?
this
.
options
.
scrollHeight
.
call
()
:
this
.
options
.
scrollHeight
;
var
element
;
if
(
this
.
shown
)
{
element
=
this
.
$menu
;
}
else
if
(
this
.
$appendTo
)
{
element
=
this
.
$menu
.
appendTo
(
this
.
$appendTo
);
}
else
{
element
=
this
.
$menu
.
insertAfter
(
this
.
$element
);
}
element
.
css
({
top
:
pos
.
top
+
pos
.
height
+
scrollHeight
,
left
:
pos
.
left
})
.
show
();
this
.
shown
=
true
;
return
this
;
},
hide
:
function
()
{
this
.
$menu
.
hide
();
this
.
shown
=
false
;
return
this
;
},
lookup
:
function
(
query
)
{
var
items
;
if
(
typeof
(
query
)
!=
'
undefined
'
&&
query
!==
null
)
{
this
.
query
=
query
;
}
else
{
this
.
query
=
this
.
$element
.
val
()
||
''
;
}
if
(
this
.
query
.
length
<
this
.
options
.
minLength
)
{
return
this
.
shown
?
this
.
hide
()
:
this
;
}
var
worker
=
$
.
proxy
(
function
()
{
if
(
$
.
isFunction
(
this
.
source
))
this
.
process
(
this
.
source
(
this
.
query
,
$
.
proxy
(
this
.
process
,
this
)));
else
if
(
this
.
source
)
{
this
.
process
(
this
.
source
);
}
},
this
);
clearTimeout
(
this
.
lookupWorker
);
this
.
lookupWorker
=
setTimeout
(
worker
,
this
.
delay
);
},
process
:
function
(
items
)
{
var
that
=
this
;
items
=
$
.
grep
(
items
,
function
(
item
)
{
return
that
.
matcher
(
item
);
});
items
=
this
.
sorter
(
items
);
if
(
!
items
.
length
&&
!
this
.
options
.
addItem
)
{
return
this
.
shown
?
this
.
hide
()
:
this
;
}
if
(
items
.
length
>
0
)
{
this
.
$element
.
data
(
'
active
'
,
items
[
0
]);
}
else
{
this
.
$element
.
data
(
'
active
'
,
null
);
}
// Add item
if
(
this
.
options
.
addItem
){
items
.
push
(
this
.
options
.
addItem
);
}
if
(
this
.
options
.
items
==
'
all
'
)
{
return
this
.
render
(
items
).
show
();
}
else
{
return
this
.
render
(
items
.
slice
(
0
,
this
.
options
.
items
)).
show
();
}
},
matcher
:
function
(
item
)
{
var
it
=
this
.
displayText
(
item
);
return
~
it
.
toLowerCase
().
indexOf
(
this
.
query
.
toLowerCase
());
},
sorter
:
function
(
items
)
{
var
beginswith
=
[]
,
caseSensitive
=
[]
,
caseInsensitive
=
[]
,
item
;
while
((
item
=
items
.
shift
()))
{
var
it
=
this
.
displayText
(
item
);
if
(
!
it
.
toLowerCase
().
indexOf
(
this
.
query
.
toLowerCase
()))
beginswith
.
push
(
item
);
else
if
(
~
it
.
indexOf
(
this
.
query
))
caseSensitive
.
push
(
item
);
else
caseInsensitive
.
push
(
item
);
}
return
beginswith
.
concat
(
caseSensitive
,
caseInsensitive
);
},
highlighter
:
function
(
item
)
{
var
html
=
$
(
'
<div></div>
'
);
var
query
=
this
.
query
;
var
i
=
item
.
toLowerCase
().
indexOf
(
query
.
toLowerCase
());
var
len
,
leftPart
,
middlePart
,
rightPart
,
strong
;
len
=
query
.
length
;
if
(
len
===
0
){
return
html
.
text
(
item
).
html
();
}
while
(
i
>
-
1
)
{
leftPart
=
item
.
substr
(
0
,
i
);
middlePart
=
item
.
substr
(
i
,
len
);
rightPart
=
item
.
substr
(
i
+
len
);
strong
=
$
(
'
<strong></strong>
'
).
text
(
middlePart
);
html
.
append
(
document
.
createTextNode
(
leftPart
))
.
append
(
strong
);
item
=
rightPart
;
i
=
item
.
toLowerCase
().
indexOf
(
query
.
toLowerCase
());
}
return
html
.
append
(
document
.
createTextNode
(
item
)).
html
();
},
render
:
function
(
items
)
{
var
that
=
this
;
var
self
=
this
;
var
activeFound
=
false
;
items
=
$
(
items
).
map
(
function
(
i
,
item
)
{
var
text
=
self
.
displayText
(
item
);
i
=
$
(
that
.
options
.
item
).
data
(
'
value
'
,
item
);
i
.
find
(
'
a
'
).
html
(
that
.
highlighter
(
text
));
if
(
text
==
self
.
$element
.
val
())
{
i
.
addClass
(
'
active
'
);
self
.
$element
.
data
(
'
active
'
,
item
);
activeFound
=
true
;
}
return
i
[
0
];
});
if
(
this
.
autoSelect
&&
!
activeFound
)
{
items
.
first
().
addClass
(
'
active
'
);
this
.
$element
.
data
(
'
active
'
,
items
.
first
().
data
(
'
value
'
));
}
this
.
$menu
.
html
(
items
);
return
this
;
},
displayText
:
function
(
item
)
{
return
typeof
item
!==
'
undefined
'
&&
typeof
item
.
name
!=
'
undefined
'
&&
item
.
name
||
item
;
},
next
:
function
(
event
)
{
var
active
=
this
.
$menu
.
find
(
'
.active
'
).
removeClass
(
'
active
'
)
,
next
=
active
.
next
();
if
(
!
next
.
length
)
{
next
=
$
(
this
.
$menu
.
find
(
'
li
'
)[
0
]);
}
next
.
addClass
(
'
active
'
);
},
prev
:
function
(
event
)
{
var
active
=
this
.
$menu
.
find
(
'
.active
'
).
removeClass
(
'
active
'
)
,
prev
=
active
.
prev
();
if
(
!
prev
.
length
)
{
prev
=
this
.
$menu
.
find
(
'
li
'
).
last
();
}
prev
.
addClass
(
'
active
'
);
},
listen
:
function
()
{
this
.
$element
.
on
(
'
focus
'
,
$
.
proxy
(
this
.
focus
,
this
))
.
on
(
'
blur
'
,
$
.
proxy
(
this
.
blur
,
this
))
.
on
(
'
keypress
'
,
$
.
proxy
(
this
.
keypress
,
this
))
.
on
(
'
keyup
'
,
$
.
proxy
(
this
.
keyup
,
this
));
if
(
this
.
eventSupported
(
'
keydown
'
))
{
this
.
$element
.
on
(
'
keydown
'
,
$
.
proxy
(
this
.
keydown
,
this
));
}
this
.
$menu
.
on
(
'
click
'
,
$
.
proxy
(
this
.
click
,
this
))
.
on
(
'
mouseenter
'
,
'
li
'
,
$
.
proxy
(
this
.
mouseenter
,
this
))
.
on
(
'
mouseleave
'
,
'
li
'
,
$
.
proxy
(
this
.
mouseleave
,
this
));
},
destroy
:
function
()
{
this
.
$element
.
data
(
'
typeahead
'
,
null
);
this
.
$element
.
data
(
'
active
'
,
null
);
this
.
$element
.
off
(
'
focus
'
)
.
off
(
'
blur
'
)
.
off
(
'
keypress
'
)
.
off
(
'
keyup
'
);
if
(
this
.
eventSupported
(
'
keydown
'
))
{
this
.
$element
.
off
(
'
keydown
'
);
}
this
.
$menu
.
remove
();
},
eventSupported
:
function
(
eventName
)
{
var
isSupported
=
eventName
in
this
.
$element
;
if
(
!
isSupported
)
{
this
.
$element
.
setAttribute
(
eventName
,
'
return;
'
);
isSupported
=
typeof
this
.
$element
[
eventName
]
===
'
function
'
;
}
return
isSupported
;
},
move
:
function
(
e
)
{
if
(
!
this
.
shown
)
return
;
switch
(
e
.
keyCode
)
{
case
9
:
// tab
case
13
:
// enter
case
27
:
// escape
e
.
preventDefault
();
break
;
case
38
:
// up arrow
// with the shiftKey (this is actually the left parenthesis)
if
(
e
.
shiftKey
)
return
;
e
.
preventDefault
();
this
.
prev
();
break
;
case
40
:
// down arrow
// with the shiftKey (this is actually the right parenthesis)
if
(
e
.
shiftKey
)
return
;
e
.
preventDefault
();
this
.
next
();
break
;
}
},
keydown
:
function
(
e
)
{
this
.
suppressKeyPressRepeat
=
~
$
.
inArray
(
e
.
keyCode
,
[
40
,
38
,
9
,
13
,
27
]);
if
(
!
this
.
shown
&&
e
.
keyCode
==
40
)
{
this
.
lookup
();
}
else
{
this
.
move
(
e
);
}
},
keypress
:
function
(
e
)
{
if
(
this
.
suppressKeyPressRepeat
)
return
;
this
.
move
(
e
);
},
keyup
:
function
(
e
)
{
switch
(
e
.
keyCode
)
{
case
40
:
// down arrow
case
38
:
// up arrow
case
16
:
// shift
case
17
:
// ctrl
case
18
:
// alt
break
;
case
9
:
// tab
case
13
:
// enter
if
(
!
this
.
shown
)
return
;
this
.
select
();
break
;
case
27
:
// escape
if
(
!
this
.
shown
)
return
;
this
.
hide
();
break
;
default
:
this
.
lookup
();
}
e
.
preventDefault
();
},
focus
:
function
(
e
)
{
if
(
!
this
.
focused
)
{
this
.
focused
=
true
;
if
(
this
.
options
.
showHintOnFocus
)
{
this
.
lookup
(
''
);
}
}
},
blur
:
function
(
e
)
{
this
.
focused
=
false
;
if
(
!
this
.
mousedover
&&
this
.
shown
)
this
.
hide
();
},
click
:
function
(
e
)
{
e
.
preventDefault
();
this
.
select
();
this
.
$element
.
focus
();
},
mouseenter
:
function
(
e
)
{
this
.
mousedover
=
true
;
this
.
$menu
.
find
(
'
.active
'
).
removeClass
(
'
active
'
);
$
(
e
.
currentTarget
).
addClass
(
'
active
'
);
},
mouseleave
:
function
(
e
)
{
this
.
mousedover
=
false
;
if
(
!
this
.
focused
&&
this
.
shown
)
this
.
hide
();
}
};
/* TYPEAHEAD PLUGIN DEFINITION
* =========================== */
var
old
=
$
.
fn
.
typeahead
;
$
.
fn
.
typeahead
=
function
(
option
)
{
var
arg
=
arguments
;
if
(
typeof
option
==
'
string
'
&&
option
==
'
getActive
'
)
{
return
this
.
data
(
'
active
'
);
}
return
this
.
each
(
function
()
{
var
$this
=
$
(
this
)
,
data
=
$this
.
data
(
'
typeahead
'
)
,
options
=
typeof
option
==
'
object
'
&&
option
;
if
(
!
data
)
$this
.
data
(
'
typeahead
'
,
(
data
=
new
Typeahead
(
this
,
options
)));
if
(
typeof
option
==
'
string
'
)
{
if
(
arg
.
length
>
1
)
{
data
[
option
].
apply
(
data
,
Array
.
prototype
.
slice
.
call
(
arg
,
1
));
}
else
{
data
[
option
]();
}
}
});
};
$
.
fn
.
typeahead
.
defaults
=
{
source
:
[]
,
items
:
8
,
menu
:
'
<ul class="typeahead dropdown-menu" role="listbox"></ul>
'
,
item
:
'
<li><a class="dropdown-item" href="#" role="option"></a></li>
'
,
minLength
:
1
,
scrollHeight
:
0
,
autoSelect
:
true
,
afterSelect
:
$
.
noop
,
addItem
:
false
,
delay
:
0
};
$
.
fn
.
typeahead
.
Constructor
=
Typeahead
;
/* TYPEAHEAD NO CONFLICT
* =================== */
$
.
fn
.
typeahead
.
noConflict
=
function
()
{
$
.
fn
.
typeahead
=
old
;
return
this
;
};
/* TYPEAHEAD DATA-API
* ================== */
$
(
document
).
on
(
'
focus.typeahead.data-api
'
,
'
[data-provide="typeahead"]
'
,
function
(
e
)
{
var
$this
=
$
(
this
);
if
(
$this
.
data
(
'
typeahead
'
))
return
;
$this
.
typeahead
(
$this
.
data
());
});
}));
src/opnsense/www/js/bootstrap3-typeahead.min.js
0 → 100644
View file @
1e0365fd
!
function
(
root
,
factory
){
"
use strict
"
;
"
undefined
"
!=
typeof
module
&&
module
.
exports
?
module
.
exports
=
factory
(
require
(
"
jquery
"
)):
"
function
"
==
typeof
define
&&
define
.
amd
?
define
([
"
jquery
"
],
function
(
$
){
return
factory
(
$
)}):
factory
(
root
.
jQuery
)}(
this
,
function
(
$
){
"
use strict
"
;
var
Typeahead
=
function
(
element
,
options
){
this
.
$element
=
$
(
element
),
this
.
options
=
$
.
extend
({},
$
.
fn
.
typeahead
.
defaults
,
options
),
this
.
matcher
=
this
.
options
.
matcher
||
this
.
matcher
,
this
.
sorter
=
this
.
options
.
sorter
||
this
.
sorter
,
this
.
select
=
this
.
options
.
select
||
this
.
select
,
this
.
autoSelect
=
"
boolean
"
==
typeof
this
.
options
.
autoSelect
?
this
.
options
.
autoSelect
:
!
0
,
this
.
highlighter
=
this
.
options
.
highlighter
||
this
.
highlighter
,
this
.
render
=
this
.
options
.
render
||
this
.
render
,
this
.
updater
=
this
.
options
.
updater
||
this
.
updater
,
this
.
displayText
=
this
.
options
.
displayText
||
this
.
displayText
,
this
.
source
=
this
.
options
.
source
,
this
.
delay
=
this
.
options
.
delay
,
this
.
$menu
=
$
(
this
.
options
.
menu
),
this
.
$appendTo
=
this
.
options
.
appendTo
?
$
(
this
.
options
.
appendTo
):
null
,
this
.
shown
=!
1
,
this
.
listen
(),
this
.
showHintOnFocus
=
"
boolean
"
==
typeof
this
.
options
.
showHintOnFocus
?
this
.
options
.
showHintOnFocus
:
!
1
,
this
.
afterSelect
=
this
.
options
.
afterSelect
,
this
.
addItem
=!
1
};
Typeahead
.
prototype
=
{
constructor
:
Typeahead
,
select
:
function
(){
var
val
=
this
.
$menu
.
find
(
"
.active
"
).
data
(
"
value
"
);
if
(
this
.
$element
.
data
(
"
active
"
,
val
),
this
.
autoSelect
||
val
){
var
newVal
=
this
.
updater
(
val
);
newVal
||
(
newVal
=
""
),
this
.
$element
.
val
(
this
.
displayText
(
newVal
)
||
newVal
).
change
(),
this
.
afterSelect
(
newVal
)}
return
this
.
hide
()},
updater
:
function
(
item
){
return
item
},
setSource
:
function
(
source
){
this
.
source
=
source
},
show
:
function
(){
var
scrollHeight
,
pos
=
$
.
extend
({},
this
.
$element
.
position
(),{
height
:
this
.
$element
[
0
].
offsetHeight
});
scrollHeight
=
"
function
"
==
typeof
this
.
options
.
scrollHeight
?
this
.
options
.
scrollHeight
.
call
():
this
.
options
.
scrollHeight
;
var
element
;
return
element
=
this
.
shown
?
this
.
$menu
:
this
.
$appendTo
?
this
.
$menu
.
appendTo
(
this
.
$appendTo
):
this
.
$menu
.
insertAfter
(
this
.
$element
),
element
.
css
({
top
:
pos
.
top
+
pos
.
height
+
scrollHeight
,
left
:
pos
.
left
}).
show
(),
this
.
shown
=!
0
,
this
},
hide
:
function
(){
return
this
.
$menu
.
hide
(),
this
.
shown
=!
1
,
this
},
lookup
:
function
(
query
){
if
(
"
undefined
"
!=
typeof
query
&&
null
!==
query
?
this
.
query
=
query
:
this
.
query
=
this
.
$element
.
val
()
||
""
,
this
.
query
.
length
<
this
.
options
.
minLength
)
return
this
.
shown
?
this
.
hide
():
this
;
var
worker
=
$
.
proxy
(
function
(){
$
.
isFunction
(
this
.
source
)?
this
.
source
(
this
.
query
,
$
.
proxy
(
this
.
process
,
this
)):
this
.
source
&&
this
.
process
(
this
.
source
)},
this
);
clearTimeout
(
this
.
lookupWorker
),
this
.
lookupWorker
=
setTimeout
(
worker
,
this
.
delay
)},
process
:
function
(
items
){
var
that
=
this
;
return
items
=
$
.
grep
(
items
,
function
(
item
){
return
that
.
matcher
(
item
)}),
items
=
this
.
sorter
(
items
),
items
.
length
||
this
.
options
.
addItem
?(
items
.
length
>
0
?
this
.
$element
.
data
(
"
active
"
,
items
[
0
]):
this
.
$element
.
data
(
"
active
"
,
null
),
this
.
options
.
addItem
&&
items
.
push
(
this
.
options
.
addItem
),
"
all
"
==
this
.
options
.
items
?
this
.
render
(
items
).
show
():
this
.
render
(
items
.
slice
(
0
,
this
.
options
.
items
)).
show
()):
this
.
shown
?
this
.
hide
():
this
},
matcher
:
function
(
item
){
var
it
=
this
.
displayText
(
item
);
return
~
it
.
toLowerCase
().
indexOf
(
this
.
query
.
toLowerCase
())},
sorter
:
function
(
items
){
for
(
var
item
,
beginswith
=
[],
caseSensitive
=
[],
caseInsensitive
=
[];
item
=
items
.
shift
();){
var
it
=
this
.
displayText
(
item
);
it
.
toLowerCase
().
indexOf
(
this
.
query
.
toLowerCase
())?
~
it
.
indexOf
(
this
.
query
)?
caseSensitive
.
push
(
item
):
caseInsensitive
.
push
(
item
):
beginswith
.
push
(
item
)}
return
beginswith
.
concat
(
caseSensitive
,
caseInsensitive
)},
highlighter
:
function
(
item
){
var
len
,
leftPart
,
middlePart
,
rightPart
,
strong
,
html
=
$
(
"
<div></div>
"
),
query
=
this
.
query
,
i
=
item
.
toLowerCase
().
indexOf
(
query
.
toLowerCase
());
if
(
len
=
query
.
length
,
0
===
len
)
return
html
.
text
(
item
).
html
();
for
(;
i
>-
1
;)
leftPart
=
item
.
substr
(
0
,
i
),
middlePart
=
item
.
substr
(
i
,
len
),
rightPart
=
item
.
substr
(
i
+
len
),
strong
=
$
(
"
<strong></strong>
"
).
text
(
middlePart
),
html
.
append
(
document
.
createTextNode
(
leftPart
)).
append
(
strong
),
item
=
rightPart
,
i
=
item
.
toLowerCase
().
indexOf
(
query
.
toLowerCase
());
return
html
.
append
(
document
.
createTextNode
(
item
)).
html
()},
render
:
function
(
items
){
var
that
=
this
,
self
=
this
,
activeFound
=!
1
;
return
items
=
$
(
items
).
map
(
function
(
i
,
item
){
var
text
=
self
.
displayText
(
item
);
return
i
=
$
(
that
.
options
.
item
).
data
(
"
value
"
,
item
),
i
.
find
(
"
a
"
).
html
(
that
.
highlighter
(
text
)),
text
==
self
.
$element
.
val
()
&&
(
i
.
addClass
(
"
active
"
),
self
.
$element
.
data
(
"
active
"
,
item
),
activeFound
=!
0
),
i
[
0
]}),
this
.
autoSelect
&&!
activeFound
&&
(
items
.
first
().
addClass
(
"
active
"
),
this
.
$element
.
data
(
"
active
"
,
items
.
first
().
data
(
"
value
"
))),
this
.
$menu
.
html
(
items
),
this
},
displayText
:
function
(
item
){
return
"
undefined
"
!=
typeof
item
&&
"
undefined
"
!=
typeof
item
.
name
&&
item
.
name
||
item
},
next
:
function
(
event
){
var
active
=
this
.
$menu
.
find
(
"
.active
"
).
removeClass
(
"
active
"
),
next
=
active
.
next
();
next
.
length
||
(
next
=
$
(
this
.
$menu
.
find
(
"
li
"
)[
0
])),
next
.
addClass
(
"
active
"
)},
prev
:
function
(
event
){
var
active
=
this
.
$menu
.
find
(
"
.active
"
).
removeClass
(
"
active
"
),
prev
=
active
.
prev
();
prev
.
length
||
(
prev
=
this
.
$menu
.
find
(
"
li
"
).
last
()),
prev
.
addClass
(
"
active
"
)},
listen
:
function
(){
this
.
$element
.
on
(
"
focus
"
,
$
.
proxy
(
this
.
focus
,
this
)).
on
(
"
blur
"
,
$
.
proxy
(
this
.
blur
,
this
)).
on
(
"
keypress
"
,
$
.
proxy
(
this
.
keypress
,
this
)).
on
(
"
keyup
"
,
$
.
proxy
(
this
.
keyup
,
this
)),
this
.
eventSupported
(
"
keydown
"
)
&&
this
.
$element
.
on
(
"
keydown
"
,
$
.
proxy
(
this
.
keydown
,
this
)),
this
.
$menu
.
on
(
"
click
"
,
$
.
proxy
(
this
.
click
,
this
)).
on
(
"
mouseenter
"
,
"
li
"
,
$
.
proxy
(
this
.
mouseenter
,
this
)).
on
(
"
mouseleave
"
,
"
li
"
,
$
.
proxy
(
this
.
mouseleave
,
this
))},
destroy
:
function
(){
this
.
$element
.
data
(
"
typeahead
"
,
null
),
this
.
$element
.
data
(
"
active
"
,
null
),
this
.
$element
.
off
(
"
focus
"
).
off
(
"
blur
"
).
off
(
"
keypress
"
).
off
(
"
keyup
"
),
this
.
eventSupported
(
"
keydown
"
)
&&
this
.
$element
.
off
(
"
keydown
"
),
this
.
$menu
.
remove
()},
eventSupported
:
function
(
eventName
){
var
isSupported
=
eventName
in
this
.
$element
;
return
isSupported
||
(
this
.
$element
.
setAttribute
(
eventName
,
"
return;
"
),
isSupported
=
"
function
"
==
typeof
this
.
$element
[
eventName
]),
isSupported
},
move
:
function
(
e
){
if
(
this
.
shown
)
switch
(
e
.
keyCode
){
case
9
:
case
13
:
case
27
:
e
.
preventDefault
();
break
;
case
38
:
if
(
e
.
shiftKey
)
return
;
e
.
preventDefault
(),
this
.
prev
();
break
;
case
40
:
if
(
e
.
shiftKey
)
return
;
e
.
preventDefault
(),
this
.
next
()}},
keydown
:
function
(
e
){
this
.
suppressKeyPressRepeat
=~
$
.
inArray
(
e
.
keyCode
,[
40
,
38
,
9
,
13
,
27
]),
this
.
shown
||
40
!=
e
.
keyCode
?
this
.
move
(
e
):
this
.
lookup
()},
keypress
:
function
(
e
){
this
.
suppressKeyPressRepeat
||
this
.
move
(
e
)},
keyup
:
function
(
e
){
switch
(
e
.
keyCode
){
case
40
:
case
38
:
case
16
:
case
17
:
case
18
:
break
;
case
9
:
case
13
:
if
(
!
this
.
shown
)
return
;
this
.
select
();
break
;
case
27
:
if
(
!
this
.
shown
)
return
;
this
.
hide
();
break
;
default
:
this
.
lookup
()}
e
.
preventDefault
()},
focus
:
function
(
e
){
this
.
focused
||
(
this
.
focused
=!
0
,
this
.
options
.
showHintOnFocus
&&
this
.
lookup
(
""
))},
blur
:
function
(
e
){
this
.
focused
=!
1
,
!
this
.
mousedover
&&
this
.
shown
&&
this
.
hide
()},
click
:
function
(
e
){
e
.
preventDefault
(),
this
.
select
(),
this
.
$element
.
focus
()},
mouseenter
:
function
(
e
){
this
.
mousedover
=!
0
,
this
.
$menu
.
find
(
"
.active
"
).
removeClass
(
"
active
"
),
$
(
e
.
currentTarget
).
addClass
(
"
active
"
)},
mouseleave
:
function
(
e
){
this
.
mousedover
=!
1
,
!
this
.
focused
&&
this
.
shown
&&
this
.
hide
()}};
var
old
=
$
.
fn
.
typeahead
;
$
.
fn
.
typeahead
=
function
(
option
){
var
arg
=
arguments
;
return
"
string
"
==
typeof
option
&&
"
getActive
"
==
option
?
this
.
data
(
"
active
"
):
this
.
each
(
function
(){
var
$this
=
$
(
this
),
data
=
$this
.
data
(
"
typeahead
"
),
options
=
"
object
"
==
typeof
option
&&
option
;
data
||
$this
.
data
(
"
typeahead
"
,
data
=
new
Typeahead
(
this
,
options
)),
"
string
"
==
typeof
option
&&
(
arg
.
length
>
1
?
data
[
option
].
apply
(
data
,
Array
.
prototype
.
slice
.
call
(
arg
,
1
)):
data
[
option
]())})},
$
.
fn
.
typeahead
.
defaults
=
{
source
:[],
items
:
8
,
menu
:
'
<ul class="typeahead dropdown-menu" role="listbox"></ul>
'
,
item
:
'
<li><a class="dropdown-item" href="#" role="option"></a></li>
'
,
minLength
:
1
,
scrollHeight
:
0
,
autoSelect
:
!
0
,
afterSelect
:
$
.
noop
,
addItem
:
!
1
,
delay
:
0
},
$
.
fn
.
typeahead
.
Constructor
=
Typeahead
,
$
.
fn
.
typeahead
.
noConflict
=
function
(){
return
$
.
fn
.
typeahead
=
old
,
this
},
$
(
document
).
on
(
"
focus.typeahead.data-api
"
,
'
[data-provide="typeahead"]
'
,
function
(
e
){
var
$this
=
$
(
this
);
$this
.
data
(
"
typeahead
"
)
||
$this
.
typeahead
(
$this
.
data
())})});
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment