Compare commits
71 commits
Author | SHA1 | Date | |
---|---|---|---|
96c1751d27 | |||
428b55ca5c | |||
f3cf4ff7e2 | |||
fb141af8ac | |||
df3d8c2571 | |||
af26922106 | |||
13f5487733 | |||
b5e1521fe1 | |||
a983801f10 | |||
a3bda96ce9 | |||
18ea6aa7a6 | |||
54aad85b25 | |||
bdd5d3a6ae | |||
7be245ef19 | |||
fe40a09860 | |||
bf79c44a06 | |||
554343e3ea | |||
31a708028d | |||
9cd2fcbb3a | |||
742f008c78 | |||
5d58979891 | |||
b3611d24fc | |||
cd59bcbd77 | |||
3a64fd05c3 | |||
5d5b7bd6fb | |||
82dac4c279 | |||
8ede1f6486 | |||
ead88bcb00 | |||
4262412d01 | |||
39a5ef7ec6 | |||
67ba16b47d | |||
32a1b719f6 | |||
d99cf46f0c | |||
1b9c85d5bc | |||
1abfe52c39 | |||
5714f843d8 | |||
99970f2c4d | |||
2e7e48b725 | |||
e5a32e27ca | |||
19c67ec5e8 | |||
4ddeab1783 | |||
3741c6149e | |||
edd7dac03a | |||
e251aff62a | |||
266274575c | |||
a42cdb77a0 | |||
6659b47b75 | |||
48c3dd229d | |||
873244e4cb | |||
5f201b19ee | |||
b9ab5c5176 | |||
a2c74e01c5 | |||
85f839d767 | |||
3884c55c8b | |||
68722b9070 | |||
0616f2af69 | |||
6d81952999 | |||
cffe5a09a7 | |||
cc9cb2a8e8 | |||
a82baf9fec | |||
2d4430be99 | |||
482db243bc | |||
d1d016a331 | |||
08ef56fef5 | |||
e9d4a2fbf1 | |||
203da6c409 | |||
b281455a14 | |||
3cb8fc1b44 | |||
68c6d991f1 | |||
f20cff7fb1 | |||
200c3e63e2 |
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,2 +1,2 @@
|
|||
.DS_Store
|
||||
node_modules
|
||||
node_modules/
|
176
Cakefile
176
Cakefile
|
@ -1,176 +0,0 @@
|
|||
# Building Chosen requires coffee-script and uglify-js. For
|
||||
# help installing, try:
|
||||
#
|
||||
# `npm -g install coffee-script uglify-js`
|
||||
#
|
||||
fs = require 'fs'
|
||||
path = require 'path'
|
||||
{spawn, exec} = require 'child_process'
|
||||
CoffeeScript = require 'coffee-script'
|
||||
{parser, uglify} = require 'uglify-js'
|
||||
|
||||
javascripts = {
|
||||
'chosen/chosen.jquery.js': [
|
||||
'coffee/lib/select-parser.coffee'
|
||||
'coffee/lib/abstract-chosen.coffee'
|
||||
'coffee/chosen.jquery.coffee'
|
||||
]
|
||||
'chosen/chosen.proto.js': [
|
||||
'coffee/lib/select-parser.coffee'
|
||||
'coffee/lib/abstract-chosen.coffee'
|
||||
'coffee/chosen.proto.coffee'
|
||||
]
|
||||
}
|
||||
|
||||
Array::unique = ->
|
||||
output = {}
|
||||
output[@[key]] = @[key] for key in [0...@length]
|
||||
value for key, value of output
|
||||
|
||||
# Gather a list of unique source files.
|
||||
#
|
||||
source_files = ->
|
||||
all_sources = []
|
||||
for javascript, sources of javascripts
|
||||
for source in sources
|
||||
all_sources.push source
|
||||
all_sources.unique()
|
||||
|
||||
# Get the version number
|
||||
#
|
||||
version = ->
|
||||
"#{fs.readFileSync('VERSION')}".replace /[^0-9a-zA-Z.]*/gm, ''
|
||||
|
||||
version_tag = ->
|
||||
"v#{version()}"
|
||||
|
||||
# Write chosen files with a header
|
||||
#
|
||||
write_chosen_javascript = (filename, body) ->
|
||||
fs.writeFileSync filename, """
|
||||
// Chosen, a Select Box Enhancer for jQuery and Protoype
|
||||
// by Patrick Filler for Harvest, http://getharvest.com
|
||||
//
|
||||
// Version #{version()}
|
||||
// Full source at https://github.com/harvesthq/chosen
|
||||
// Copyright (c) 2011 Harvest http://getharvest.com
|
||||
|
||||
// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
|
||||
// This file is generated by `cake build`, do not edit it by hand.
|
||||
#{body}
|
||||
"""
|
||||
console.log "Wrote #{filename}"
|
||||
|
||||
# Build Chosen.
|
||||
#
|
||||
task 'build', 'build Chosen from source', build = (cb) ->
|
||||
file_name = null; file_contents = null
|
||||
try
|
||||
for javascript, sources of javascripts
|
||||
code = ''
|
||||
for source in sources
|
||||
file_name = source
|
||||
file_contents = "#{fs.readFileSync source}"
|
||||
code += CoffeeScript.compile file_contents
|
||||
write_chosen_javascript javascript, code
|
||||
unless process.env.MINIFY is 'false'
|
||||
write_chosen_javascript javascript.replace(/\.js$/,'.min.js'), (
|
||||
uglify.gen_code uglify.ast_squeeze uglify.ast_mangle parser.parse code
|
||||
)
|
||||
package_npm () ->
|
||||
cb() if typeof cb is 'function'
|
||||
catch e
|
||||
print_error e, file_name, file_contents
|
||||
|
||||
task 'watch', 'watch coffee/ for changes and build Chosen', ->
|
||||
console.log "Watching for changes in coffee/"
|
||||
for file in source_files()
|
||||
# Coffeescript wasn't scoping file correctly-
|
||||
# without this closure the file name displayed
|
||||
# is incorrect.
|
||||
((file) ->
|
||||
fs.watchFile file, (curr, prev) ->
|
||||
if +curr.mtime isnt +prev.mtime
|
||||
console.log "Saw change in #{file}"
|
||||
invoke 'build'
|
||||
)(file)
|
||||
|
||||
task 'package_npm', 'generate the package.json file for npm', package_npm = (cb) ->
|
||||
try
|
||||
package_file = 'package.json'
|
||||
package = JSON.parse("#{fs.readFileSync package_file}")
|
||||
package['version'] = version()
|
||||
fs.writeFileSync package_file, JSON.stringify(package, null, 2)
|
||||
console.log "Wrote #{package_file}"
|
||||
cb() if typeof cb is 'function'
|
||||
catch e
|
||||
print_error e, package_file
|
||||
|
||||
run = (cmd, args, cb, err_cb) ->
|
||||
exec "#{cmd} #{args.join(' ')}", (err, stdout, stderr) ->
|
||||
if err isnt null
|
||||
console.error stderr
|
||||
if typeof err_cb is 'function'
|
||||
err_cb()
|
||||
else
|
||||
throw "Failed command execution (#{err})."
|
||||
else
|
||||
cb(stdout) if typeof cb is 'function'
|
||||
|
||||
with_clean_repo = (cb) ->
|
||||
run 'git', ['diff', '--exit-code'], cb, ->
|
||||
throw 'There are files that need to be committed first.'
|
||||
|
||||
without_existing_tag = (cb) ->
|
||||
run 'git', ['tag'], (stdout) ->
|
||||
if stdout.split("\n").indexOf( version_tag() ) >= 0
|
||||
throw 'This tag has already been committed to the repo.'
|
||||
else
|
||||
cb()
|
||||
|
||||
tag_release = (cb, cb_err) ->
|
||||
run 'git', ['tag', '-a', '-m', "\"Version #{version()}\"", version_tag()], cb, cb_err
|
||||
|
||||
untag_release = (e) ->
|
||||
console.log "Failure to tag caught: #{e}"
|
||||
console.log "Removing tag #{version_tag()}"
|
||||
run 'git', ['tag', '-d', version_tag()]
|
||||
|
||||
push_repo = (args=[], cb, cb_err) ->
|
||||
run 'git', ['push'].concat(args), cb, cb_err
|
||||
|
||||
print_error = (error, file_name, file_contents) ->
|
||||
line = error.message.match /line ([0-9]+):/
|
||||
if line && line[1] && line = parseInt(line[1])
|
||||
contents_lines = file_contents.split "\n"
|
||||
first = if line-4 < 0 then 0 else line-4
|
||||
last = if line+3 > contents_lines.size then contents_lines.size else line+3
|
||||
console.log "Error compiling #{file_name}. \"#{error.message}\"\n"
|
||||
index = 0
|
||||
for line in contents_lines[first...last]
|
||||
index++
|
||||
line_number = first + 1 + index
|
||||
console.log "#{(' ' for [0..(3-(line_number.toString().length))]).join('')} #{line}"
|
||||
else
|
||||
console.log """
|
||||
Error compiling #{file_name}:
|
||||
|
||||
#{error.message}
|
||||
|
||||
"""
|
||||
|
||||
|
||||
|
||||
task 'release', 'build, tag the current release, and push', ->
|
||||
console.log "Trying to tag #{version_tag()}..."
|
||||
with_clean_repo ->
|
||||
without_existing_tag ->
|
||||
build ->
|
||||
tag_release ->
|
||||
push_repo [], ->
|
||||
push_repo ['--tags'], ->
|
||||
console.log "Successfully tagged #{version_tag()}: https://github.com/harvesthq/chosen/tree/#{version_tag()}"
|
||||
|
||||
, untag_release
|
||||
, untag_release
|
||||
, untag_release
|
24
LICENSE.md
24
LICENSE.md
|
@ -1,24 +0,0 @@
|
|||
# Chosen, a Select Box Enhancer for jQuery and Protoype
|
||||
## by Patrick Filler for [Harvest](http://getharvest.com)
|
||||
|
||||
Available for use under the [MIT License](http://en.wikipedia.org/wiki/MIT_License)
|
||||
|
||||
Copyright (c) 2011 by Harvest
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
50
README.md
50
README.md
|
@ -1,50 +0,0 @@
|
|||
# Chosen
|
||||
|
||||
Chosen is a library for making long, unwieldy select boxes more user friendly.
|
||||
|
||||
- jQuery support: 1.4+
|
||||
- Prototype support: 1.7+
|
||||
|
||||
For documentation, usage, and examples, see:
|
||||
http://harvesthq.github.com/chosen
|
||||
|
||||
### Contributing to Chosen
|
||||
|
||||
Contributions and pull requests are very welcome. Please follow these guidelines when submitting new code.
|
||||
|
||||
1. Make all changes in Coffeescript files, **not** JavaScript files.
|
||||
2. For feature changes, update both jQuery *and* Prototype versions
|
||||
3. Use `npm install -d` to install the correct development dependencies.
|
||||
4. Use `cake build` or `cake watch` to generate Chosen's JavaScript file and minified version.
|
||||
5. Don't touch the `VERSION` file
|
||||
6. Submit a Pull Request using GitHub.
|
||||
|
||||
### Using CoffeeScript & Cake
|
||||
|
||||
First, make sure you have the proper CoffeeScript / Cake set-up in place. We have added a package.json that makes this easy:
|
||||
|
||||
```
|
||||
npm install -d
|
||||
```
|
||||
|
||||
This will install `coffee-script` and `uglifyjs`.
|
||||
|
||||
Once you're configured, building the JavasScript from the command line is easy:
|
||||
|
||||
cake build # build Chosen from source
|
||||
cake watch # watch coffee/ for changes and build Chosen
|
||||
|
||||
If you're interested, you can find the recipes in Cakefile.
|
||||
|
||||
|
||||
### Chosen Credits
|
||||
|
||||
- Built by [Harvest](http://www.getharvest.com/). Want to work on projects like this? [We’re hiring](http://www.getharvest.com/careers)!
|
||||
- Concept and development by [Patrick Filler](http://www.patrickfiller.com/)
|
||||
- Design and CSS by [Matthew Lettini](http://matthewlettini.com/)
|
||||
|
||||
### Notable Forks
|
||||
|
||||
- [Chosen for MooTools](https://github.com/julesjanssen/chosen), by Jules Janssen
|
||||
- [Chosen Drupal 7 Module](http://drupal.org/project/chosen), by Pol Dell'Aiera, Arshad Chummun, Bart Feenstra, Kálmán Hosszu, etc.
|
||||
- [Chosen CakePHP Plugin](https://github.com/paulredmond/chosen-cakephp), by Paul Redmond
|
|
@ -24,13 +24,13 @@
|
|||
/* @group Single Chosen */
|
||||
.chzn-container-single .chzn-single {
|
||||
background-color: #ffffff;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 );
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
|
||||
background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
||||
background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
||||
background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
||||
background-image: -ms-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
||||
background-image: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #f4f4f4), color-stop(0.48, #eeeeee), color-stop(0.5, #f6f6f6), color-stop(0.8, #ffffff));
|
||||
background-image: -webkit-linear-gradient(center bottom, #f4f4f4 0%, #eeeeee 48%, #f6f6f6 50%, #ffffff 80%);
|
||||
background-image: -moz-linear-gradient(center bottom, #f4f4f4 0%, #eeeeee 48%, #f6f6f6 50%, #ffffff 80%);
|
||||
background-image: -o-linear-gradient(top, #f4f4f4 0%, #eeeeee 48%, #f6f6f6 50%, #ffffff 80%);
|
||||
background-image: -ms-linear-gradient(top, #f4f4f4 0%, #eeeeee 48%, #f6f6f6 50%, #ffffff 80%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 );
|
||||
background-image: linear-gradient(top, #f4f4f4 0%, #eeeeee 48%, #f6f6f6 50%, #ffffff 80%);
|
||||
-webkit-border-radius: 5px;
|
||||
-moz-border-radius : 5px;
|
||||
border-radius : 5px;
|
||||
|
@ -96,12 +96,12 @@
|
|||
}
|
||||
.chzn-container-single .chzn-search input {
|
||||
background: #fff url('chosen-sprite.png') no-repeat 100% -22px;
|
||||
background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
||||
background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
|
||||
background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||
background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||
background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
|
||||
background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
|
||||
background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
|
||||
margin: 1px 0;
|
||||
padding: 4px 20px 4px 5px;
|
||||
outline: 0;
|
||||
|
@ -127,12 +127,13 @@
|
|||
/* @group Multi Chosen */
|
||||
.chzn-container-multi .chzn-choices {
|
||||
background-color: #fff;
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
||||
background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
|
||||
background-image: -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||
background-image: -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||
background-image: -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
|
||||
background-image: -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 );
|
||||
background-image: linear-gradient(top, #ffffff 85%, #eeeeee 99%);
|
||||
border: 1px solid #aaa;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
@ -177,13 +178,13 @@
|
|||
-webkit-background-clip: padding-box;
|
||||
background-clip : padding-box;
|
||||
background-color: #e4e4e4;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
|
||||
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
||||
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
||||
background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
||||
background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
||||
background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.48, #e8e8e8), color-stop(0.5, #f0f0f0), color-stop(0.8, #f4f4f4));
|
||||
background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, #e8e8e8 48%, #f0f0f0 50%, #f4f4f4 80%);
|
||||
background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, #e8e8e8 48%, #f0f0f0 50%, #f4f4f4 80%);
|
||||
background-image: -o-linear-gradient(top, #eeeeee 0%, #e8e8e8 48%, #f0f0f0 50%, #f4f4f4 80%);
|
||||
background-image: -ms-linear-gradient(top, #eeeeee 0%, #e8e8e8 48%, #f0f0f0 50%, #f4f4f4 80%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#f4f4f4',GradientType=0 );
|
||||
background-image: linear-gradient(top, #eeeeee 0%, #e8e8e8 48%, #f0f0f0 50%, #f4f4f4 80%);
|
||||
-webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
|
||||
-moz-box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
|
||||
box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
|
||||
|
@ -193,6 +194,8 @@
|
|||
padding: 3px 20px 3px 5px;
|
||||
margin: 3px 0 3px 5px;
|
||||
position: relative;
|
||||
}
|
||||
.chzn-container-multi .chzn-choices .search-choice span {
|
||||
cursor: default;
|
||||
}
|
||||
.chzn-container-multi .chzn-choices .search-choice-focus {
|
||||
|
@ -242,13 +245,13 @@
|
|||
}
|
||||
.chzn-container .chzn-results .highlighted {
|
||||
background-color: #3875d7;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 );
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
|
||||
background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
|
||||
background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
|
||||
background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
|
||||
background-image: -ms-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
|
||||
background-image: linear-gradient(top, #3875d7 20%, #2a62bc 90%);
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.1, #2a62bc), color-stop(0.8, #3875d7));
|
||||
background-image: -webkit-linear-gradient(center bottom, #2a62bc 10%, #3875d7 80%);
|
||||
background-image: -moz-linear-gradient(center bottom, #2a62bc 10%, #3875d7 80%);
|
||||
background-image: -o-linear-gradient(bottom, #2a62bc 10%, #3875d7 80%);
|
||||
background-image: -ms-linear-gradient(top, #2a62bc 10%, #3875d7 80%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#2a62bc', endColorstr='#3875d7',GradientType=0 );
|
||||
background-image: linear-gradient(top, #2a62bc 10%, #3875d7 80%);
|
||||
color: #fff;
|
||||
}
|
||||
.chzn-container .chzn-results li em {
|
||||
|
@ -275,7 +278,7 @@
|
|||
}
|
||||
.chzn-container .chzn-results-scroll {
|
||||
background: white;
|
||||
margin: 0 4px;
|
||||
margin: 0px 4px;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
width: 321px; /* This should by dynamic with js */
|
||||
|
@ -313,13 +316,13 @@
|
|||
-o-box-shadow : 0 1px 0 #fff inset;
|
||||
box-shadow : 0 1px 0 #fff inset;
|
||||
background-color: #eee;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 );
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
|
||||
background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
|
||||
background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
|
||||
background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
|
||||
background-image: -ms-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
|
||||
background-image: linear-gradient(top, #eeeeee 20%, #ffffff 80%);
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.2, white), color-stop(0.8, #eeeeee));
|
||||
background-image: -webkit-linear-gradient(center bottom, white 20%, #eeeeee 80%);
|
||||
background-image: -moz-linear-gradient(center bottom, white 20%, #eeeeee 80%);
|
||||
background-image: -o-linear-gradient(bottom, white 20%, #eeeeee 80%);
|
||||
background-image: -ms-linear-gradient(top, #ffffff 20%,#eeeeee 80%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 );
|
||||
background-image: linear-gradient(top, #ffffff 20%,#eeeeee 80%);
|
||||
-webkit-border-bottom-left-radius : 0;
|
||||
-webkit-border-bottom-right-radius: 0;
|
||||
-moz-border-radius-bottomleft : 0;
|
||||
|
@ -359,31 +362,29 @@
|
|||
}
|
||||
|
||||
/* @group Right to Left */
|
||||
.chzn-rtl { text-align: right; }
|
||||
.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; }
|
||||
.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; }
|
||||
.chzn-rtl { direction:rtl;text-align: right; }
|
||||
.chzn-rtl .chzn-single { padding-left: 0; padding-right: 8px; }
|
||||
.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; }
|
||||
|
||||
.chzn-rtl .chzn-single div { left: 3px; right: auto; }
|
||||
.chzn-rtl .chzn-single abbr {
|
||||
left: 26px;
|
||||
right: auto;
|
||||
}
|
||||
.chzn-rtl .chzn-choices .search-field input { direction: rtl; }
|
||||
.chzn-rtl .chzn-choices li { float: right; }
|
||||
.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; }
|
||||
.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; background-position: right top;}
|
||||
.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; }
|
||||
.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; }
|
||||
.chzn-rtl.chzn-container-single .chzn-results { margin-left: 4px; margin-right: 0; padding-left: 0; padding-right: 4px; }
|
||||
.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 20px; }
|
||||
.chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; }
|
||||
.chzn-rtl .chzn-search input {
|
||||
background: #fff url('chosen-sprite.png') no-repeat -38px -22px;
|
||||
background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
||||
background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('chosen-sprite.png') no-repeat -38px -22px, #ffffff;
|
||||
background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
|
||||
background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||
background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||
background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
|
||||
background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
|
||||
background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
|
||||
padding: 4px 5px 4px 20px;
|
||||
direction: rtl;
|
||||
}
|
||||
/* @end */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// Chosen, a Select Box Enhancer for jQuery and Protoype
|
||||
// by Patrick Filler for Harvest, http://getharvest.com
|
||||
//
|
||||
// Version 0.9.7
|
||||
// Version 0.9.6
|
||||
// Full source at https://github.com/harvesthq/chosen
|
||||
// Copyright (c) 2011 Harvest http://getharvest.com
|
||||
|
||||
|
@ -9,14 +9,11 @@
|
|||
// This file is generated by `cake build`, do not edit it by hand.
|
||||
(function() {
|
||||
var SelectParser;
|
||||
|
||||
SelectParser = (function() {
|
||||
|
||||
function SelectParser() {
|
||||
this.options_index = 0;
|
||||
this.parsed = [];
|
||||
}
|
||||
|
||||
SelectParser.prototype.add_node = function(child) {
|
||||
if (child.nodeName === "OPTGROUP") {
|
||||
return this.add_group(child);
|
||||
|
@ -24,7 +21,6 @@
|
|||
return this.add_option(child);
|
||||
}
|
||||
};
|
||||
|
||||
SelectParser.prototype.add_group = function(group) {
|
||||
var group_position, option, _i, _len, _ref, _results;
|
||||
group_position = this.parsed.length;
|
||||
|
@ -43,11 +39,12 @@
|
|||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
|
||||
if (option.nodeName === "OPTION") {
|
||||
if (option.text !== "") {
|
||||
if (group_position != null) this.parsed[group_position].children += 1;
|
||||
if (group_position != null) {
|
||||
this.parsed[group_position].children += 1;
|
||||
}
|
||||
this.parsed.push({
|
||||
array_index: this.parsed.length,
|
||||
options_index: this.options_index,
|
||||
|
@ -70,11 +67,8 @@
|
|||
return this.options_index += 1;
|
||||
}
|
||||
};
|
||||
|
||||
return SelectParser;
|
||||
|
||||
})();
|
||||
|
||||
SelectParser.select_to_array = function(select) {
|
||||
var child, parser, _i, _len, _ref;
|
||||
parser = new SelectParser();
|
||||
|
@ -85,23 +79,17 @@
|
|||
}
|
||||
return parser.parsed;
|
||||
};
|
||||
|
||||
this.SelectParser = SelectParser;
|
||||
|
||||
}).call(this);
|
||||
|
||||
/*
|
||||
Chosen source: generate output using 'cake build'
|
||||
Copyright (c) 2011 by Harvest
|
||||
*/
|
||||
|
||||
(function() {
|
||||
/*
|
||||
Chosen source: generate output using 'cake build'
|
||||
Copyright (c) 2011 by Harvest
|
||||
*/
|
||||
var AbstractChosen, root;
|
||||
|
||||
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
||||
root = this;
|
||||
|
||||
AbstractChosen = (function() {
|
||||
|
||||
function AbstractChosen(form_field, options) {
|
||||
this.form_field = form_field;
|
||||
this.options = options != null ? options : {};
|
||||
|
@ -113,15 +101,13 @@ Copyright (c) 2011 by Harvest
|
|||
this.register_observers();
|
||||
this.finish_setup();
|
||||
}
|
||||
|
||||
AbstractChosen.prototype.set_default_values = function() {
|
||||
var _this = this;
|
||||
this.click_test_action = function(evt) {
|
||||
return _this.test_active_click(evt);
|
||||
};
|
||||
this.activate_action = function(evt) {
|
||||
return _this.activate_field(evt);
|
||||
};
|
||||
this.click_test_action = __bind(function(evt) {
|
||||
return this.test_active_click(evt);
|
||||
}, this);
|
||||
this.activate_action = __bind(function(evt) {
|
||||
return this.activate_field(evt);
|
||||
}, this);
|
||||
this.active_field = false;
|
||||
this.mouse_on_container = false;
|
||||
this.results_showing = false;
|
||||
|
@ -132,55 +118,52 @@ Copyright (c) 2011 by Harvest
|
|||
this.choices = 0;
|
||||
return this.results_none_found = this.options.no_results_text || "No results match";
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.mouse_enter = function() {
|
||||
return this.mouse_on_container = true;
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.mouse_leave = function() {
|
||||
return this.mouse_on_container = false;
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.input_focus = function(evt) {
|
||||
var _this = this;
|
||||
if (!this.active_field) {
|
||||
return setTimeout((function() {
|
||||
return _this.container_mousedown();
|
||||
}), 50);
|
||||
return setTimeout((__bind(function() {
|
||||
return this.container_mousedown();
|
||||
}, this)), 50);
|
||||
}
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.input_blur = function(evt) {
|
||||
var _this = this;
|
||||
if (!this.mouse_on_container) {
|
||||
this.active_field = false;
|
||||
return setTimeout((function() {
|
||||
return _this.blur_test();
|
||||
}), 100);
|
||||
return setTimeout((__bind(function() {
|
||||
return this.blur_test();
|
||||
}, this)), 100);
|
||||
}
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.result_add_option = function(option) {
|
||||
var classes, style;
|
||||
if (!option.disabled) {
|
||||
option.dom_id = this.container_id + "_o_" + option.array_index;
|
||||
classes = option.selected && this.is_multiple ? [] : ["active-result"];
|
||||
if (option.selected) classes.push("result-selected");
|
||||
if (option.group_array_index != null) classes.push("group-option");
|
||||
if (option.classes !== "") classes.push(option.classes);
|
||||
if (option.selected) {
|
||||
classes.push("result-selected");
|
||||
}
|
||||
if (option.group_array_index != null) {
|
||||
classes.push("group-option");
|
||||
}
|
||||
if (option.classes !== "") {
|
||||
classes.push(option.classes);
|
||||
}
|
||||
style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
|
||||
return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.results_update_field = function() {
|
||||
this.result_clear_highlight();
|
||||
this.result_single_selected = null;
|
||||
return this.results_build();
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.results_toggle = function() {
|
||||
if (this.results_showing) {
|
||||
return this.results_hide();
|
||||
|
@ -188,7 +171,6 @@ Copyright (c) 2011 by Harvest
|
|||
return this.results_show();
|
||||
}
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.results_search = function(evt) {
|
||||
if (this.results_showing) {
|
||||
return this.winnow_results();
|
||||
|
@ -196,7 +178,6 @@ Copyright (c) 2011 by Harvest
|
|||
return this.results_show();
|
||||
}
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.keyup_checker = function(evt) {
|
||||
var stroke, _ref;
|
||||
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
|
||||
|
@ -212,10 +193,14 @@ Copyright (c) 2011 by Harvest
|
|||
break;
|
||||
case 13:
|
||||
evt.preventDefault();
|
||||
if (this.results_showing) return this.result_select(evt);
|
||||
if (this.results_showing) {
|
||||
return this.result_select(evt);
|
||||
}
|
||||
break;
|
||||
case 27:
|
||||
if (this.results_showing) this.results_hide();
|
||||
if (this.results_showing) {
|
||||
this.results_hide();
|
||||
}
|
||||
return true;
|
||||
case 9:
|
||||
case 38:
|
||||
|
@ -228,71 +213,62 @@ Copyright (c) 2011 by Harvest
|
|||
return this.results_search();
|
||||
}
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.generate_field_id = function() {
|
||||
var new_id;
|
||||
new_id = this.generate_random_id();
|
||||
this.form_field.id = new_id;
|
||||
return new_id;
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.generate_random_char = function() {
|
||||
var chars, newchar, rand;
|
||||
chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ";
|
||||
rand = Math.floor(Math.random() * chars.length);
|
||||
return newchar = chars.substring(rand, rand + 1);
|
||||
};
|
||||
|
||||
return AbstractChosen;
|
||||
|
||||
})();
|
||||
|
||||
root.AbstractChosen = AbstractChosen;
|
||||
|
||||
}).call(this);
|
||||
|
||||
/*
|
||||
Chosen source: generate output using 'cake build'
|
||||
Copyright (c) 2011 by Harvest
|
||||
*/
|
||||
|
||||
(function() {
|
||||
var $, Chosen, get_side_border_padding, root,
|
||||
__hasProp = Object.prototype.hasOwnProperty,
|
||||
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
|
||||
|
||||
/*
|
||||
Chosen source: generate output using 'cake build'
|
||||
Copyright (c) 2011 by Harvest
|
||||
*/
|
||||
var $, Chosen, get_side_border_padding, root;
|
||||
var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
|
||||
for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
|
||||
function ctor() { this.constructor = child; }
|
||||
ctor.prototype = parent.prototype;
|
||||
child.prototype = new ctor;
|
||||
child.__super__ = parent.prototype;
|
||||
return child;
|
||||
}, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
||||
root = this;
|
||||
|
||||
$ = jQuery;
|
||||
|
||||
$.fn.extend({
|
||||
chosen: function(options) {
|
||||
if ($.browser.msie && ($.browser.version === "6.0" || $.browser.version === "7.0")) {
|
||||
return this;
|
||||
}
|
||||
return $(this).each(function(input_field) {
|
||||
if (!($(this)).hasClass("chzn-done")) return new Chosen(this, options);
|
||||
if (!($(this)).hasClass("chzn-done")) {
|
||||
return new Chosen(this, options);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
Chosen = (function(_super) {
|
||||
|
||||
__extends(Chosen, _super);
|
||||
|
||||
Chosen = (function() {
|
||||
__extends(Chosen, AbstractChosen);
|
||||
function Chosen() {
|
||||
Chosen.__super__.constructor.apply(this, arguments);
|
||||
}
|
||||
|
||||
Chosen.prototype.setup = function() {
|
||||
this.form_field_jq = $(this.form_field);
|
||||
return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl");
|
||||
};
|
||||
|
||||
Chosen.prototype.finish_setup = function() {
|
||||
return this.form_field_jq.addClass("chzn-done");
|
||||
};
|
||||
|
||||
Chosen.prototype.set_up_html = function() {
|
||||
var container_div, dd_top, dd_width, sf_width;
|
||||
this.container_id = this.form_field.id.length ? this.form_field.id.replace(/(:|\.)/g, '_') : this.generate_field_id();
|
||||
|
@ -340,56 +316,53 @@ Copyright (c) 2011 by Harvest
|
|||
chosen: this
|
||||
});
|
||||
};
|
||||
|
||||
Chosen.prototype.register_observers = function() {
|
||||
var _this = this;
|
||||
this.container.mousedown(function(evt) {
|
||||
return _this.container_mousedown(evt);
|
||||
});
|
||||
this.container.mouseup(function(evt) {
|
||||
return _this.container_mouseup(evt);
|
||||
});
|
||||
this.container.mouseenter(function(evt) {
|
||||
return _this.mouse_enter(evt);
|
||||
});
|
||||
this.container.mouseleave(function(evt) {
|
||||
return _this.mouse_leave(evt);
|
||||
});
|
||||
this.search_results.mouseup(function(evt) {
|
||||
return _this.search_results_mouseup(evt);
|
||||
});
|
||||
this.search_results.mouseover(function(evt) {
|
||||
return _this.search_results_mouseover(evt);
|
||||
});
|
||||
this.search_results.mouseout(function(evt) {
|
||||
return _this.search_results_mouseout(evt);
|
||||
});
|
||||
this.form_field_jq.bind("liszt:updated", function(evt) {
|
||||
return _this.results_update_field(evt);
|
||||
});
|
||||
this.search_field.blur(function(evt) {
|
||||
return _this.input_blur(evt);
|
||||
});
|
||||
this.search_field.keyup(function(evt) {
|
||||
return _this.keyup_checker(evt);
|
||||
});
|
||||
this.search_field.keydown(function(evt) {
|
||||
return _this.keydown_checker(evt);
|
||||
});
|
||||
this.container.mousedown(__bind(function(evt) {
|
||||
return this.container_mousedown(evt);
|
||||
}, this));
|
||||
this.container.mouseup(__bind(function(evt) {
|
||||
return this.container_mouseup(evt);
|
||||
}, this));
|
||||
this.container.mouseenter(__bind(function(evt) {
|
||||
return this.mouse_enter(evt);
|
||||
}, this));
|
||||
this.container.mouseleave(__bind(function(evt) {
|
||||
return this.mouse_leave(evt);
|
||||
}, this));
|
||||
this.search_results.mouseup(__bind(function(evt) {
|
||||
return this.search_results_mouseup(evt);
|
||||
}, this));
|
||||
this.search_results.mouseover(__bind(function(evt) {
|
||||
return this.search_results_mouseover(evt);
|
||||
}, this));
|
||||
this.search_results.mouseout(__bind(function(evt) {
|
||||
return this.search_results_mouseout(evt);
|
||||
}, this));
|
||||
this.form_field_jq.bind("liszt:updated", __bind(function(evt) {
|
||||
return this.results_update_field(evt);
|
||||
}, this));
|
||||
this.search_field.blur(__bind(function(evt) {
|
||||
return this.input_blur(evt);
|
||||
}, this));
|
||||
this.search_field.keyup(__bind(function(evt) {
|
||||
return this.keyup_checker(evt);
|
||||
}, this));
|
||||
this.search_field.keydown(__bind(function(evt) {
|
||||
return this.keydown_checker(evt);
|
||||
}, this));
|
||||
if (this.is_multiple) {
|
||||
this.search_choices.click(function(evt) {
|
||||
return _this.choices_click(evt);
|
||||
});
|
||||
return this.search_field.focus(function(evt) {
|
||||
return _this.input_focus(evt);
|
||||
});
|
||||
this.search_choices.click(__bind(function(evt) {
|
||||
return this.choices_click(evt);
|
||||
}, this));
|
||||
return this.search_field.focus(__bind(function(evt) {
|
||||
return this.input_focus(evt);
|
||||
}, this));
|
||||
} else {
|
||||
return this.container.click(function(evt) {
|
||||
return this.container.click(__bind(function(evt) {
|
||||
return evt.preventDefault();
|
||||
});
|
||||
}, this));
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.search_field_disabled = function() {
|
||||
this.is_disabled = this.form_field_jq[0].disabled;
|
||||
if (this.is_disabled) {
|
||||
|
@ -407,15 +380,18 @@ Copyright (c) 2011 by Harvest
|
|||
}
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.container_mousedown = function(evt) {
|
||||
var target_closelink;
|
||||
if (!this.is_disabled) {
|
||||
target_closelink = evt != null ? ($(evt.target)).hasClass("search-choice-close") : false;
|
||||
if (evt && evt.type === "mousedown") evt.stopPropagation();
|
||||
if (evt && evt.type === "mousedown") {
|
||||
evt.stopPropagation();
|
||||
}
|
||||
if (!this.pending_destroy_click && !target_closelink) {
|
||||
if (!this.active_field) {
|
||||
if (this.is_multiple) this.search_field.val("");
|
||||
if (this.is_multiple) {
|
||||
this.search_field.val("");
|
||||
}
|
||||
$(document).click(this.click_test_action);
|
||||
this.results_show();
|
||||
} else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chzn-single").length)) {
|
||||
|
@ -428,17 +404,16 @@ Copyright (c) 2011 by Harvest
|
|||
}
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.container_mouseup = function(evt) {
|
||||
if (evt.target.nodeName === "ABBR") return this.results_reset(evt);
|
||||
if (evt.target.nodeName === "ABBR") {
|
||||
return this.results_reset(evt);
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.blur_test = function(evt) {
|
||||
if (!this.active_field && this.container.hasClass("chzn-container-active")) {
|
||||
return this.close_field();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.close_field = function() {
|
||||
$(document).unbind("click", this.click_test_action);
|
||||
if (!this.is_multiple) {
|
||||
|
@ -453,7 +428,6 @@ Copyright (c) 2011 by Harvest
|
|||
this.show_search_field_default();
|
||||
return this.search_field_scale();
|
||||
};
|
||||
|
||||
Chosen.prototype.activate_field = function() {
|
||||
if (!this.is_multiple && !this.active_field) {
|
||||
this.search_field.attr("tabindex", this.selected_item.attr("tabindex"));
|
||||
|
@ -464,7 +438,6 @@ Copyright (c) 2011 by Harvest
|
|||
this.search_field.val(this.search_field.val());
|
||||
return this.search_field.focus();
|
||||
};
|
||||
|
||||
Chosen.prototype.test_active_click = function(evt) {
|
||||
if ($(evt.target).parents('#' + this.container_id).length) {
|
||||
return this.active_field = true;
|
||||
|
@ -472,7 +445,6 @@ Copyright (c) 2011 by Harvest
|
|||
return this.close_field();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.results_build = function() {
|
||||
var content, data, _i, _len, _ref;
|
||||
this.parsing = true;
|
||||
|
@ -500,7 +472,9 @@ Copyright (c) 2011 by Harvest
|
|||
this.choice_build(data);
|
||||
} else if (data.selected && !this.is_multiple) {
|
||||
this.selected_item.find("span").text(data.text);
|
||||
if (this.allow_single_deselect) this.single_deselect_control_build();
|
||||
if (this.allow_single_deselect) {
|
||||
this.single_deselect_control_build();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -510,7 +484,6 @@ Copyright (c) 2011 by Harvest
|
|||
this.search_results.html(content);
|
||||
return this.parsing = false;
|
||||
};
|
||||
|
||||
Chosen.prototype.result_add_group = function(group) {
|
||||
if (!group.disabled) {
|
||||
group.dom_id = this.container_id + "_g_" + group.array_index;
|
||||
|
@ -519,7 +492,6 @@ Copyright (c) 2011 by Harvest
|
|||
return "";
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.result_do_highlight = function(el) {
|
||||
var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
|
||||
if (el.length) {
|
||||
|
@ -538,12 +510,12 @@ Copyright (c) 2011 by Harvest
|
|||
}
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.result_clear_highlight = function() {
|
||||
if (this.result_highlight) this.result_highlight.removeClass("highlighted");
|
||||
if (this.result_highlight) {
|
||||
this.result_highlight.removeClass("highlighted");
|
||||
}
|
||||
return this.result_highlight = null;
|
||||
};
|
||||
|
||||
Chosen.prototype.results_show = function() {
|
||||
var dd_top;
|
||||
if (!this.is_multiple) {
|
||||
|
@ -562,7 +534,6 @@ Copyright (c) 2011 by Harvest
|
|||
this.search_field.val(this.search_field.val());
|
||||
return this.winnow_results();
|
||||
};
|
||||
|
||||
Chosen.prototype.results_hide = function() {
|
||||
if (!this.is_multiple) {
|
||||
this.selected_item.removeClass("chzn-single-with-drop");
|
||||
|
@ -573,7 +544,6 @@ Copyright (c) 2011 by Harvest
|
|||
});
|
||||
return this.results_showing = false;
|
||||
};
|
||||
|
||||
Chosen.prototype.set_tab_index = function(el) {
|
||||
var ti;
|
||||
if (this.form_field_jq.attr("tabindex")) {
|
||||
|
@ -587,7 +557,6 @@ Copyright (c) 2011 by Harvest
|
|||
}
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.show_search_field_default = function() {
|
||||
if (this.is_multiple && this.choices < 1 && !this.active_field) {
|
||||
this.search_field.val(this.default_text);
|
||||
|
@ -597,7 +566,6 @@ Copyright (c) 2011 by Harvest
|
|||
return this.search_field.removeClass("default");
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.search_results_mouseup = function(evt) {
|
||||
var target;
|
||||
target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
|
||||
|
@ -606,38 +574,34 @@ Copyright (c) 2011 by Harvest
|
|||
return this.result_select(evt);
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.search_results_mouseover = function(evt) {
|
||||
var target;
|
||||
target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
|
||||
if (target) return this.result_do_highlight(target);
|
||||
if (target) {
|
||||
return this.result_do_highlight(target);
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.search_results_mouseout = function(evt) {
|
||||
if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
|
||||
return this.result_clear_highlight();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.choices_click = function(evt) {
|
||||
evt.preventDefault();
|
||||
if (this.active_field && !($(evt.target).hasClass("search-choice" || $(evt.target).parents('.search-choice').first)) && !this.results_showing) {
|
||||
return this.results_show();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.choice_build = function(item) {
|
||||
var choice_id, link,
|
||||
_this = this;
|
||||
var choice_id, link;
|
||||
choice_id = this.container_id + "_c_" + item.array_index;
|
||||
this.choices += 1;
|
||||
this.search_container.before('<li class="search-choice" id="' + choice_id + '"><span>' + item.html + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>');
|
||||
link = $('#' + choice_id).find("a").first();
|
||||
return link.click(function(evt) {
|
||||
return _this.choice_destroy_link_click(evt);
|
||||
});
|
||||
return link.click(__bind(function(evt) {
|
||||
return this.choice_destroy_link_click(evt);
|
||||
}, this));
|
||||
};
|
||||
|
||||
Chosen.prototype.choice_destroy_link_click = function(evt) {
|
||||
evt.preventDefault();
|
||||
if (!this.is_disabled) {
|
||||
|
@ -647,7 +611,6 @@ Copyright (c) 2011 by Harvest
|
|||
return evt.stopPropagation;
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.choice_destroy = function(link) {
|
||||
this.choices -= 1;
|
||||
this.show_search_field_default();
|
||||
|
@ -657,16 +620,16 @@ Copyright (c) 2011 by Harvest
|
|||
this.result_deselect(link.attr("rel"));
|
||||
return link.parents('li').first().remove();
|
||||
};
|
||||
|
||||
Chosen.prototype.results_reset = function(evt) {
|
||||
this.form_field.options[0].selected = true;
|
||||
this.selected_item.find("span").text(this.default_text);
|
||||
this.show_search_field_default();
|
||||
$(evt.target).remove();
|
||||
this.form_field_jq.trigger("change");
|
||||
if (this.active_field) return this.results_hide();
|
||||
if (this.active_field) {
|
||||
return this.results_hide();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.result_select = function(evt) {
|
||||
var high, high_id, item, position;
|
||||
if (this.result_highlight) {
|
||||
|
@ -688,23 +651,24 @@ Copyright (c) 2011 by Harvest
|
|||
this.choice_build(item);
|
||||
} else {
|
||||
this.selected_item.find("span").first().text(item.text);
|
||||
if (this.allow_single_deselect) this.single_deselect_control_build();
|
||||
if (this.allow_single_deselect) {
|
||||
this.single_deselect_control_build();
|
||||
}
|
||||
}
|
||||
if (!(evt.metaKey && this.is_multiple)) {
|
||||
this.results_hide();
|
||||
}
|
||||
if (!(evt.metaKey && this.is_multiple)) this.results_hide();
|
||||
this.search_field.val("");
|
||||
this.form_field_jq.trigger("change");
|
||||
return this.search_field_scale();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.result_activate = function(el) {
|
||||
return el.addClass("active-result");
|
||||
};
|
||||
|
||||
Chosen.prototype.result_deactivate = function(el) {
|
||||
return el.removeClass("active-result");
|
||||
};
|
||||
|
||||
Chosen.prototype.result_deselect = function(pos) {
|
||||
var result, result_data;
|
||||
result_data = this.results_data[pos];
|
||||
|
@ -717,13 +681,11 @@ Copyright (c) 2011 by Harvest
|
|||
this.form_field_jq.trigger("change");
|
||||
return this.search_field_scale();
|
||||
};
|
||||
|
||||
Chosen.prototype.single_deselect_control_build = function() {
|
||||
if (this.allow_single_deselect && this.selected_item.find("abbr").length < 1) {
|
||||
return this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.winnow_results = function() {
|
||||
var found, option, part, parts, regex, result, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len2, _ref;
|
||||
this.no_results_clear();
|
||||
|
@ -784,7 +746,6 @@ Copyright (c) 2011 by Harvest
|
|||
return this.winnow_results_set_highlight();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.winnow_results_clear = function() {
|
||||
var li, lis, _i, _len, _results;
|
||||
this.search_field.val("");
|
||||
|
@ -793,49 +754,46 @@ Copyright (c) 2011 by Harvest
|
|||
for (_i = 0, _len = lis.length; _i < _len; _i++) {
|
||||
li = lis[_i];
|
||||
li = $(li);
|
||||
if (li.hasClass("group-result")) {
|
||||
_results.push(li.css('display', 'auto'));
|
||||
} else if (!this.is_multiple || !li.hasClass("result-selected")) {
|
||||
_results.push(this.result_activate(li));
|
||||
} else {
|
||||
_results.push(void 0);
|
||||
}
|
||||
_results.push(li.hasClass("group-result") ? li.css('display', 'auto') : !this.is_multiple || !li.hasClass("result-selected") ? this.result_activate(li) : void 0);
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
Chosen.prototype.winnow_results_set_highlight = function() {
|
||||
var do_high, selected_results;
|
||||
if (!this.result_highlight) {
|
||||
selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
|
||||
do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
|
||||
if (do_high != null) return this.result_do_highlight(do_high);
|
||||
if (do_high != null) {
|
||||
return this.result_do_highlight(do_high);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.no_results = function(terms) {
|
||||
var no_results_html;
|
||||
no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
|
||||
no_results_html.find("span").first().html(terms);
|
||||
return this.search_results.append(no_results_html);
|
||||
};
|
||||
|
||||
Chosen.prototype.no_results_clear = function() {
|
||||
return this.search_results.find(".no-results").remove();
|
||||
};
|
||||
|
||||
Chosen.prototype.keydown_arrow = function() {
|
||||
var first_active, next_sib;
|
||||
if (!this.result_highlight) {
|
||||
first_active = this.search_results.find("li.active-result").first();
|
||||
if (first_active) this.result_do_highlight($(first_active));
|
||||
if (first_active) {
|
||||
this.result_do_highlight($(first_active));
|
||||
}
|
||||
} else if (this.results_showing) {
|
||||
next_sib = this.result_highlight.nextAll("li.active-result").first();
|
||||
if (next_sib) this.result_do_highlight(next_sib);
|
||||
if (next_sib) {
|
||||
this.result_do_highlight(next_sib);
|
||||
}
|
||||
}
|
||||
if (!this.results_showing) {
|
||||
return this.results_show();
|
||||
}
|
||||
if (!this.results_showing) return this.results_show();
|
||||
};
|
||||
|
||||
Chosen.prototype.keyup_arrow = function() {
|
||||
var prev_sibs;
|
||||
if (!this.results_showing && !this.is_multiple) {
|
||||
|
@ -845,12 +803,13 @@ Copyright (c) 2011 by Harvest
|
|||
if (prev_sibs.length) {
|
||||
return this.result_do_highlight(prev_sibs.first());
|
||||
} else {
|
||||
if (this.choices > 0) this.results_hide();
|
||||
if (this.choices > 0) {
|
||||
this.results_hide();
|
||||
}
|
||||
return this.result_clear_highlight();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.keydown_backstroke = function() {
|
||||
if (this.pending_backstroke) {
|
||||
this.choice_destroy(this.pending_backstroke.find("a").first());
|
||||
|
@ -860,25 +819,27 @@ Copyright (c) 2011 by Harvest
|
|||
return this.pending_backstroke.addClass("search-choice-focus");
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.clear_backstroke = function() {
|
||||
if (this.pending_backstroke) {
|
||||
this.pending_backstroke.removeClass("search-choice-focus");
|
||||
}
|
||||
return this.pending_backstroke = null;
|
||||
};
|
||||
|
||||
Chosen.prototype.keydown_checker = function(evt) {
|
||||
var stroke, _ref;
|
||||
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
|
||||
this.search_field_scale();
|
||||
if (stroke !== 8 && this.pending_backstroke) this.clear_backstroke();
|
||||
if (stroke !== 8 && this.pending_backstroke) {
|
||||
this.clear_backstroke();
|
||||
}
|
||||
switch (stroke) {
|
||||
case 8:
|
||||
this.backstroke_length = this.search_field.val().length;
|
||||
break;
|
||||
case 9:
|
||||
if (this.results_showing && !this.is_multiple) this.result_select(evt);
|
||||
if (this.results_showing && !this.is_multiple) {
|
||||
this.result_select(evt);
|
||||
}
|
||||
this.mouse_on_container = false;
|
||||
break;
|
||||
case 13:
|
||||
|
@ -893,7 +854,6 @@ Copyright (c) 2011 by Harvest
|
|||
break;
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.search_field_scale = function() {
|
||||
var dd_top, div, h, style, style_block, styles, w, _i, _len;
|
||||
if (this.is_multiple) {
|
||||
|
@ -912,7 +872,9 @@ Copyright (c) 2011 by Harvest
|
|||
$('body').append(div);
|
||||
w = div.width() + 25;
|
||||
div.remove();
|
||||
if (w > this.f_width - 10) w = this.f_width - 10;
|
||||
if (w > this.f_width - 10) {
|
||||
w = this.f_width - 10;
|
||||
}
|
||||
this.search_field.css({
|
||||
'width': w + 'px'
|
||||
});
|
||||
|
@ -922,7 +884,6 @@ Copyright (c) 2011 by Harvest
|
|||
});
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.generate_random_id = function() {
|
||||
var string;
|
||||
string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char();
|
||||
|
@ -931,16 +892,11 @@ Copyright (c) 2011 by Harvest
|
|||
}
|
||||
return string;
|
||||
};
|
||||
|
||||
return Chosen;
|
||||
|
||||
})(AbstractChosen);
|
||||
|
||||
})();
|
||||
get_side_border_padding = function(elmt) {
|
||||
var side_border_padding;
|
||||
return side_border_padding = elmt.outerWidth() - elmt.width();
|
||||
};
|
||||
|
||||
root.get_side_border_padding = get_side_border_padding;
|
||||
|
||||
}).call(this);
|
||||
|
|
10
chosen/chosen.jquery.min.js
vendored
10
chosen/chosen.jquery.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -1,960 +0,0 @@
|
|||
// Chosen, a Select Box Enhancer for jQuery and Protoype
|
||||
// by Patrick Filler for Harvest, http://getharvest.com
|
||||
//
|
||||
// Version 0.9.7
|
||||
// Full source at https://github.com/harvesthq/chosen
|
||||
// Copyright (c) 2011 Harvest http://getharvest.com
|
||||
|
||||
// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
|
||||
// This file is generated by `cake build`, do not edit it by hand.
|
||||
(function() {
|
||||
var SelectParser;
|
||||
|
||||
SelectParser = (function() {
|
||||
|
||||
function SelectParser() {
|
||||
this.options_index = 0;
|
||||
this.parsed = [];
|
||||
}
|
||||
|
||||
SelectParser.prototype.add_node = function(child) {
|
||||
if (child.nodeName === "OPTGROUP") {
|
||||
return this.add_group(child);
|
||||
} else {
|
||||
return this.add_option(child);
|
||||
}
|
||||
};
|
||||
|
||||
SelectParser.prototype.add_group = function(group) {
|
||||
var group_position, option, _i, _len, _ref, _results;
|
||||
group_position = this.parsed.length;
|
||||
this.parsed.push({
|
||||
array_index: group_position,
|
||||
group: true,
|
||||
label: group.label,
|
||||
children: 0,
|
||||
disabled: group.disabled
|
||||
});
|
||||
_ref = group.childNodes;
|
||||
_results = [];
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
option = _ref[_i];
|
||||
_results.push(this.add_option(option, group_position, group.disabled));
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
|
||||
if (option.nodeName === "OPTION") {
|
||||
if (option.text !== "") {
|
||||
if (group_position != null) this.parsed[group_position].children += 1;
|
||||
this.parsed.push({
|
||||
array_index: this.parsed.length,
|
||||
options_index: this.options_index,
|
||||
value: option.value,
|
||||
text: option.text,
|
||||
html: option.innerHTML,
|
||||
selected: option.selected,
|
||||
disabled: group_disabled === true ? group_disabled : option.disabled,
|
||||
group_array_index: group_position,
|
||||
classes: option.className,
|
||||
style: option.style.cssText
|
||||
});
|
||||
} else {
|
||||
this.parsed.push({
|
||||
array_index: this.parsed.length,
|
||||
options_index: this.options_index,
|
||||
empty: true
|
||||
});
|
||||
}
|
||||
return this.options_index += 1;
|
||||
}
|
||||
};
|
||||
|
||||
return SelectParser;
|
||||
|
||||
})();
|
||||
|
||||
SelectParser.select_to_array = function(select) {
|
||||
var child, parser, _i, _len, _ref;
|
||||
parser = new SelectParser();
|
||||
_ref = select.childNodes;
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
child = _ref[_i];
|
||||
parser.add_node(child);
|
||||
}
|
||||
return parser.parsed;
|
||||
};
|
||||
|
||||
this.SelectParser = SelectParser;
|
||||
|
||||
}).call(this);
|
||||
|
||||
/*
|
||||
Chosen source: generate output using 'cake build'
|
||||
Copyright (c) 2011 by Harvest
|
||||
*/
|
||||
|
||||
(function() {
|
||||
var AbstractChosen, root;
|
||||
|
||||
root = this;
|
||||
|
||||
AbstractChosen = (function() {
|
||||
|
||||
function AbstractChosen(form_field, options) {
|
||||
this.form_field = form_field;
|
||||
this.options = options != null ? options : {};
|
||||
this.set_default_values();
|
||||
this.is_multiple = this.form_field.multiple;
|
||||
this.default_text_default = this.is_multiple ? "Select Some Options" : "Select an Option";
|
||||
this.setup();
|
||||
this.set_up_html();
|
||||
this.register_observers();
|
||||
this.finish_setup();
|
||||
}
|
||||
|
||||
AbstractChosen.prototype.set_default_values = function() {
|
||||
var _this = this;
|
||||
this.click_test_action = function(evt) {
|
||||
return _this.test_active_click(evt);
|
||||
};
|
||||
this.activate_action = function(evt) {
|
||||
return _this.activate_field(evt);
|
||||
};
|
||||
this.active_field = false;
|
||||
this.mouse_on_container = false;
|
||||
this.results_showing = false;
|
||||
this.result_highlighted = null;
|
||||
this.result_single_selected = null;
|
||||
this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
|
||||
this.disable_search_threshold = this.options.disable_search_threshold || 0;
|
||||
this.choices = 0;
|
||||
return this.results_none_found = this.options.no_results_text || "No results match";
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.mouse_enter = function() {
|
||||
return this.mouse_on_container = true;
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.mouse_leave = function() {
|
||||
return this.mouse_on_container = false;
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.input_focus = function(evt) {
|
||||
var _this = this;
|
||||
if (!this.active_field) {
|
||||
return setTimeout((function() {
|
||||
return _this.container_mousedown();
|
||||
}), 50);
|
||||
}
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.input_blur = function(evt) {
|
||||
var _this = this;
|
||||
if (!this.mouse_on_container) {
|
||||
this.active_field = false;
|
||||
return setTimeout((function() {
|
||||
return _this.blur_test();
|
||||
}), 100);
|
||||
}
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.result_add_option = function(option) {
|
||||
var classes, style;
|
||||
if (!option.disabled) {
|
||||
option.dom_id = this.container_id + "_o_" + option.array_index;
|
||||
classes = option.selected && this.is_multiple ? [] : ["active-result"];
|
||||
if (option.selected) classes.push("result-selected");
|
||||
if (option.group_array_index != null) classes.push("group-option");
|
||||
if (option.classes !== "") classes.push(option.classes);
|
||||
style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
|
||||
return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.results_update_field = function() {
|
||||
this.result_clear_highlight();
|
||||
this.result_single_selected = null;
|
||||
return this.results_build();
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.results_toggle = function() {
|
||||
if (this.results_showing) {
|
||||
return this.results_hide();
|
||||
} else {
|
||||
return this.results_show();
|
||||
}
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.results_search = function(evt) {
|
||||
if (this.results_showing) {
|
||||
return this.winnow_results();
|
||||
} else {
|
||||
return this.results_show();
|
||||
}
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.keyup_checker = function(evt) {
|
||||
var stroke, _ref;
|
||||
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
|
||||
this.search_field_scale();
|
||||
switch (stroke) {
|
||||
case 8:
|
||||
if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
|
||||
return this.keydown_backstroke();
|
||||
} else if (!this.pending_backstroke) {
|
||||
this.result_clear_highlight();
|
||||
return this.results_search();
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
evt.preventDefault();
|
||||
if (this.results_showing) return this.result_select(evt);
|
||||
break;
|
||||
case 27:
|
||||
if (this.results_showing) this.results_hide();
|
||||
return true;
|
||||
case 9:
|
||||
case 38:
|
||||
case 40:
|
||||
case 16:
|
||||
case 91:
|
||||
case 17:
|
||||
break;
|
||||
default:
|
||||
return this.results_search();
|
||||
}
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.generate_field_id = function() {
|
||||
var new_id;
|
||||
new_id = this.generate_random_id();
|
||||
this.form_field.id = new_id;
|
||||
return new_id;
|
||||
};
|
||||
|
||||
AbstractChosen.prototype.generate_random_char = function() {
|
||||
var chars, newchar, rand;
|
||||
chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ";
|
||||
rand = Math.floor(Math.random() * chars.length);
|
||||
return newchar = chars.substring(rand, rand + 1);
|
||||
};
|
||||
|
||||
return AbstractChosen;
|
||||
|
||||
})();
|
||||
|
||||
root.AbstractChosen = AbstractChosen;
|
||||
|
||||
}).call(this);
|
||||
|
||||
/*
|
||||
Chosen source: generate output using 'cake build'
|
||||
Copyright (c) 2011 by Harvest
|
||||
*/
|
||||
|
||||
(function() {
|
||||
var Chosen, get_side_border_padding, root,
|
||||
__hasProp = Object.prototype.hasOwnProperty,
|
||||
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
|
||||
|
||||
root = this;
|
||||
|
||||
Chosen = (function(_super) {
|
||||
|
||||
__extends(Chosen, _super);
|
||||
|
||||
function Chosen() {
|
||||
Chosen.__super__.constructor.apply(this, arguments);
|
||||
}
|
||||
|
||||
Chosen.prototype.setup = function() {
|
||||
return this.is_rtl = this.form_field.hasClassName("chzn-rtl");
|
||||
};
|
||||
|
||||
Chosen.prototype.finish_setup = function() {
|
||||
return this.form_field.addClassName("chzn-done");
|
||||
};
|
||||
|
||||
Chosen.prototype.set_default_values = function() {
|
||||
Chosen.__super__.set_default_values.call(this);
|
||||
this.single_temp = new Template('<a href="javascript:void(0)" class="chzn-single"><span>#{default}</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>');
|
||||
this.multi_temp = new Template('<ul class="chzn-choices"><li class="search-field"><input type="text" value="#{default}" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>');
|
||||
this.choice_temp = new Template('<li class="search-choice" id="#{id}"><span>#{choice}</span><a href="javascript:void(0)" class="search-choice-close" rel="#{position}"></a></li>');
|
||||
return this.no_results_temp = new Template('<li class="no-results">' + this.results_none_found + ' "<span>#{terms}</span>"</li>');
|
||||
};
|
||||
|
||||
Chosen.prototype.set_up_html = function() {
|
||||
var base_template, container_props, dd_top, dd_width, sf_width;
|
||||
this.container_id = this.form_field.identify().replace(/(:|\.)/g, '_') + "_chzn";
|
||||
this.f_width = this.form_field.getStyle("width") ? parseInt(this.form_field.getStyle("width"), 10) : this.form_field.getWidth();
|
||||
container_props = {
|
||||
'id': this.container_id,
|
||||
'class': "chzn-container" + (this.is_rtl ? ' chzn-rtl' : ''),
|
||||
'style': 'width: ' + this.f_width + 'px'
|
||||
};
|
||||
this.default_text = this.form_field.readAttribute('data-placeholder') ? this.form_field.readAttribute('data-placeholder') : this.default_text_default;
|
||||
base_template = this.is_multiple ? new Element('div', container_props).update(this.multi_temp.evaluate({
|
||||
"default": this.default_text
|
||||
})) : new Element('div', container_props).update(this.single_temp.evaluate({
|
||||
"default": this.default_text
|
||||
}));
|
||||
this.form_field.hide().insert({
|
||||
after: base_template
|
||||
});
|
||||
this.container = $(this.container_id);
|
||||
this.container.addClassName("chzn-container-" + (this.is_multiple ? "multi" : "single"));
|
||||
this.dropdown = this.container.down('div.chzn-drop');
|
||||
dd_top = this.container.getHeight();
|
||||
dd_width = this.f_width - get_side_border_padding(this.dropdown);
|
||||
this.dropdown.setStyle({
|
||||
"width": dd_width + "px",
|
||||
"top": dd_top + "px"
|
||||
});
|
||||
this.search_field = this.container.down('input');
|
||||
this.search_results = this.container.down('ul.chzn-results');
|
||||
this.search_field_scale();
|
||||
this.search_no_results = this.container.down('li.no-results');
|
||||
if (this.is_multiple) {
|
||||
this.search_choices = this.container.down('ul.chzn-choices');
|
||||
this.search_container = this.container.down('li.search-field');
|
||||
} else {
|
||||
this.search_container = this.container.down('div.chzn-search');
|
||||
this.selected_item = this.container.down('.chzn-single');
|
||||
sf_width = dd_width - get_side_border_padding(this.search_container) - get_side_border_padding(this.search_field);
|
||||
this.search_field.setStyle({
|
||||
"width": sf_width + "px"
|
||||
});
|
||||
}
|
||||
this.results_build();
|
||||
this.set_tab_index();
|
||||
return this.form_field.fire("liszt:ready", {
|
||||
chosen: this
|
||||
});
|
||||
};
|
||||
|
||||
Chosen.prototype.register_observers = function() {
|
||||
var _this = this;
|
||||
this.container.observe("mousedown", function(evt) {
|
||||
return _this.container_mousedown(evt);
|
||||
});
|
||||
this.container.observe("mouseup", function(evt) {
|
||||
return _this.container_mouseup(evt);
|
||||
});
|
||||
this.container.observe("mouseenter", function(evt) {
|
||||
return _this.mouse_enter(evt);
|
||||
});
|
||||
this.container.observe("mouseleave", function(evt) {
|
||||
return _this.mouse_leave(evt);
|
||||
});
|
||||
this.search_results.observe("mouseup", function(evt) {
|
||||
return _this.search_results_mouseup(evt);
|
||||
});
|
||||
this.search_results.observe("mouseover", function(evt) {
|
||||
return _this.search_results_mouseover(evt);
|
||||
});
|
||||
this.search_results.observe("mouseout", function(evt) {
|
||||
return _this.search_results_mouseout(evt);
|
||||
});
|
||||
this.form_field.observe("liszt:updated", function(evt) {
|
||||
return _this.results_update_field(evt);
|
||||
});
|
||||
this.search_field.observe("blur", function(evt) {
|
||||
return _this.input_blur(evt);
|
||||
});
|
||||
this.search_field.observe("keyup", function(evt) {
|
||||
return _this.keyup_checker(evt);
|
||||
});
|
||||
this.search_field.observe("keydown", function(evt) {
|
||||
return _this.keydown_checker(evt);
|
||||
});
|
||||
if (this.is_multiple) {
|
||||
this.search_choices.observe("click", function(evt) {
|
||||
return _this.choices_click(evt);
|
||||
});
|
||||
return this.search_field.observe("focus", function(evt) {
|
||||
return _this.input_focus(evt);
|
||||
});
|
||||
} else {
|
||||
return this.container.observe("click", function(evt) {
|
||||
return evt.preventDefault();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.search_field_disabled = function() {
|
||||
this.is_disabled = this.form_field.disabled;
|
||||
if (this.is_disabled) {
|
||||
this.container.addClassName('chzn-disabled');
|
||||
this.search_field.disabled = true;
|
||||
if (!this.is_multiple) {
|
||||
this.selected_item.stopObserving("focus", this.activate_action);
|
||||
}
|
||||
return this.close_field();
|
||||
} else {
|
||||
this.container.removeClassName('chzn-disabled');
|
||||
this.search_field.disabled = false;
|
||||
if (!this.is_multiple) {
|
||||
return this.selected_item.observe("focus", this.activate_action);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.container_mousedown = function(evt) {
|
||||
var target_closelink;
|
||||
if (!this.is_disabled) {
|
||||
target_closelink = evt != null ? evt.target.hasClassName("search-choice-close") : false;
|
||||
if (evt && evt.type === "mousedown") evt.stop();
|
||||
if (!this.pending_destroy_click && !target_closelink) {
|
||||
if (!this.active_field) {
|
||||
if (this.is_multiple) this.search_field.clear();
|
||||
document.observe("click", this.click_test_action);
|
||||
this.results_show();
|
||||
} else if (!this.is_multiple && evt && (evt.target === this.selected_item || evt.target.up("a.chzn-single"))) {
|
||||
this.results_toggle();
|
||||
}
|
||||
return this.activate_field();
|
||||
} else {
|
||||
return this.pending_destroy_click = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.container_mouseup = function(evt) {
|
||||
if (evt.target.nodeName === "ABBR") return this.results_reset(evt);
|
||||
};
|
||||
|
||||
Chosen.prototype.blur_test = function(evt) {
|
||||
if (!this.active_field && this.container.hasClassName("chzn-container-active")) {
|
||||
return this.close_field();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.close_field = function() {
|
||||
document.stopObserving("click", this.click_test_action);
|
||||
if (!this.is_multiple) {
|
||||
this.selected_item.tabIndex = this.search_field.tabIndex;
|
||||
this.search_field.tabIndex = -1;
|
||||
}
|
||||
this.active_field = false;
|
||||
this.results_hide();
|
||||
this.container.removeClassName("chzn-container-active");
|
||||
this.winnow_results_clear();
|
||||
this.clear_backstroke();
|
||||
this.show_search_field_default();
|
||||
return this.search_field_scale();
|
||||
};
|
||||
|
||||
Chosen.prototype.activate_field = function() {
|
||||
if (!this.is_multiple && !this.active_field) {
|
||||
this.search_field.tabIndex = this.selected_item.tabIndex;
|
||||
this.selected_item.tabIndex = -1;
|
||||
}
|
||||
this.container.addClassName("chzn-container-active");
|
||||
this.active_field = true;
|
||||
this.search_field.value = this.search_field.value;
|
||||
return this.search_field.focus();
|
||||
};
|
||||
|
||||
Chosen.prototype.test_active_click = function(evt) {
|
||||
if (evt.target.up('#' + this.container_id)) {
|
||||
return this.active_field = true;
|
||||
} else {
|
||||
return this.close_field();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.results_build = function() {
|
||||
var content, data, _i, _len, _ref;
|
||||
this.parsing = true;
|
||||
this.results_data = root.SelectParser.select_to_array(this.form_field);
|
||||
if (this.is_multiple && this.choices > 0) {
|
||||
this.search_choices.select("li.search-choice").invoke("remove");
|
||||
this.choices = 0;
|
||||
} else if (!this.is_multiple) {
|
||||
this.selected_item.down("span").update(this.default_text);
|
||||
if (this.form_field.options.length <= this.disable_search_threshold) {
|
||||
this.container.addClassName("chzn-container-single-nosearch");
|
||||
} else {
|
||||
this.container.removeClassName("chzn-container-single-nosearch");
|
||||
}
|
||||
}
|
||||
content = '';
|
||||
_ref = this.results_data;
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
data = _ref[_i];
|
||||
if (data.group) {
|
||||
content += this.result_add_group(data);
|
||||
} else if (!data.empty) {
|
||||
content += this.result_add_option(data);
|
||||
if (data.selected && this.is_multiple) {
|
||||
this.choice_build(data);
|
||||
} else if (data.selected && !this.is_multiple) {
|
||||
this.selected_item.down("span").update(data.html);
|
||||
if (this.allow_single_deselect) this.single_deselect_control_build();
|
||||
}
|
||||
}
|
||||
}
|
||||
this.search_field_disabled();
|
||||
this.show_search_field_default();
|
||||
this.search_field_scale();
|
||||
this.search_results.update(content);
|
||||
return this.parsing = false;
|
||||
};
|
||||
|
||||
Chosen.prototype.result_add_group = function(group) {
|
||||
if (!group.disabled) {
|
||||
group.dom_id = this.container_id + "_g_" + group.array_index;
|
||||
return '<li id="' + group.dom_id + '" class="group-result">' + group.label.escapeHTML() + '</li>';
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.result_do_highlight = function(el) {
|
||||
var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
|
||||
this.result_clear_highlight();
|
||||
this.result_highlight = el;
|
||||
this.result_highlight.addClassName("highlighted");
|
||||
maxHeight = parseInt(this.search_results.getStyle('maxHeight'), 10);
|
||||
visible_top = this.search_results.scrollTop;
|
||||
visible_bottom = maxHeight + visible_top;
|
||||
high_top = this.result_highlight.positionedOffset().top;
|
||||
high_bottom = high_top + this.result_highlight.getHeight();
|
||||
if (high_bottom >= visible_bottom) {
|
||||
return this.search_results.scrollTop = (high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0;
|
||||
} else if (high_top < visible_top) {
|
||||
return this.search_results.scrollTop = high_top;
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.result_clear_highlight = function() {
|
||||
if (this.result_highlight) {
|
||||
this.result_highlight.removeClassName('highlighted');
|
||||
}
|
||||
return this.result_highlight = null;
|
||||
};
|
||||
|
||||
Chosen.prototype.results_show = function() {
|
||||
var dd_top;
|
||||
if (!this.is_multiple) {
|
||||
this.selected_item.addClassName('chzn-single-with-drop');
|
||||
if (this.result_single_selected) {
|
||||
this.result_do_highlight(this.result_single_selected);
|
||||
}
|
||||
}
|
||||
dd_top = this.is_multiple ? this.container.getHeight() : this.container.getHeight() - 1;
|
||||
this.dropdown.setStyle({
|
||||
"top": dd_top + "px",
|
||||
"left": 0
|
||||
});
|
||||
this.results_showing = true;
|
||||
this.search_field.focus();
|
||||
this.search_field.value = this.search_field.value;
|
||||
return this.winnow_results();
|
||||
};
|
||||
|
||||
Chosen.prototype.results_hide = function() {
|
||||
if (!this.is_multiple) {
|
||||
this.selected_item.removeClassName('chzn-single-with-drop');
|
||||
}
|
||||
this.result_clear_highlight();
|
||||
this.dropdown.setStyle({
|
||||
"left": "-9000px"
|
||||
});
|
||||
return this.results_showing = false;
|
||||
};
|
||||
|
||||
Chosen.prototype.set_tab_index = function(el) {
|
||||
var ti;
|
||||
if (this.form_field.tabIndex) {
|
||||
ti = this.form_field.tabIndex;
|
||||
this.form_field.tabIndex = -1;
|
||||
if (this.is_multiple) {
|
||||
return this.search_field.tabIndex = ti;
|
||||
} else {
|
||||
this.selected_item.tabIndex = ti;
|
||||
return this.search_field.tabIndex = -1;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.show_search_field_default = function() {
|
||||
if (this.is_multiple && this.choices < 1 && !this.active_field) {
|
||||
this.search_field.value = this.default_text;
|
||||
return this.search_field.addClassName("default");
|
||||
} else {
|
||||
this.search_field.value = "";
|
||||
return this.search_field.removeClassName("default");
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.search_results_mouseup = function(evt) {
|
||||
var target;
|
||||
target = evt.target.hasClassName("active-result") ? evt.target : evt.target.up(".active-result");
|
||||
if (target) {
|
||||
this.result_highlight = target;
|
||||
return this.result_select(evt);
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.search_results_mouseover = function(evt) {
|
||||
var target;
|
||||
target = evt.target.hasClassName("active-result") ? evt.target : evt.target.up(".active-result");
|
||||
if (target) return this.result_do_highlight(target);
|
||||
};
|
||||
|
||||
Chosen.prototype.search_results_mouseout = function(evt) {
|
||||
if (evt.target.hasClassName('active-result') || evt.target.up('.active-result')) {
|
||||
return this.result_clear_highlight();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.choices_click = function(evt) {
|
||||
evt.preventDefault();
|
||||
if (this.active_field && !(evt.target.hasClassName('search-choice') || evt.target.up('.search-choice')) && !this.results_showing) {
|
||||
return this.results_show();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.choice_build = function(item) {
|
||||
var choice_id, link,
|
||||
_this = this;
|
||||
choice_id = this.container_id + "_c_" + item.array_index;
|
||||
this.choices += 1;
|
||||
this.search_container.insert({
|
||||
before: this.choice_temp.evaluate({
|
||||
id: choice_id,
|
||||
choice: item.html,
|
||||
position: item.array_index
|
||||
})
|
||||
});
|
||||
link = $(choice_id).down('a');
|
||||
return link.observe("click", function(evt) {
|
||||
return _this.choice_destroy_link_click(evt);
|
||||
});
|
||||
};
|
||||
|
||||
Chosen.prototype.choice_destroy_link_click = function(evt) {
|
||||
evt.preventDefault();
|
||||
if (!this.is_disabled) {
|
||||
this.pending_destroy_click = true;
|
||||
return this.choice_destroy(evt.target);
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.choice_destroy = function(link) {
|
||||
this.choices -= 1;
|
||||
this.show_search_field_default();
|
||||
if (this.is_multiple && this.choices > 0 && this.search_field.value.length < 1) {
|
||||
this.results_hide();
|
||||
}
|
||||
this.result_deselect(link.readAttribute("rel"));
|
||||
return link.up('li').remove();
|
||||
};
|
||||
|
||||
Chosen.prototype.results_reset = function(evt) {
|
||||
this.form_field.options[0].selected = true;
|
||||
this.selected_item.down("span").update(this.default_text);
|
||||
this.show_search_field_default();
|
||||
evt.target.remove();
|
||||
if (typeof Event.simulate === 'function') this.form_field.simulate("change");
|
||||
if (this.active_field) return this.results_hide();
|
||||
};
|
||||
|
||||
Chosen.prototype.result_select = function(evt) {
|
||||
var high, item, position;
|
||||
if (this.result_highlight) {
|
||||
high = this.result_highlight;
|
||||
this.result_clear_highlight();
|
||||
if (this.is_multiple) {
|
||||
this.result_deactivate(high);
|
||||
} else {
|
||||
this.search_results.descendants(".result-selected").invoke("removeClassName", "result-selected");
|
||||
this.result_single_selected = high;
|
||||
}
|
||||
high.addClassName("result-selected");
|
||||
position = high.id.substr(high.id.lastIndexOf("_") + 1);
|
||||
item = this.results_data[position];
|
||||
item.selected = true;
|
||||
this.form_field.options[item.options_index].selected = true;
|
||||
if (this.is_multiple) {
|
||||
this.choice_build(item);
|
||||
} else {
|
||||
this.selected_item.down("span").update(item.html);
|
||||
if (this.allow_single_deselect) this.single_deselect_control_build();
|
||||
}
|
||||
if (!(evt.metaKey && this.is_multiple)) this.results_hide();
|
||||
this.search_field.value = "";
|
||||
if (typeof Event.simulate === 'function') {
|
||||
this.form_field.simulate("change");
|
||||
}
|
||||
return this.search_field_scale();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.result_activate = function(el) {
|
||||
return el.addClassName("active-result");
|
||||
};
|
||||
|
||||
Chosen.prototype.result_deactivate = function(el) {
|
||||
return el.removeClassName("active-result");
|
||||
};
|
||||
|
||||
Chosen.prototype.result_deselect = function(pos) {
|
||||
var result, result_data;
|
||||
result_data = this.results_data[pos];
|
||||
result_data.selected = false;
|
||||
this.form_field.options[result_data.options_index].selected = false;
|
||||
result = $(this.container_id + "_o_" + pos);
|
||||
result.removeClassName("result-selected").addClassName("active-result").show();
|
||||
this.result_clear_highlight();
|
||||
this.winnow_results();
|
||||
if (typeof Event.simulate === 'function') this.form_field.simulate("change");
|
||||
return this.search_field_scale();
|
||||
};
|
||||
|
||||
Chosen.prototype.single_deselect_control_build = function() {
|
||||
if (this.allow_single_deselect && !this.selected_item.down("abbr")) {
|
||||
return this.selected_item.down("span").insert({
|
||||
after: "<abbr class=\"search-choice-close\"></abbr>"
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.winnow_results = function() {
|
||||
var found, option, part, parts, regex, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len2, _ref;
|
||||
this.no_results_clear();
|
||||
results = 0;
|
||||
searchText = this.search_field.value === this.default_text ? "" : this.search_field.value.strip().escapeHTML();
|
||||
regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
|
||||
zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
|
||||
_ref = this.results_data;
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
option = _ref[_i];
|
||||
if (!option.disabled && !option.empty) {
|
||||
if (option.group) {
|
||||
$(option.dom_id).hide();
|
||||
} else if (!(this.is_multiple && option.selected)) {
|
||||
found = false;
|
||||
result_id = option.dom_id;
|
||||
if (regex.test(option.html)) {
|
||||
found = true;
|
||||
results += 1;
|
||||
} else if (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0) {
|
||||
parts = option.html.replace(/\[|\]/g, "").split(" ");
|
||||
if (parts.length) {
|
||||
for (_j = 0, _len2 = parts.length; _j < _len2; _j++) {
|
||||
part = parts[_j];
|
||||
if (regex.test(part)) {
|
||||
found = true;
|
||||
results += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
if (searchText.length) {
|
||||
startpos = option.html.search(zregex);
|
||||
text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length);
|
||||
text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
|
||||
} else {
|
||||
text = option.html;
|
||||
}
|
||||
if ($(result_id).innerHTML !== text) $(result_id).update(text);
|
||||
this.result_activate($(result_id));
|
||||
if (option.group_array_index != null) {
|
||||
$(this.results_data[option.group_array_index].dom_id).setStyle({
|
||||
display: 'list-item'
|
||||
});
|
||||
}
|
||||
} else {
|
||||
if ($(result_id) === this.result_highlight) {
|
||||
this.result_clear_highlight();
|
||||
}
|
||||
this.result_deactivate($(result_id));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (results < 1 && searchText.length) {
|
||||
return this.no_results(searchText);
|
||||
} else {
|
||||
return this.winnow_results_set_highlight();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.winnow_results_clear = function() {
|
||||
var li, lis, _i, _len, _results;
|
||||
this.search_field.clear();
|
||||
lis = this.search_results.select("li");
|
||||
_results = [];
|
||||
for (_i = 0, _len = lis.length; _i < _len; _i++) {
|
||||
li = lis[_i];
|
||||
if (li.hasClassName("group-result")) {
|
||||
_results.push(li.show());
|
||||
} else if (!this.is_multiple || !li.hasClassName("result-selected")) {
|
||||
_results.push(this.result_activate(li));
|
||||
} else {
|
||||
_results.push(void 0);
|
||||
}
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
Chosen.prototype.winnow_results_set_highlight = function() {
|
||||
var do_high;
|
||||
if (!this.result_highlight) {
|
||||
if (!this.is_multiple) {
|
||||
do_high = this.search_results.down(".result-selected.active-result");
|
||||
}
|
||||
if (!(do_high != null)) {
|
||||
do_high = this.search_results.down(".active-result");
|
||||
}
|
||||
if (do_high != null) return this.result_do_highlight(do_high);
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.no_results = function(terms) {
|
||||
return this.search_results.insert(this.no_results_temp.evaluate({
|
||||
terms: terms
|
||||
}));
|
||||
};
|
||||
|
||||
Chosen.prototype.no_results_clear = function() {
|
||||
var nr, _results;
|
||||
nr = null;
|
||||
_results = [];
|
||||
while (nr = this.search_results.down(".no-results")) {
|
||||
_results.push(nr.remove());
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
|
||||
Chosen.prototype.keydown_arrow = function() {
|
||||
var actives, nexts, sibs;
|
||||
actives = this.search_results.select("li.active-result");
|
||||
if (actives.length) {
|
||||
if (!this.result_highlight) {
|
||||
this.result_do_highlight(actives.first());
|
||||
} else if (this.results_showing) {
|
||||
sibs = this.result_highlight.nextSiblings();
|
||||
nexts = sibs.intersect(actives);
|
||||
if (nexts.length) this.result_do_highlight(nexts.first());
|
||||
}
|
||||
if (!this.results_showing) return this.results_show();
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.keyup_arrow = function() {
|
||||
var actives, prevs, sibs;
|
||||
if (!this.results_showing && !this.is_multiple) {
|
||||
return this.results_show();
|
||||
} else if (this.result_highlight) {
|
||||
sibs = this.result_highlight.previousSiblings();
|
||||
actives = this.search_results.select("li.active-result");
|
||||
prevs = sibs.intersect(actives);
|
||||
if (prevs.length) {
|
||||
return this.result_do_highlight(prevs.first());
|
||||
} else {
|
||||
if (this.choices > 0) this.results_hide();
|
||||
return this.result_clear_highlight();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.keydown_backstroke = function() {
|
||||
if (this.pending_backstroke) {
|
||||
this.choice_destroy(this.pending_backstroke.down("a"));
|
||||
return this.clear_backstroke();
|
||||
} else {
|
||||
this.pending_backstroke = this.search_container.siblings("li.search-choice").last();
|
||||
return this.pending_backstroke.addClassName("search-choice-focus");
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.clear_backstroke = function() {
|
||||
if (this.pending_backstroke) {
|
||||
this.pending_backstroke.removeClassName("search-choice-focus");
|
||||
}
|
||||
return this.pending_backstroke = null;
|
||||
};
|
||||
|
||||
Chosen.prototype.keydown_checker = function(evt) {
|
||||
var stroke, _ref;
|
||||
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
|
||||
this.search_field_scale();
|
||||
if (stroke !== 8 && this.pending_backstroke) this.clear_backstroke();
|
||||
switch (stroke) {
|
||||
case 8:
|
||||
this.backstroke_length = this.search_field.value.length;
|
||||
break;
|
||||
case 9:
|
||||
if (this.results_showing && !this.is_multiple) this.result_select(evt);
|
||||
this.mouse_on_container = false;
|
||||
break;
|
||||
case 13:
|
||||
evt.preventDefault();
|
||||
break;
|
||||
case 38:
|
||||
evt.preventDefault();
|
||||
this.keyup_arrow();
|
||||
break;
|
||||
case 40:
|
||||
this.keydown_arrow();
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
Chosen.prototype.search_field_scale = function() {
|
||||
var dd_top, div, h, style, style_block, styles, w, _i, _len;
|
||||
if (this.is_multiple) {
|
||||
h = 0;
|
||||
w = 0;
|
||||
style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
|
||||
styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
|
||||
for (_i = 0, _len = styles.length; _i < _len; _i++) {
|
||||
style = styles[_i];
|
||||
style_block += style + ":" + this.search_field.getStyle(style) + ";";
|
||||
}
|
||||
div = new Element('div', {
|
||||
'style': style_block
|
||||
}).update(this.search_field.value.escapeHTML());
|
||||
document.body.appendChild(div);
|
||||
w = Element.measure(div, 'width') + 25;
|
||||
div.remove();
|
||||
if (w > this.f_width - 10) w = this.f_width - 10;
|
||||
this.search_field.setStyle({
|
||||
'width': w + 'px'
|
||||
});
|
||||
dd_top = this.container.getHeight();
|
||||
return this.dropdown.setStyle({
|
||||
"top": dd_top + "px"
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
return Chosen;
|
||||
|
||||
})(AbstractChosen);
|
||||
|
||||
root.Chosen = Chosen;
|
||||
|
||||
if (Prototype.Browser.IE) {
|
||||
if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) {
|
||||
Prototype.BrowserFeatures['Version'] = new Number(RegExp.$1);
|
||||
}
|
||||
}
|
||||
|
||||
get_side_border_padding = function(elmt) {
|
||||
var layout, side_border_padding;
|
||||
layout = new Element.Layout(elmt);
|
||||
return side_border_padding = layout.get("border-left") + layout.get("border-right") + layout.get("padding-left") + layout.get("padding-right");
|
||||
};
|
||||
|
||||
root.get_side_border_padding = get_side_border_padding;
|
||||
|
||||
}).call(this);
|
10
chosen/chosen.proto.min.js
vendored
10
chosen/chosen.proto.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -1,552 +0,0 @@
|
|||
###
|
||||
Chosen source: generate output using 'cake build'
|
||||
Copyright (c) 2011 by Harvest
|
||||
###
|
||||
root = this
|
||||
$ = jQuery
|
||||
|
||||
$.fn.extend({
|
||||
chosen: (options) ->
|
||||
# Do no harm and return as soon as possible for unsupported browsers, namely IE6 and IE7
|
||||
return this if $.browser.msie and ($.browser.version is "6.0" or $.browser.version is "7.0")
|
||||
$(this).each((input_field) ->
|
||||
new Chosen(this, options) unless ($ this).hasClass "chzn-done"
|
||||
)
|
||||
})
|
||||
|
||||
class Chosen extends AbstractChosen
|
||||
|
||||
setup: ->
|
||||
@form_field_jq = $ @form_field
|
||||
@is_rtl = @form_field_jq.hasClass "chzn-rtl"
|
||||
|
||||
finish_setup: ->
|
||||
@form_field_jq.addClass "chzn-done"
|
||||
|
||||
set_up_html: ->
|
||||
@container_id = if @form_field.id.length then @form_field.id.replace(/(:|\.)/g, '_') else this.generate_field_id()
|
||||
@container_id += "_chzn"
|
||||
|
||||
@f_width = @form_field_jq.outerWidth()
|
||||
|
||||
@default_text = if @form_field_jq.data 'placeholder' then @form_field_jq.data 'placeholder' else @default_text_default
|
||||
|
||||
container_div = ($ "<div />", {
|
||||
id: @container_id
|
||||
class: "chzn-container#{ if @is_rtl then ' chzn-rtl' else '' }"
|
||||
style: 'width: ' + (@f_width) + 'px;' #use parens around @f_width so coffeescript doesn't think + ' px' is a function parameter
|
||||
})
|
||||
|
||||
if @is_multiple
|
||||
container_div.html '<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + @default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>'
|
||||
else
|
||||
container_div.html '<a href="javascript:void(0)" class="chzn-single"><span>' + @default_text + '</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>'
|
||||
|
||||
@form_field_jq.hide().after container_div
|
||||
@container = ($ '#' + @container_id)
|
||||
@container.addClass( "chzn-container-" + (if @is_multiple then "multi" else "single") )
|
||||
@dropdown = @container.find('div.chzn-drop').first()
|
||||
|
||||
dd_top = @container.height()
|
||||
dd_width = (@f_width - get_side_border_padding(@dropdown))
|
||||
|
||||
@dropdown.css({"width": dd_width + "px", "top": dd_top + "px"})
|
||||
|
||||
@search_field = @container.find('input').first()
|
||||
@search_results = @container.find('ul.chzn-results').first()
|
||||
this.search_field_scale()
|
||||
|
||||
@search_no_results = @container.find('li.no-results').first()
|
||||
|
||||
if @is_multiple
|
||||
@search_choices = @container.find('ul.chzn-choices').first()
|
||||
@search_container = @container.find('li.search-field').first()
|
||||
else
|
||||
@search_container = @container.find('div.chzn-search').first()
|
||||
@selected_item = @container.find('.chzn-single').first()
|
||||
sf_width = dd_width - get_side_border_padding(@search_container) - get_side_border_padding(@search_field)
|
||||
@search_field.css( {"width" : sf_width + "px"} )
|
||||
|
||||
this.results_build()
|
||||
this.set_tab_index()
|
||||
@form_field_jq.trigger("liszt:ready", {chosen: this})
|
||||
|
||||
register_observers: ->
|
||||
@container.mousedown (evt) => this.container_mousedown(evt)
|
||||
@container.mouseup (evt) => this.container_mouseup(evt)
|
||||
@container.mouseenter (evt) => this.mouse_enter(evt)
|
||||
@container.mouseleave (evt) => this.mouse_leave(evt)
|
||||
|
||||
@search_results.mouseup (evt) => this.search_results_mouseup(evt)
|
||||
@search_results.mouseover (evt) => this.search_results_mouseover(evt)
|
||||
@search_results.mouseout (evt) => this.search_results_mouseout(evt)
|
||||
|
||||
@form_field_jq.bind "liszt:updated", (evt) => this.results_update_field(evt)
|
||||
|
||||
@search_field.blur (evt) => this.input_blur(evt)
|
||||
@search_field.keyup (evt) => this.keyup_checker(evt)
|
||||
@search_field.keydown (evt) => this.keydown_checker(evt)
|
||||
|
||||
if @is_multiple
|
||||
@search_choices.click (evt) => this.choices_click(evt)
|
||||
@search_field.focus (evt) => this.input_focus(evt)
|
||||
else
|
||||
@container.click (evt) => evt.preventDefault() # gobble click of anchor
|
||||
|
||||
search_field_disabled: ->
|
||||
@is_disabled = @form_field_jq[0].disabled
|
||||
if(@is_disabled)
|
||||
@container.addClass 'chzn-disabled'
|
||||
@search_field[0].disabled = true
|
||||
@selected_item.unbind "focus", @activate_action if !@is_multiple
|
||||
this.close_field()
|
||||
else
|
||||
@container.removeClass 'chzn-disabled'
|
||||
@search_field[0].disabled = false
|
||||
@selected_item.bind "focus", @activate_action if !@is_multiple
|
||||
|
||||
container_mousedown: (evt) ->
|
||||
if !@is_disabled
|
||||
target_closelink = if evt? then ($ evt.target).hasClass "search-choice-close" else false
|
||||
if evt and evt.type is "mousedown"
|
||||
evt.stopPropagation()
|
||||
if not @pending_destroy_click and not target_closelink
|
||||
if not @active_field
|
||||
@search_field.val "" if @is_multiple
|
||||
$(document).click @click_test_action
|
||||
this.results_show()
|
||||
else if not @is_multiple and evt and (($(evt.target)[0] == @selected_item[0]) || $(evt.target).parents("a.chzn-single").length)
|
||||
evt.preventDefault()
|
||||
this.results_toggle()
|
||||
|
||||
this.activate_field()
|
||||
else
|
||||
@pending_destroy_click = false
|
||||
|
||||
container_mouseup: (evt) ->
|
||||
this.results_reset(evt) if evt.target.nodeName is "ABBR"
|
||||
|
||||
blur_test: (evt) ->
|
||||
this.close_field() if not @active_field and @container.hasClass "chzn-container-active"
|
||||
|
||||
close_field: ->
|
||||
$(document).unbind "click", @click_test_action
|
||||
|
||||
if not @is_multiple
|
||||
@selected_item.attr "tabindex", @search_field.attr("tabindex")
|
||||
@search_field.attr "tabindex", -1
|
||||
|
||||
@active_field = false
|
||||
this.results_hide()
|
||||
|
||||
@container.removeClass "chzn-container-active"
|
||||
this.winnow_results_clear()
|
||||
this.clear_backstroke()
|
||||
|
||||
this.show_search_field_default()
|
||||
this.search_field_scale()
|
||||
|
||||
activate_field: ->
|
||||
if not @is_multiple and not @active_field
|
||||
@search_field.attr "tabindex", (@selected_item.attr "tabindex")
|
||||
@selected_item.attr "tabindex", -1
|
||||
|
||||
@container.addClass "chzn-container-active"
|
||||
@active_field = true
|
||||
|
||||
@search_field.val(@search_field.val())
|
||||
@search_field.focus()
|
||||
|
||||
|
||||
test_active_click: (evt) ->
|
||||
if $(evt.target).parents('#' + @container_id).length
|
||||
@active_field = true
|
||||
else
|
||||
this.close_field()
|
||||
|
||||
results_build: ->
|
||||
@parsing = true
|
||||
@results_data = root.SelectParser.select_to_array @form_field
|
||||
|
||||
if @is_multiple and @choices > 0
|
||||
@search_choices.find("li.search-choice").remove()
|
||||
@choices = 0
|
||||
else if not @is_multiple
|
||||
@selected_item.find("span").text @default_text
|
||||
if @form_field.options.length <= @disable_search_threshold
|
||||
@container.addClass "chzn-container-single-nosearch"
|
||||
else
|
||||
@container.removeClass "chzn-container-single-nosearch"
|
||||
|
||||
content = ''
|
||||
for data in @results_data
|
||||
if data.group
|
||||
content += this.result_add_group data
|
||||
else if !data.empty
|
||||
content += this.result_add_option data
|
||||
if data.selected and @is_multiple
|
||||
this.choice_build data
|
||||
else if data.selected and not @is_multiple
|
||||
@selected_item.find("span").text data.text
|
||||
this.single_deselect_control_build() if @allow_single_deselect
|
||||
|
||||
this.search_field_disabled()
|
||||
this.show_search_field_default()
|
||||
this.search_field_scale()
|
||||
|
||||
@search_results.html content
|
||||
@parsing = false
|
||||
|
||||
|
||||
result_add_group: (group) ->
|
||||
if not group.disabled
|
||||
group.dom_id = @container_id + "_g_" + group.array_index
|
||||
'<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>'
|
||||
else
|
||||
""
|
||||
|
||||
result_do_highlight: (el) ->
|
||||
if el.length
|
||||
this.result_clear_highlight()
|
||||
|
||||
@result_highlight = el
|
||||
@result_highlight.addClass "highlighted"
|
||||
|
||||
maxHeight = parseInt @search_results.css("maxHeight"), 10
|
||||
visible_top = @search_results.scrollTop()
|
||||
visible_bottom = maxHeight + visible_top
|
||||
|
||||
high_top = @result_highlight.position().top + @search_results.scrollTop()
|
||||
high_bottom = high_top + @result_highlight.outerHeight()
|
||||
|
||||
if high_bottom >= visible_bottom
|
||||
@search_results.scrollTop if (high_bottom - maxHeight) > 0 then (high_bottom - maxHeight) else 0
|
||||
else if high_top < visible_top
|
||||
@search_results.scrollTop high_top
|
||||
|
||||
result_clear_highlight: ->
|
||||
@result_highlight.removeClass "highlighted" if @result_highlight
|
||||
@result_highlight = null
|
||||
|
||||
results_show: ->
|
||||
if not @is_multiple
|
||||
@selected_item.addClass "chzn-single-with-drop"
|
||||
if @result_single_selected
|
||||
this.result_do_highlight( @result_single_selected )
|
||||
|
||||
dd_top = if @is_multiple then @container.height() else (@container.height() - 1)
|
||||
@dropdown.css {"top": dd_top + "px", "left":0}
|
||||
@results_showing = true
|
||||
|
||||
@search_field.focus()
|
||||
@search_field.val @search_field.val()
|
||||
|
||||
this.winnow_results()
|
||||
|
||||
results_hide: ->
|
||||
@selected_item.removeClass "chzn-single-with-drop" unless @is_multiple
|
||||
this.result_clear_highlight()
|
||||
@dropdown.css {"left":"-9000px"}
|
||||
@results_showing = false
|
||||
|
||||
|
||||
set_tab_index: (el) ->
|
||||
if @form_field_jq.attr "tabindex"
|
||||
ti = @form_field_jq.attr "tabindex"
|
||||
@form_field_jq.attr "tabindex", -1
|
||||
|
||||
if @is_multiple
|
||||
@search_field.attr "tabindex", ti
|
||||
else
|
||||
@selected_item.attr "tabindex", ti
|
||||
@search_field.attr "tabindex", -1
|
||||
|
||||
show_search_field_default: ->
|
||||
if @is_multiple and @choices < 1 and not @active_field
|
||||
@search_field.val(@default_text)
|
||||
@search_field.addClass "default"
|
||||
else
|
||||
@search_field.val("")
|
||||
@search_field.removeClass "default"
|
||||
|
||||
search_results_mouseup: (evt) ->
|
||||
target = if $(evt.target).hasClass "active-result" then $(evt.target) else $(evt.target).parents(".active-result").first()
|
||||
if target.length
|
||||
@result_highlight = target
|
||||
this.result_select(evt)
|
||||
|
||||
search_results_mouseover: (evt) ->
|
||||
target = if $(evt.target).hasClass "active-result" then $(evt.target) else $(evt.target).parents(".active-result").first()
|
||||
this.result_do_highlight( target ) if target
|
||||
|
||||
search_results_mouseout: (evt) ->
|
||||
this.result_clear_highlight() if $(evt.target).hasClass "active-result" or $(evt.target).parents('.active-result').first()
|
||||
|
||||
|
||||
choices_click: (evt) ->
|
||||
evt.preventDefault()
|
||||
if( @active_field and not($(evt.target).hasClass "search-choice" or $(evt.target).parents('.search-choice').first) and not @results_showing )
|
||||
this.results_show()
|
||||
|
||||
choice_build: (item) ->
|
||||
choice_id = @container_id + "_c_" + item.array_index
|
||||
@choices += 1
|
||||
@search_container.before '<li class="search-choice" id="' + choice_id + '"><span>' + item.html + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>'
|
||||
link = $('#' + choice_id).find("a").first()
|
||||
link.click (evt) => this.choice_destroy_link_click(evt)
|
||||
|
||||
choice_destroy_link_click: (evt) ->
|
||||
evt.preventDefault()
|
||||
if not @is_disabled
|
||||
@pending_destroy_click = true
|
||||
this.choice_destroy $(evt.target)
|
||||
else
|
||||
evt.stopPropagation
|
||||
|
||||
choice_destroy: (link) ->
|
||||
@choices -= 1
|
||||
this.show_search_field_default()
|
||||
|
||||
this.results_hide() if @is_multiple and @choices > 0 and @search_field.val().length < 1
|
||||
|
||||
this.result_deselect (link.attr "rel")
|
||||
link.parents('li').first().remove()
|
||||
|
||||
results_reset: (evt) ->
|
||||
@form_field.options[0].selected = true
|
||||
@selected_item.find("span").text @default_text
|
||||
this.show_search_field_default()
|
||||
$(evt.target).remove();
|
||||
@form_field_jq.trigger "change"
|
||||
this.results_hide() if @active_field
|
||||
|
||||
result_select: (evt) ->
|
||||
if @result_highlight
|
||||
high = @result_highlight
|
||||
high_id = high.attr "id"
|
||||
|
||||
this.result_clear_highlight()
|
||||
|
||||
if @is_multiple
|
||||
this.result_deactivate high
|
||||
else
|
||||
@search_results.find(".result-selected").removeClass "result-selected"
|
||||
@result_single_selected = high
|
||||
|
||||
high.addClass "result-selected"
|
||||
|
||||
position = high_id.substr(high_id.lastIndexOf("_") + 1 )
|
||||
item = @results_data[position]
|
||||
item.selected = true
|
||||
|
||||
@form_field.options[item.options_index].selected = true
|
||||
|
||||
if @is_multiple
|
||||
this.choice_build item
|
||||
else
|
||||
@selected_item.find("span").first().text item.text
|
||||
this.single_deselect_control_build() if @allow_single_deselect
|
||||
|
||||
this.results_hide() unless evt.metaKey and @is_multiple
|
||||
|
||||
@search_field.val ""
|
||||
|
||||
@form_field_jq.trigger "change"
|
||||
this.search_field_scale()
|
||||
|
||||
result_activate: (el) ->
|
||||
el.addClass("active-result")
|
||||
|
||||
result_deactivate: (el) ->
|
||||
el.removeClass("active-result")
|
||||
|
||||
result_deselect: (pos) ->
|
||||
result_data = @results_data[pos]
|
||||
result_data.selected = false
|
||||
|
||||
@form_field.options[result_data.options_index].selected = false
|
||||
result = $("#" + @container_id + "_o_" + pos)
|
||||
result.removeClass("result-selected").addClass("active-result").show()
|
||||
|
||||
this.result_clear_highlight()
|
||||
this.winnow_results()
|
||||
|
||||
@form_field_jq.trigger "change"
|
||||
this.search_field_scale()
|
||||
|
||||
single_deselect_control_build: ->
|
||||
@selected_item.find("span").first().after "<abbr class=\"search-choice-close\"></abbr>" if @allow_single_deselect and @selected_item.find("abbr").length < 1
|
||||
|
||||
winnow_results: ->
|
||||
this.no_results_clear()
|
||||
|
||||
results = 0
|
||||
|
||||
searchText = if @search_field.val() is @default_text then "" else $('<div/>').text($.trim(@search_field.val())).html()
|
||||
regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i')
|
||||
zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i')
|
||||
|
||||
for option in @results_data
|
||||
if not option.disabled and not option.empty
|
||||
if option.group
|
||||
$('#' + option.dom_id).css('display', 'none')
|
||||
else if not (@is_multiple and option.selected)
|
||||
found = false
|
||||
result_id = option.dom_id
|
||||
result = $("#" + result_id)
|
||||
|
||||
if regex.test option.html
|
||||
found = true
|
||||
results += 1
|
||||
else if option.html.indexOf(" ") >= 0 or option.html.indexOf("[") == 0
|
||||
#TODO: replace this substitution of /\[\]/ with a list of characters to skip.
|
||||
parts = option.html.replace(/\[|\]/g, "").split(" ")
|
||||
if parts.length
|
||||
for part in parts
|
||||
if regex.test part
|
||||
found = true
|
||||
results += 1
|
||||
|
||||
if found
|
||||
if searchText.length
|
||||
startpos = option.html.search zregex
|
||||
text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length)
|
||||
text = text.substr(0, startpos) + '<em>' + text.substr(startpos)
|
||||
else
|
||||
text = option.html
|
||||
|
||||
result.html(text)
|
||||
this.result_activate result
|
||||
|
||||
$("#" + @results_data[option.group_array_index].dom_id).css('display', 'list-item') if option.group_array_index?
|
||||
else
|
||||
this.result_clear_highlight() if @result_highlight and result_id is @result_highlight.attr 'id'
|
||||
this.result_deactivate result
|
||||
|
||||
if results < 1 and searchText.length
|
||||
this.no_results searchText
|
||||
else
|
||||
this.winnow_results_set_highlight()
|
||||
|
||||
winnow_results_clear: ->
|
||||
@search_field.val ""
|
||||
lis = @search_results.find("li")
|
||||
|
||||
for li in lis
|
||||
li = $(li)
|
||||
if li.hasClass "group-result"
|
||||
li.css('display', 'auto')
|
||||
else if not @is_multiple or not li.hasClass "result-selected"
|
||||
this.result_activate li
|
||||
|
||||
winnow_results_set_highlight: ->
|
||||
if not @result_highlight
|
||||
|
||||
selected_results = if not @is_multiple then @search_results.find(".result-selected.active-result") else []
|
||||
do_high = if selected_results.length then selected_results.first() else @search_results.find(".active-result").first()
|
||||
|
||||
this.result_do_highlight do_high if do_high?
|
||||
|
||||
no_results: (terms) ->
|
||||
no_results_html = $('<li class="no-results">' + @results_none_found + ' "<span></span>"</li>')
|
||||
no_results_html.find("span").first().html(terms)
|
||||
|
||||
@search_results.append no_results_html
|
||||
|
||||
no_results_clear: ->
|
||||
@search_results.find(".no-results").remove()
|
||||
|
||||
keydown_arrow: ->
|
||||
if not @result_highlight
|
||||
first_active = @search_results.find("li.active-result").first()
|
||||
this.result_do_highlight $(first_active) if first_active
|
||||
else if @results_showing
|
||||
next_sib = @result_highlight.nextAll("li.active-result").first()
|
||||
this.result_do_highlight next_sib if next_sib
|
||||
this.results_show() if not @results_showing
|
||||
|
||||
keyup_arrow: ->
|
||||
if not @results_showing and not @is_multiple
|
||||
this.results_show()
|
||||
else if @result_highlight
|
||||
prev_sibs = @result_highlight.prevAll("li.active-result")
|
||||
|
||||
if prev_sibs.length
|
||||
this.result_do_highlight prev_sibs.first()
|
||||
else
|
||||
this.results_hide() if @choices > 0
|
||||
this.result_clear_highlight()
|
||||
|
||||
keydown_backstroke: ->
|
||||
if @pending_backstroke
|
||||
this.choice_destroy @pending_backstroke.find("a").first()
|
||||
this.clear_backstroke()
|
||||
else
|
||||
@pending_backstroke = @search_container.siblings("li.search-choice").last()
|
||||
@pending_backstroke.addClass "search-choice-focus"
|
||||
|
||||
clear_backstroke: ->
|
||||
@pending_backstroke.removeClass "search-choice-focus" if @pending_backstroke
|
||||
@pending_backstroke = null
|
||||
|
||||
keydown_checker: (evt) ->
|
||||
stroke = evt.which ? evt.keyCode
|
||||
this.search_field_scale()
|
||||
|
||||
this.clear_backstroke() if stroke != 8 and this.pending_backstroke
|
||||
|
||||
switch stroke
|
||||
when 8
|
||||
@backstroke_length = this.search_field.val().length
|
||||
break
|
||||
when 9
|
||||
this.result_select(evt) if this.results_showing and not @is_multiple
|
||||
@mouse_on_container = false
|
||||
break
|
||||
when 13
|
||||
evt.preventDefault()
|
||||
break
|
||||
when 38
|
||||
evt.preventDefault()
|
||||
this.keyup_arrow()
|
||||
break
|
||||
when 40
|
||||
this.keydown_arrow()
|
||||
break
|
||||
|
||||
search_field_scale: ->
|
||||
if @is_multiple
|
||||
h = 0
|
||||
w = 0
|
||||
|
||||
style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"
|
||||
styles = ['font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing']
|
||||
|
||||
for style in styles
|
||||
style_block += style + ":" + @search_field.css(style) + ";"
|
||||
|
||||
div = $('<div />', { 'style' : style_block })
|
||||
div.text @search_field.val()
|
||||
$('body').append div
|
||||
|
||||
w = div.width() + 25
|
||||
div.remove()
|
||||
|
||||
if( w > @f_width-10 )
|
||||
w = @f_width - 10
|
||||
|
||||
@search_field.css({'width': w + 'px'})
|
||||
|
||||
dd_top = @container.height()
|
||||
@dropdown.css({"top": dd_top + "px"})
|
||||
|
||||
generate_random_id: ->
|
||||
string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char()
|
||||
while $("#" + string).length > 0
|
||||
string += this.generate_random_char()
|
||||
string
|
||||
|
||||
get_side_border_padding = (elmt) ->
|
||||
side_border_padding = elmt.outerWidth() - elmt.width()
|
||||
|
||||
root.get_side_border_padding = get_side_border_padding
|
|
@ -1,550 +0,0 @@
|
|||
###
|
||||
Chosen source: generate output using 'cake build'
|
||||
Copyright (c) 2011 by Harvest
|
||||
###
|
||||
root = this
|
||||
|
||||
class Chosen extends AbstractChosen
|
||||
|
||||
setup: ->
|
||||
@is_rtl = @form_field.hasClassName "chzn-rtl"
|
||||
|
||||
finish_setup: ->
|
||||
@form_field.addClassName "chzn-done"
|
||||
|
||||
set_default_values: ->
|
||||
super()
|
||||
|
||||
# HTML Templates
|
||||
@single_temp = new Template('<a href="javascript:void(0)" class="chzn-single"><span>#{default}</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>')
|
||||
@multi_temp = new Template('<ul class="chzn-choices"><li class="search-field"><input type="text" value="#{default}" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>')
|
||||
@choice_temp = new Template('<li class="search-choice" id="#{id}"><span>#{choice}</span><a href="javascript:void(0)" class="search-choice-close" rel="#{position}"></a></li>')
|
||||
@no_results_temp = new Template('<li class="no-results">' + @results_none_found + ' "<span>#{terms}</span>"</li>')
|
||||
|
||||
set_up_html: ->
|
||||
@container_id = @form_field.identify().replace(/(:|\.)/g, '_') + "_chzn"
|
||||
|
||||
@f_width = if @form_field.getStyle("width") then parseInt @form_field.getStyle("width"), 10 else @form_field.getWidth()
|
||||
|
||||
container_props =
|
||||
'id': @container_id
|
||||
'class': "chzn-container#{ if @is_rtl then ' chzn-rtl' else '' }"
|
||||
'style': 'width: ' + (@f_width) + 'px' #use parens around @f_width so coffeescript doesn't think + ' px' is a function parameter
|
||||
|
||||
@default_text = if @form_field.readAttribute 'data-placeholder' then @form_field.readAttribute 'data-placeholder' else @default_text_default
|
||||
|
||||
base_template = if @is_multiple then new Element('div', container_props).update( @multi_temp.evaluate({ "default": @default_text}) ) else new Element('div', container_props).update( @single_temp.evaluate({ "default":@default_text }) )
|
||||
|
||||
@form_field.hide().insert({ after: base_template })
|
||||
@container = $(@container_id)
|
||||
@container.addClassName( "chzn-container-" + (if @is_multiple then "multi" else "single") )
|
||||
@dropdown = @container.down('div.chzn-drop')
|
||||
|
||||
dd_top = @container.getHeight()
|
||||
dd_width = (@f_width - get_side_border_padding(@dropdown))
|
||||
|
||||
@dropdown.setStyle({"width": dd_width + "px", "top": dd_top + "px"})
|
||||
|
||||
@search_field = @container.down('input')
|
||||
@search_results = @container.down('ul.chzn-results')
|
||||
this.search_field_scale()
|
||||
|
||||
@search_no_results = @container.down('li.no-results')
|
||||
|
||||
if @is_multiple
|
||||
@search_choices = @container.down('ul.chzn-choices')
|
||||
@search_container = @container.down('li.search-field')
|
||||
else
|
||||
@search_container = @container.down('div.chzn-search')
|
||||
@selected_item = @container.down('.chzn-single')
|
||||
sf_width = dd_width - get_side_border_padding(@search_container) - get_side_border_padding(@search_field)
|
||||
@search_field.setStyle( {"width" : sf_width + "px"} )
|
||||
|
||||
this.results_build()
|
||||
this.set_tab_index()
|
||||
@form_field.fire("liszt:ready", {chosen: this})
|
||||
|
||||
register_observers: ->
|
||||
@container.observe "mousedown", (evt) => this.container_mousedown(evt)
|
||||
@container.observe "mouseup", (evt) => this.container_mouseup(evt)
|
||||
@container.observe "mouseenter", (evt) => this.mouse_enter(evt)
|
||||
@container.observe "mouseleave", (evt) => this.mouse_leave(evt)
|
||||
|
||||
@search_results.observe "mouseup", (evt) => this.search_results_mouseup(evt)
|
||||
@search_results.observe "mouseover", (evt) => this.search_results_mouseover(evt)
|
||||
@search_results.observe "mouseout", (evt) => this.search_results_mouseout(evt)
|
||||
|
||||
@form_field.observe "liszt:updated", (evt) => this.results_update_field(evt)
|
||||
|
||||
@search_field.observe "blur", (evt) => this.input_blur(evt)
|
||||
@search_field.observe "keyup", (evt) => this.keyup_checker(evt)
|
||||
@search_field.observe "keydown", (evt) => this.keydown_checker(evt)
|
||||
|
||||
if @is_multiple
|
||||
@search_choices.observe "click", (evt) => this.choices_click(evt)
|
||||
@search_field.observe "focus", (evt) => this.input_focus(evt)
|
||||
else
|
||||
@container.observe "click", (evt) => evt.preventDefault() # gobble click of anchor
|
||||
|
||||
search_field_disabled: ->
|
||||
@is_disabled = @form_field.disabled
|
||||
if(@is_disabled)
|
||||
@container.addClassName 'chzn-disabled'
|
||||
@search_field.disabled = true
|
||||
@selected_item.stopObserving "focus", @activate_action if !@is_multiple
|
||||
this.close_field()
|
||||
else
|
||||
@container.removeClassName 'chzn-disabled'
|
||||
@search_field.disabled = false
|
||||
@selected_item.observe "focus", @activate_action if !@is_multiple
|
||||
|
||||
container_mousedown: (evt) ->
|
||||
if !@is_disabled
|
||||
target_closelink = if evt? then evt.target.hasClassName "search-choice-close" else false
|
||||
if evt and evt.type is "mousedown"
|
||||
evt.stop()
|
||||
if not @pending_destroy_click and not target_closelink
|
||||
if not @active_field
|
||||
@search_field.clear() if @is_multiple
|
||||
document.observe "click", @click_test_action
|
||||
this.results_show()
|
||||
else if not @is_multiple and evt and (evt.target is @selected_item || evt.target.up("a.chzn-single"))
|
||||
this.results_toggle()
|
||||
|
||||
this.activate_field()
|
||||
else
|
||||
@pending_destroy_click = false
|
||||
|
||||
container_mouseup: (evt) ->
|
||||
this.results_reset(evt) if evt.target.nodeName is "ABBR"
|
||||
|
||||
blur_test: (evt) ->
|
||||
this.close_field() if not @active_field and @container.hasClassName("chzn-container-active")
|
||||
|
||||
close_field: ->
|
||||
document.stopObserving "click", @click_test_action
|
||||
|
||||
if not @is_multiple
|
||||
@selected_item.tabIndex = @search_field.tabIndex
|
||||
@search_field.tabIndex = -1
|
||||
|
||||
@active_field = false
|
||||
this.results_hide()
|
||||
|
||||
@container.removeClassName "chzn-container-active"
|
||||
this.winnow_results_clear()
|
||||
this.clear_backstroke()
|
||||
|
||||
this.show_search_field_default()
|
||||
this.search_field_scale()
|
||||
|
||||
activate_field: ->
|
||||
if not @is_multiple and not @active_field
|
||||
@search_field.tabIndex = @selected_item.tabIndex
|
||||
@selected_item.tabIndex = -1
|
||||
|
||||
@container.addClassName "chzn-container-active"
|
||||
@active_field = true
|
||||
|
||||
@search_field.value = @search_field.value
|
||||
@search_field.focus()
|
||||
|
||||
|
||||
test_active_click: (evt) ->
|
||||
if evt.target.up('#' + @container_id)
|
||||
@active_field = true
|
||||
else
|
||||
this.close_field()
|
||||
|
||||
results_build: ->
|
||||
@parsing = true
|
||||
@results_data = root.SelectParser.select_to_array @form_field
|
||||
|
||||
if @is_multiple and @choices > 0
|
||||
@search_choices.select("li.search-choice").invoke("remove")
|
||||
@choices = 0
|
||||
else if not @is_multiple
|
||||
@selected_item.down("span").update(@default_text)
|
||||
if @form_field.options.length <= @disable_search_threshold
|
||||
@container.addClassName "chzn-container-single-nosearch"
|
||||
else
|
||||
@container.removeClassName "chzn-container-single-nosearch"
|
||||
|
||||
content = ''
|
||||
for data in @results_data
|
||||
if data.group
|
||||
content += this.result_add_group data
|
||||
else if !data.empty
|
||||
content += this.result_add_option data
|
||||
if data.selected and @is_multiple
|
||||
this.choice_build data
|
||||
else if data.selected and not @is_multiple
|
||||
@selected_item.down("span").update( data.html )
|
||||
this.single_deselect_control_build() if @allow_single_deselect
|
||||
|
||||
this.search_field_disabled()
|
||||
this.show_search_field_default()
|
||||
this.search_field_scale()
|
||||
|
||||
@search_results.update content
|
||||
@parsing = false
|
||||
|
||||
|
||||
result_add_group: (group) ->
|
||||
if not group.disabled
|
||||
group.dom_id = @container_id + "_g_" + group.array_index
|
||||
'<li id="' + group.dom_id + '" class="group-result">' + group.label.escapeHTML() + '</li>'
|
||||
else
|
||||
""
|
||||
|
||||
result_do_highlight: (el) ->
|
||||
this.result_clear_highlight()
|
||||
|
||||
@result_highlight = el
|
||||
@result_highlight.addClassName "highlighted"
|
||||
|
||||
maxHeight = parseInt @search_results.getStyle('maxHeight'), 10
|
||||
visible_top = @search_results.scrollTop
|
||||
visible_bottom = maxHeight + visible_top
|
||||
|
||||
high_top = @result_highlight.positionedOffset().top
|
||||
high_bottom = high_top + @result_highlight.getHeight()
|
||||
|
||||
if high_bottom >= visible_bottom
|
||||
@search_results.scrollTop = if (high_bottom - maxHeight) > 0 then (high_bottom - maxHeight) else 0
|
||||
else if high_top < visible_top
|
||||
@search_results.scrollTop = high_top
|
||||
|
||||
result_clear_highlight: ->
|
||||
@result_highlight.removeClassName('highlighted') if @result_highlight
|
||||
@result_highlight = null
|
||||
|
||||
results_show: ->
|
||||
if not @is_multiple
|
||||
@selected_item.addClassName('chzn-single-with-drop')
|
||||
if @result_single_selected
|
||||
this.result_do_highlight( @result_single_selected )
|
||||
|
||||
dd_top = if @is_multiple then @container.getHeight() else (@container.getHeight() - 1)
|
||||
@dropdown.setStyle {"top": dd_top + "px", "left":0}
|
||||
@results_showing = true
|
||||
|
||||
@search_field.focus()
|
||||
@search_field.value = @search_field.value
|
||||
|
||||
this.winnow_results()
|
||||
|
||||
results_hide: ->
|
||||
@selected_item.removeClassName('chzn-single-with-drop') unless @is_multiple
|
||||
this.result_clear_highlight()
|
||||
@dropdown.setStyle({"left":"-9000px"})
|
||||
@results_showing = false
|
||||
|
||||
|
||||
set_tab_index: (el) ->
|
||||
if @form_field.tabIndex
|
||||
ti = @form_field.tabIndex
|
||||
@form_field.tabIndex = -1
|
||||
|
||||
if @is_multiple
|
||||
@search_field.tabIndex = ti
|
||||
else
|
||||
@selected_item.tabIndex = ti
|
||||
@search_field.tabIndex = -1
|
||||
|
||||
show_search_field_default: ->
|
||||
if @is_multiple and @choices < 1 and not @active_field
|
||||
@search_field.value = @default_text
|
||||
@search_field.addClassName "default"
|
||||
else
|
||||
@search_field.value = ""
|
||||
@search_field.removeClassName "default"
|
||||
|
||||
search_results_mouseup: (evt) ->
|
||||
target = if evt.target.hasClassName("active-result") then evt.target else evt.target.up(".active-result")
|
||||
if target
|
||||
@result_highlight = target
|
||||
this.result_select(evt)
|
||||
|
||||
search_results_mouseover: (evt) ->
|
||||
target = if evt.target.hasClassName("active-result") then evt.target else evt.target.up(".active-result")
|
||||
this.result_do_highlight( target ) if target
|
||||
|
||||
search_results_mouseout: (evt) ->
|
||||
this.result_clear_highlight() if evt.target.hasClassName('active-result') or evt.target.up('.active-result')
|
||||
|
||||
|
||||
choices_click: (evt) ->
|
||||
evt.preventDefault()
|
||||
if( @active_field and not(evt.target.hasClassName('search-choice') or evt.target.up('.search-choice')) and not @results_showing )
|
||||
this.results_show()
|
||||
|
||||
choice_build: (item) ->
|
||||
choice_id = @container_id + "_c_" + item.array_index
|
||||
@choices += 1
|
||||
@search_container.insert
|
||||
before: @choice_temp.evaluate
|
||||
id: choice_id
|
||||
choice: item.html
|
||||
position: item.array_index
|
||||
link = $(choice_id).down('a')
|
||||
link.observe "click", (evt) => this.choice_destroy_link_click(evt)
|
||||
|
||||
choice_destroy_link_click: (evt) ->
|
||||
evt.preventDefault()
|
||||
if not @is_disabled
|
||||
@pending_destroy_click = true
|
||||
this.choice_destroy evt.target
|
||||
|
||||
choice_destroy: (link) ->
|
||||
@choices -= 1
|
||||
this.show_search_field_default()
|
||||
|
||||
this.results_hide() if @is_multiple and @choices > 0 and @search_field.value.length < 1
|
||||
|
||||
this.result_deselect link.readAttribute("rel")
|
||||
link.up('li').remove()
|
||||
|
||||
results_reset: (evt) ->
|
||||
@form_field.options[0].selected = true
|
||||
@selected_item.down("span").update(@default_text)
|
||||
this.show_search_field_default()
|
||||
evt.target.remove()
|
||||
@form_field.simulate("change") if typeof Event.simulate is 'function'
|
||||
this.results_hide() if @active_field
|
||||
|
||||
result_select: (evt) ->
|
||||
if @result_highlight
|
||||
high = @result_highlight
|
||||
this.result_clear_highlight()
|
||||
|
||||
if @is_multiple
|
||||
this.result_deactivate high
|
||||
else
|
||||
@search_results.descendants(".result-selected").invoke "removeClassName", "result-selected"
|
||||
@result_single_selected = high
|
||||
|
||||
high.addClassName("result-selected")
|
||||
|
||||
position = high.id.substr(high.id.lastIndexOf("_") + 1 )
|
||||
item = @results_data[position]
|
||||
item.selected = true
|
||||
|
||||
@form_field.options[item.options_index].selected = true
|
||||
|
||||
if @is_multiple
|
||||
this.choice_build item
|
||||
else
|
||||
@selected_item.down("span").update(item.html)
|
||||
this.single_deselect_control_build() if @allow_single_deselect
|
||||
|
||||
this.results_hide() unless evt.metaKey and @is_multiple
|
||||
|
||||
@search_field.value = ""
|
||||
|
||||
@form_field.simulate("change") if typeof Event.simulate is 'function'
|
||||
this.search_field_scale()
|
||||
|
||||
result_activate: (el) ->
|
||||
el.addClassName("active-result")
|
||||
|
||||
result_deactivate: (el) ->
|
||||
el.removeClassName("active-result")
|
||||
|
||||
result_deselect: (pos) ->
|
||||
result_data = @results_data[pos]
|
||||
result_data.selected = false
|
||||
|
||||
@form_field.options[result_data.options_index].selected = false
|
||||
result = $(@container_id + "_o_" + pos)
|
||||
result.removeClassName("result-selected").addClassName("active-result").show()
|
||||
|
||||
this.result_clear_highlight()
|
||||
this.winnow_results()
|
||||
|
||||
@form_field.simulate("change") if typeof Event.simulate is 'function'
|
||||
this.search_field_scale()
|
||||
|
||||
single_deselect_control_build: ->
|
||||
@selected_item.down("span").insert { after: "<abbr class=\"search-choice-close\"></abbr>" } if @allow_single_deselect and not @selected_item.down("abbr")
|
||||
|
||||
winnow_results: ->
|
||||
this.no_results_clear()
|
||||
|
||||
results = 0
|
||||
|
||||
searchText = if @search_field.value is @default_text then "" else @search_field.value.strip().escapeHTML()
|
||||
regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i')
|
||||
zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i')
|
||||
|
||||
for option in @results_data
|
||||
if not option.disabled and not option.empty
|
||||
if option.group
|
||||
$(option.dom_id).hide()
|
||||
else if not (@is_multiple and option.selected)
|
||||
found = false
|
||||
result_id = option.dom_id
|
||||
|
||||
if regex.test option.html
|
||||
found = true
|
||||
results += 1
|
||||
else if option.html.indexOf(" ") >= 0 or option.html.indexOf("[") == 0
|
||||
#TODO: replace this substitution of /\[\]/ with a list of characters to skip.
|
||||
parts = option.html.replace(/\[|\]/g, "").split(" ")
|
||||
if parts.length
|
||||
for part in parts
|
||||
if regex.test part
|
||||
found = true
|
||||
results += 1
|
||||
|
||||
if found
|
||||
if searchText.length
|
||||
startpos = option.html.search zregex
|
||||
text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length)
|
||||
text = text.substr(0, startpos) + '<em>' + text.substr(startpos)
|
||||
else
|
||||
text = option.html
|
||||
|
||||
$(result_id).update text if $(result_id).innerHTML != text
|
||||
|
||||
this.result_activate $(result_id)
|
||||
|
||||
$(@results_data[option.group_array_index].dom_id).setStyle({display: 'list-item'}) if option.group_array_index?
|
||||
else
|
||||
this.result_clear_highlight() if $(result_id) is @result_highlight
|
||||
this.result_deactivate $(result_id)
|
||||
|
||||
if results < 1 and searchText.length
|
||||
this.no_results(searchText)
|
||||
else
|
||||
this.winnow_results_set_highlight()
|
||||
|
||||
winnow_results_clear: ->
|
||||
@search_field.clear()
|
||||
lis = @search_results.select("li")
|
||||
|
||||
for li in lis
|
||||
if li.hasClassName("group-result")
|
||||
li.show()
|
||||
else if not @is_multiple or not li.hasClassName("result-selected")
|
||||
this.result_activate li
|
||||
|
||||
winnow_results_set_highlight: ->
|
||||
if not @result_highlight
|
||||
|
||||
if not @is_multiple
|
||||
do_high = @search_results.down(".result-selected.active-result")
|
||||
|
||||
if not do_high?
|
||||
do_high = @search_results.down(".active-result")
|
||||
|
||||
this.result_do_highlight do_high if do_high?
|
||||
|
||||
no_results: (terms) ->
|
||||
@search_results.insert @no_results_temp.evaluate( terms: terms )
|
||||
|
||||
no_results_clear: ->
|
||||
nr = null
|
||||
nr.remove() while nr = @search_results.down(".no-results")
|
||||
|
||||
|
||||
keydown_arrow: ->
|
||||
actives = @search_results.select("li.active-result")
|
||||
if actives.length
|
||||
if not @result_highlight
|
||||
this.result_do_highlight actives.first()
|
||||
else if @results_showing
|
||||
sibs = @result_highlight.nextSiblings()
|
||||
nexts = sibs.intersect(actives)
|
||||
this.result_do_highlight nexts.first() if nexts.length
|
||||
this.results_show() if not @results_showing
|
||||
|
||||
keyup_arrow: ->
|
||||
if not @results_showing and not @is_multiple
|
||||
this.results_show()
|
||||
else if @result_highlight
|
||||
sibs = @result_highlight.previousSiblings()
|
||||
actives = @search_results.select("li.active-result")
|
||||
prevs = sibs.intersect(actives)
|
||||
|
||||
if prevs.length
|
||||
this.result_do_highlight prevs.first()
|
||||
else
|
||||
this.results_hide() if @choices > 0
|
||||
this.result_clear_highlight()
|
||||
|
||||
keydown_backstroke: ->
|
||||
if @pending_backstroke
|
||||
this.choice_destroy @pending_backstroke.down("a")
|
||||
this.clear_backstroke()
|
||||
else
|
||||
@pending_backstroke = @search_container.siblings("li.search-choice").last()
|
||||
@pending_backstroke.addClassName("search-choice-focus")
|
||||
|
||||
clear_backstroke: ->
|
||||
@pending_backstroke.removeClassName("search-choice-focus") if @pending_backstroke
|
||||
@pending_backstroke = null
|
||||
|
||||
keydown_checker: (evt) ->
|
||||
stroke = evt.which ? evt.keyCode
|
||||
this.search_field_scale()
|
||||
|
||||
this.clear_backstroke() if stroke != 8 and this.pending_backstroke
|
||||
|
||||
switch stroke
|
||||
when 8
|
||||
@backstroke_length = this.search_field.value.length
|
||||
break
|
||||
when 9
|
||||
this.result_select(evt) if this.results_showing and not @is_multiple
|
||||
@mouse_on_container = false
|
||||
break
|
||||
when 13
|
||||
evt.preventDefault()
|
||||
break
|
||||
when 38
|
||||
evt.preventDefault()
|
||||
this.keyup_arrow()
|
||||
break
|
||||
when 40
|
||||
this.keydown_arrow()
|
||||
break
|
||||
|
||||
search_field_scale: ->
|
||||
if @is_multiple
|
||||
h = 0
|
||||
w = 0
|
||||
|
||||
style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"
|
||||
styles = ['font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing']
|
||||
|
||||
for style in styles
|
||||
style_block += style + ":" + @search_field.getStyle(style) + ";"
|
||||
|
||||
div = new Element('div', { 'style' : style_block }).update(@search_field.value.escapeHTML())
|
||||
document.body.appendChild(div)
|
||||
|
||||
w = Element.measure(div, 'width') + 25
|
||||
div.remove()
|
||||
|
||||
if( w > @f_width-10 )
|
||||
w = @f_width - 10
|
||||
|
||||
@search_field.setStyle({'width': w + 'px'})
|
||||
|
||||
dd_top = @container.getHeight()
|
||||
@dropdown.setStyle({"top": dd_top + "px"})
|
||||
|
||||
root.Chosen = Chosen
|
||||
|
||||
# Prototype does not support version numbers so we add it ourselves
|
||||
if Prototype.Browser.IE
|
||||
if /MSIE (\d+\.\d+);/.test(navigator.userAgent)
|
||||
Prototype.BrowserFeatures['Version'] = new Number(RegExp.$1);
|
||||
|
||||
|
||||
get_side_border_padding = (elmt) ->
|
||||
layout = new Element.Layout(elmt)
|
||||
side_border_padding = layout.get("border-left") + layout.get("border-right") + layout.get("padding-left") + layout.get("padding-right")
|
||||
|
||||
root.get_side_border_padding = get_side_border_padding
|
|
@ -1,109 +0,0 @@
|
|||
###
|
||||
Chosen source: generate output using 'cake build'
|
||||
Copyright (c) 2011 by Harvest
|
||||
###
|
||||
root = this
|
||||
|
||||
class AbstractChosen
|
||||
|
||||
constructor: (@form_field, @options={}) ->
|
||||
this.set_default_values()
|
||||
|
||||
@is_multiple = @form_field.multiple
|
||||
@default_text_default = if @is_multiple then "Select Some Options" else "Select an Option"
|
||||
|
||||
this.setup()
|
||||
|
||||
this.set_up_html()
|
||||
this.register_observers()
|
||||
|
||||
this.finish_setup()
|
||||
|
||||
set_default_values: ->
|
||||
@click_test_action = (evt) => this.test_active_click(evt)
|
||||
@activate_action = (evt) => this.activate_field(evt)
|
||||
@active_field = false
|
||||
@mouse_on_container = false
|
||||
@results_showing = false
|
||||
@result_highlighted = null
|
||||
@result_single_selected = null
|
||||
@allow_single_deselect = if @options.allow_single_deselect? and @form_field.options[0]? and @form_field.options[0].text is "" then @options.allow_single_deselect else false
|
||||
@disable_search_threshold = @options.disable_search_threshold || 0
|
||||
@choices = 0
|
||||
@results_none_found = @options.no_results_text or "No results match"
|
||||
|
||||
mouse_enter: -> @mouse_on_container = true
|
||||
mouse_leave: -> @mouse_on_container = false
|
||||
|
||||
input_focus: (evt) ->
|
||||
setTimeout (=> this.container_mousedown()), 50 unless @active_field
|
||||
|
||||
input_blur: (evt) ->
|
||||
if not @mouse_on_container
|
||||
@active_field = false
|
||||
setTimeout (=> this.blur_test()), 100
|
||||
|
||||
result_add_option: (option) ->
|
||||
if not option.disabled
|
||||
option.dom_id = @container_id + "_o_" + option.array_index
|
||||
|
||||
classes = if option.selected and @is_multiple then [] else ["active-result"]
|
||||
classes.push "result-selected" if option.selected
|
||||
classes.push "group-option" if option.group_array_index?
|
||||
classes.push option.classes if option.classes != ""
|
||||
|
||||
style = if option.style.cssText != "" then " style=\"#{option.style}\"" else ""
|
||||
|
||||
'<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"'+style+'>' + option.html + '</li>'
|
||||
else
|
||||
""
|
||||
|
||||
results_update_field: ->
|
||||
this.result_clear_highlight()
|
||||
@result_single_selected = null
|
||||
this.results_build()
|
||||
|
||||
results_toggle: ->
|
||||
if @results_showing
|
||||
this.results_hide()
|
||||
else
|
||||
this.results_show()
|
||||
|
||||
results_search: (evt) ->
|
||||
if @results_showing
|
||||
this.winnow_results()
|
||||
else
|
||||
this.results_show()
|
||||
|
||||
keyup_checker: (evt) ->
|
||||
stroke = evt.which ? evt.keyCode
|
||||
this.search_field_scale()
|
||||
|
||||
switch stroke
|
||||
when 8
|
||||
if @is_multiple and @backstroke_length < 1 and @choices > 0
|
||||
this.keydown_backstroke()
|
||||
else if not @pending_backstroke
|
||||
this.result_clear_highlight()
|
||||
this.results_search()
|
||||
when 13
|
||||
evt.preventDefault()
|
||||
this.result_select(evt) if this.results_showing
|
||||
when 27
|
||||
this.results_hide() if @results_showing
|
||||
return true
|
||||
when 9, 38, 40, 16, 91, 17
|
||||
# don't do anything on these keys
|
||||
else this.results_search()
|
||||
|
||||
generate_field_id: ->
|
||||
new_id = this.generate_random_id()
|
||||
@form_field.id = new_id
|
||||
new_id
|
||||
|
||||
generate_random_char: ->
|
||||
chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ"
|
||||
rand = Math.floor(Math.random() * chars.length)
|
||||
newchar = chars.substring rand, rand+1
|
||||
|
||||
root.AbstractChosen = AbstractChosen
|
|
@ -1,51 +0,0 @@
|
|||
class SelectParser
|
||||
|
||||
constructor: ->
|
||||
@options_index = 0
|
||||
@parsed = []
|
||||
|
||||
add_node: (child) ->
|
||||
if child.nodeName is "OPTGROUP"
|
||||
this.add_group child
|
||||
else
|
||||
this.add_option child
|
||||
|
||||
add_group: (group) ->
|
||||
group_position = @parsed.length
|
||||
@parsed.push
|
||||
array_index: group_position
|
||||
group: true
|
||||
label: group.label
|
||||
children: 0
|
||||
disabled: group.disabled
|
||||
this.add_option( option, group_position, group.disabled ) for option in group.childNodes
|
||||
|
||||
add_option: (option, group_position, group_disabled) ->
|
||||
if option.nodeName is "OPTION"
|
||||
if option.text != ""
|
||||
if group_position?
|
||||
@parsed[group_position].children += 1
|
||||
@parsed.push
|
||||
array_index: @parsed.length
|
||||
options_index: @options_index
|
||||
value: option.value
|
||||
text: option.text
|
||||
html: option.innerHTML
|
||||
selected: option.selected
|
||||
disabled: if group_disabled is true then group_disabled else option.disabled
|
||||
group_array_index: group_position
|
||||
classes: option.className
|
||||
style: option.style.cssText
|
||||
else
|
||||
@parsed.push
|
||||
array_index: @parsed.length
|
||||
options_index: @options_index
|
||||
empty: true
|
||||
@options_index += 1
|
||||
|
||||
SelectParser.select_to_array = (select) ->
|
||||
parser = new SelectParser()
|
||||
parser.add_node( child ) for child in select.childNodes
|
||||
parser.parsed
|
||||
|
||||
this.SelectParser = SelectParser
|
BIN
docsupport/.DS_Store
vendored
Normal file
BIN
docsupport/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
docsupport/chosen.png
Normal file
BIN
docsupport/chosen.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.4 KiB |
67
docsupport/style.css
Normal file
67
docsupport/style.css
Normal file
|
@ -0,0 +1,67 @@
|
|||
/* Reset */
|
||||
html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; }
|
||||
|
||||
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; }
|
||||
|
||||
blockquote, q { quotes: none; }
|
||||
blockquote:before, blockquote:after, q:before, q:after { content: ""; content: none; }
|
||||
ins { background-color: #ff9; color: #000; text-decoration: none; }
|
||||
mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; }
|
||||
del { text-decoration: line-through; }
|
||||
abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; }
|
||||
table { border-collapse: collapse; border-spacing: 0; }
|
||||
hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
|
||||
input, select { vertical-align: middle; }
|
||||
|
||||
body { font:13px/1.231 sans-serif; *font-size:small; } /* Hack retained to preserve specificity */
|
||||
select, input, textarea, button { font:99% sans-serif; }
|
||||
pre, code, kbd, samp { font-family: monospace, sans-serif; }
|
||||
|
||||
|
||||
body { background: #EEE; color: #444; line-height: 1.4em; }
|
||||
|
||||
header { background: #222; background: -moz-linear-gradient(center bottom , #222 0%, #444 80%) repeat scroll 0 0 transparent; background: -webkit-gradient(linear, 0% 100%, 0% 0%, color-stop(0, #222), color-stop(0.8, #444)); height: 59px; margin: 0 auto; padding: 0 50px; width: 740px; }
|
||||
header h1 { color: white; font-size: 2em; line-height: 1.1em; text-indent: -5000px; display: inline-block; width: 109px; height: 27px; background: url(chosen.png); margin-top: 13px; }
|
||||
header a { color: white; float: right; font-size: .825em; line-height: 60px; }
|
||||
|
||||
div#content { background: white; border: 1px solid #ccc; border-width: 0 1px 1px; margin: 0 auto; padding: 40px 50px 40px; width: 738px; }
|
||||
|
||||
footer { color: #999; padding-top: 40px; font-size: 0.8em; text-align: center; }
|
||||
|
||||
body { font-family: sans-serif; font-size: 1em; }
|
||||
|
||||
p { margin: 0 0 .7em; max-width: 700px; }
|
||||
|
||||
h2 { border-bottom: 1px solid #ccc; font-size: 1.2em; margin: 3em 0 1em 0; font-weight: bold;}
|
||||
h3 { font-weight: bold; }
|
||||
|
||||
h2.intro { border-bottom: none; font-size: 1em; font-weight: normal; margin-top:0; }
|
||||
|
||||
ul li { list-style: disc; margin-left: 1em; margin-bottom: 1.25em; }
|
||||
ol li { margin-left: 1.25em; }
|
||||
ol ul, ul ul { margin: .25em 0 0; }
|
||||
ol ul li, ul ul li { list-style-type: circle; margin: 0 0 .25em 1em; }
|
||||
|
||||
li > p { margin-top: .25em; }
|
||||
|
||||
div.side-by-side { width: 100%; margin-bottom: 1em; }
|
||||
div.side-by-side > div { float: left; width: 49%; }
|
||||
div.side-by-side > div > em { margin-bottom: 10px; display: block; }
|
||||
|
||||
.faqs em { display: block; }
|
||||
|
||||
.clearfix:after {
|
||||
content: "\0020";
|
||||
display: block;
|
||||
height: 0;
|
||||
clear: both;
|
||||
overflow: hidden;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
a { color: #F36C00; outline: none; text-decoration: none; }
|
||||
a:hover { text-decoration: underline; }
|
||||
|
||||
ul.credits li { margin-bottom: .25em; }
|
||||
|
||||
strong { font-weight: bold; }
|
1302
example.jquery.html
1302
example.jquery.html
File diff suppressed because it is too large
Load diff
1319
example.proto.html
1319
example.proto.html
File diff suppressed because it is too large
Load diff
1334
index.html
Normal file
1334
index.html
Normal file
File diff suppressed because it is too large
Load diff
18
package.json
18
package.json
|
@ -1,18 +0,0 @@
|
|||
{
|
||||
"author": "harvest",
|
||||
"name": "chosen",
|
||||
"version": "0.9.7",
|
||||
"description": "Chosen is a JavaScript plugin that makes long, unwieldy select boxes much more user-friendly. It is currently available in both jQuery and Prototype flavors.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/harvesthq/chosen"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
},
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"coffee-script": ">= 1.2",
|
||||
"uglify-js": ">= 1.2.5"
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue