pax_global_header00006660000000000000000000000064120620140740014506gustar00rootroot0000000000000052 comment=4371e8fdabe16d4e8aaa3734421edc367e32a296 chosen-0.9.11/000077500000000000000000000000001206201407400130555ustar00rootroot00000000000000chosen-0.9.11/.gitignore000066400000000000000000000000401206201407400150370ustar00rootroot00000000000000.DS_Store node_modules .project chosen-0.9.11/Cakefile000066400000000000000000000124271206201407400145110ustar00rootroot00000000000000# 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, trailing='') -> 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}#{trailing} """ 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_obj = JSON.parse("#{fs.readFileSync package_file}") package_obj['version'] = version() fs.writeFileSync package_file, JSON.stringify(package_obj, 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 chosen-0.9.11/LICENSE.md000066400000000000000000000023451206201407400144650ustar00rootroot00000000000000# 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.chosen-0.9.11/README.md000066400000000000000000000035261206201407400143420ustar00rootroot00000000000000# 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 chosen-0.9.11/VERSION000066400000000000000000000000071206201407400141220ustar00rootroot000000000000000.9.11 chosen-0.9.11/chosen/000077500000000000000000000000001206201407400143345ustar00rootroot00000000000000chosen-0.9.11/chosen/chosen-sprite.png000066400000000000000000000010571206201407400176300ustar00rootroot00000000000000PNG  IHDR<(IDAThMKQEZD6eh"MQwm q" " Ȭ6E-E(}8d#jq.<`dϹ@\x.o6 Ȃ+ai=澴[B\?9l QHquC0Ba*;5szl&<.<\1=`OP}DIԐ?ae)6ߙD|D))3(,8^pdd=}1P*J$}G;sUԕiFȖ8G EJzJZpez4dsALֈ/ P YQ6("91Niё Ӝ 9Qz{\x8b{y;Zs+qLsuO@JqU jMi?AXJGEʠo w(QgIENDB`chosen-0.9.11/chosen/chosen.css000066400000000000000000000334061206201407400163330ustar00rootroot00000000000000/* @group Base */ .chzn-container { font-size: 13px; position: relative; display: inline-block; zoom: 1; *display: inline; } .chzn-container .chzn-drop { background: #fff; border: 1px solid #aaa; border-top: 0; position: absolute; top: 29px; left: 0; -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15); -moz-box-shadow : 0 4px 5px rgba(0,0,0,.15); box-shadow : 0 4px 5px rgba(0,0,0,.15); z-index: 1010; } /* @end */ /* @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: linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); -webkit-border-radius: 5px; -moz-border-radius : 5px; border-radius : 5px; -moz-background-clip : padding; -webkit-background-clip: padding-box; background-clip : padding-box; border: 1px solid #aaaaaa; -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1); -moz-box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1); box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1); display: block; overflow: hidden; white-space: nowrap; position: relative; height: 23px; line-height: 24px; padding: 0 0 0 8px; color: #444444; text-decoration: none; } .chzn-container-single .chzn-default { color: #999; } .chzn-container-single .chzn-single span { margin-right: 26px; display: block; overflow: hidden; white-space: nowrap; -o-text-overflow: ellipsis; -ms-text-overflow: ellipsis; text-overflow: ellipsis; } .chzn-container-single .chzn-single abbr { display: block; position: absolute; right: 26px; top: 6px; width: 12px; height: 13px; font-size: 1px; background: url('chosen-sprite.png') right top no-repeat; } .chzn-container-single .chzn-single abbr:hover { background-position: right -11px; } .chzn-container-single.chzn-disabled .chzn-single abbr:hover { background-position: right top; } .chzn-container-single .chzn-single div { position: absolute; right: 0; top: 0; display: block; height: 100%; width: 18px; } .chzn-container-single .chzn-single div b { background: url('chosen-sprite.png') no-repeat 0 0; display: block; width: 100%; height: 100%; } .chzn-container-single .chzn-search { padding: 3px 4px; position: relative; margin: 0; white-space: nowrap; z-index: 1010; } .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, linear-gradient(#eeeeee 1%, #ffffff 15%); margin: 1px 0; padding: 4px 20px 4px 5px; outline: 0; border: 1px solid #aaa; font-family: sans-serif; font-size: 1em; } .chzn-container-single .chzn-drop { -webkit-border-radius: 0 0 4px 4px; -moz-border-radius : 0 0 4px 4px; border-radius : 0 0 4px 4px; -moz-background-clip : padding; -webkit-background-clip: padding-box; background-clip : padding-box; } /* @end */ .chzn-container-single-nosearch .chzn-search input { position: absolute; left: -9000px; } /* @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: linear-gradient(#eeeeee 1%, #ffffff 15%); border: 1px solid #aaa; margin: 0; padding: 0; cursor: text; overflow: hidden; height: auto !important; height: 1%; position: relative; } .chzn-container-multi .chzn-choices li { float: left; list-style: none; } .chzn-container-multi .chzn-choices .search-field { white-space: nowrap; margin: 0; padding: 0; } .chzn-container-multi .chzn-choices .search-field input { color: #666; background: transparent !important; border: 0 !important; font-family: sans-serif; font-size: 100%; height: 15px; padding: 5px; margin: 1px 0; outline: 0; -webkit-box-shadow: none; -moz-box-shadow : none; box-shadow : none; } .chzn-container-multi .chzn-choices .search-field .default { color: #999; } .chzn-container-multi .chzn-choices .search-choice { -webkit-border-radius: 3px; -moz-border-radius : 3px; border-radius : 3px; -moz-background-clip : padding; -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: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); -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); color: #333; border: 1px solid #aaaaaa; line-height: 13px; padding: 3px 20px 3px 5px; margin: 3px 0 3px 5px; position: relative; cursor: default; } .chzn-container-multi .chzn-choices .search-choice.search-choice-disabled { 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%); color: #666; border: 1px solid #cccccc; padding-right: 5px; } .chzn-container-multi .chzn-choices .search-choice-focus { background: #d4d4d4; } .chzn-container-multi .chzn-choices .search-choice .search-choice-close { display: block; position: absolute; right: 3px; top: 4px; width: 12px; height: 13px; font-size: 1px; background: url('chosen-sprite.png') right top no-repeat; } .chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover { background-position: right -11px; } .chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close { background-position: right -11px; } /* @end */ /* @group Results */ .chzn-container .chzn-results { margin: 0 4px 4px 0; max-height: 240px; padding: 0 0 0 4px; position: relative; overflow-x: hidden; overflow-y: auto; -webkit-overflow-scrolling: touch; } .chzn-container-multi .chzn-results { margin: -1px 0 0; padding: 0; } .chzn-container .chzn-results li { display: none; line-height: 15px; padding: 5px 6px; margin: 0; list-style: none; } .chzn-container .chzn-results .active-result { cursor: pointer; display: list-item; } .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: linear-gradient(#3875d7 20%, #2a62bc 90%); color: #fff; } .chzn-container .chzn-results li em { background: #feffde; font-style: normal; } .chzn-container .chzn-results .highlighted em { background: transparent; } .chzn-container .chzn-results .no-results { background: #f4f4f4; display: list-item; } .chzn-container .chzn-results .group-result { cursor: default; color: #999; font-weight: bold; } .chzn-container .chzn-results .group-option { padding-left: 15px; } .chzn-container-multi .chzn-drop .result-selected { display: none; } .chzn-container .chzn-results-scroll { background: white; margin: 0 4px; position: absolute; text-align: center; width: 321px; /* This should by dynamic with js */ z-index: 1; } .chzn-container .chzn-results-scroll span { display: inline-block; height: 17px; text-indent: -5000px; width: 9px; } .chzn-container .chzn-results-scroll-down { bottom: 0; } .chzn-container .chzn-results-scroll-down span { background: url('chosen-sprite.png') no-repeat -4px -3px; } .chzn-container .chzn-results-scroll-up span { background: url('chosen-sprite.png') no-repeat -22px -3px; } /* @end */ /* @group Active */ .chzn-container-active .chzn-single { -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3); -moz-box-shadow : 0 0 5px rgba(0,0,0,.3); box-shadow : 0 0 5px rgba(0,0,0,.3); border: 1px solid #5897fb; } .chzn-container-active .chzn-single-with-drop { border: 1px solid #aaa; -webkit-box-shadow: 0 1px 0 #fff inset; -moz-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: linear-gradient(#eeeeee 20%, #ffffff 80%); -webkit-border-bottom-left-radius : 0; -webkit-border-bottom-right-radius: 0; -moz-border-radius-bottomleft : 0; -moz-border-radius-bottomright: 0; border-bottom-left-radius : 0; border-bottom-right-radius: 0; } .chzn-container-active .chzn-single-with-drop div { background: transparent; border-left: none; } .chzn-container-active .chzn-single-with-drop div b { background-position: -18px 1px; } .chzn-container-active .chzn-choices { -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3); -moz-box-shadow : 0 0 5px rgba(0,0,0,.3); box-shadow : 0 0 5px rgba(0,0,0,.3); border: 1px solid #5897fb; } .chzn-container-active .chzn-choices .search-field input { color: #111 !important; } /* @end */ /* @group Disabled Support */ .chzn-disabled { cursor: default; opacity:0.5 !important; } .chzn-disabled .chzn-single { cursor: default; } .chzn-disabled .chzn-choices .search-choice .search-choice-close { cursor: default; } /* @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 .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-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, linear-gradient(#eeeeee 1%, #ffffff 15%); padding: 4px 5px 4px 20px; direction: rtl; } /* @end */ chosen-0.9.11/chosen/chosen.jquery.js000066400000000000000000001126261206201407400174770ustar00rootroot00000000000000// Chosen, a Select Box Enhancer for jQuery and Protoype // by Patrick Filler for Harvest, http://getharvest.com // // Version 0.9.11 // 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.toUpperCase() === "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.toUpperCase() === "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.is_multiple = this.form_field.multiple; this.set_default_text(); this.set_default_values(); 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.disable_search = this.options.disable_search || false; this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true; this.search_contains = this.options.search_contains || false; this.choices = 0; this.single_backstroke_delete = this.options.single_backstroke_delete || false; this.max_selected_options = this.options.max_selected_options || Infinity; return this.inherit_select_classes = this.options.inherit_select_classes || false; }; AbstractChosen.prototype.set_default_text = function() { if (this.form_field.getAttribute("data-placeholder")) { this.default_text = this.form_field.getAttribute("data-placeholder"); } else if (this.is_multiple) { this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || "Select Some Options"; } else { this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || "Select an Option"; } return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || 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.is_multiple) { if (!this.active_field) { return setTimeout((function() { return _this.container_mousedown(); }), 50); } } else { if (!this.active_field) { return this.activate_field(); } } }; 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 '
  • ' + option.html + '
  • '; } else { return ""; } }; AbstractChosen.prototype.results_update_field = function() { if (!this.is_multiple) { this.results_reset_cleanup(); } 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 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 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 = {}.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; $ = jQuery; $.fn.extend({ chosen: function(options) { if ($.browser.msie && ($.browser.version === "6.0" || ($.browser.version === "7.0" && document.documentMode === 7))) { return this; } return this.each(function(input_field) { var $this; $this = $(this); if (!$this.hasClass("chzn-done")) { return $this.data('chosen', new Chosen(this, options)); } }); } }); Chosen = (function(_super) { __extends(Chosen, _super); function Chosen() { return Chosen.__super__.constructor.apply(this, arguments); } Chosen.prototype.setup = function() { this.form_field_jq = $(this.form_field); this.current_value = this.form_field_jq.val(); 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_classes, container_div, container_props, dd_top, dd_width, sf_width; this.container_id = this.form_field.id.length ? this.form_field.id.replace(/[^\w]/g, '_') : this.generate_field_id(); this.container_id += "_chzn"; container_classes = ["chzn-container"]; container_classes.push("chzn-container-" + (this.is_multiple ? "multi" : "single")); if (this.inherit_select_classes && this.form_field.className) { container_classes.push(this.form_field.className); } if (this.is_rtl) { container_classes.push("chzn-rtl"); } this.f_width = this.form_field_jq.outerWidth(); container_props = { id: this.container_id, "class": container_classes.join(' '), style: 'width: ' + this.f_width + 'px;', title: this.form_field.title }; container_div = $("
    ", container_props); if (this.is_multiple) { container_div.html('
      '); } else { container_div.html('' + this.default_text + '
        '); } this.form_field_jq.hide().after(container_div); this.container = $('#' + this.container_id); this.dropdown = this.container.find('div.chzn-drop').first(); dd_top = this.container.height(); dd_width = this.f_width - get_side_border_padding(this.dropdown); this.dropdown.css({ "width": dd_width + "px", "top": dd_top + "px" }); this.search_field = this.container.find('input').first(); this.search_results = this.container.find('ul.chzn-results').first(); this.search_field_scale(); this.search_no_results = this.container.find('li.no-results').first(); if (this.is_multiple) { this.search_choices = this.container.find('ul.chzn-choices').first(); this.search_container = this.container.find('li.search-field').first(); } else { this.search_container = this.container.find('div.chzn-search').first(); this.selected_item = this.container.find('.chzn-single').first(); sf_width = dd_width - get_side_border_padding(this.search_container) - get_side_border_padding(this.search_field); this.search_field.css({ "width": sf_width + "px" }); } this.results_build(); this.set_tab_index(); return this.form_field_jq.trigger("liszt:ready", { 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.form_field_jq.bind("liszt:activate", function(evt) { return _this.activate_field(evt); }); this.form_field_jq.bind("liszt:open", function(evt) { return _this.container_mousedown(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.search_field.focus(function(evt) { return _this.input_focus(evt); }); if (this.is_multiple) { return this.search_choices.click(function(evt) { return _this.choices_click(evt); }); } else { return this.container.click(function(evt) { return evt.preventDefault(); }); } }; Chosen.prototype.search_field_disabled = function() { this.is_disabled = this.form_field_jq[0].disabled; if (this.is_disabled) { this.container.addClass('chzn-disabled'); this.search_field[0].disabled = true; if (!this.is_multiple) { this.selected_item.unbind("focus", this.activate_action); } return this.close_field(); } else { this.container.removeClass('chzn-disabled'); this.search_field[0].disabled = false; if (!this.is_multiple) { return this.selected_item.bind("focus", this.activate_action); } } }; 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" && !this.results_showing) { evt.preventDefault(); } if (!this.pending_destroy_click && !target_closelink) { if (!this.active_field) { 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)) { evt.preventDefault(); 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" && !this.is_disabled) { 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); this.active_field = false; this.results_hide(); this.container.removeClass("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() { this.container.addClass("chzn-container-active"); this.active_field = true; 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; } 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.find("li.search-choice").remove(); this.choices = 0; } else if (!this.is_multiple) { this.selected_item.addClass("chzn-default").find("span").text(this.default_text); if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) { this.container.addClass("chzn-container-single-nosearch"); } else { this.container.removeClass("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.removeClass("chzn-default").find("span").text(data.text); 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.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; return '
      • ' + $("
        ").text(group.label).html() + '
      • '; } else { return ""; } }; Chosen.prototype.result_do_highlight = function(el) { var high_bottom, high_top, maxHeight, visible_bottom, visible_top; if (el.length) { this.result_clear_highlight(); this.result_highlight = el; this.result_highlight.addClass("highlighted"); maxHeight = parseInt(this.search_results.css("maxHeight"), 10); visible_top = this.search_results.scrollTop(); visible_bottom = maxHeight + visible_top; high_top = this.result_highlight.position().top + this.search_results.scrollTop(); high_bottom = high_top + this.result_highlight.outerHeight(); 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.removeClass("highlighted"); } return this.result_highlight = null; }; Chosen.prototype.results_show = function() { var dd_top; if (!this.is_multiple) { this.selected_item.addClass("chzn-single-with-drop"); if (this.result_single_selected) { this.result_do_highlight(this.result_single_selected); } } else if (this.max_selected_options <= this.choices) { this.form_field_jq.trigger("liszt:maxselected", { chosen: this }); return false; } dd_top = this.is_multiple ? this.container.height() : this.container.height() - 1; this.form_field_jq.trigger("liszt:showing_dropdown", { chosen: this }); this.dropdown.css({ "top": dd_top + "px", "left": 0 }); this.results_showing = true; this.search_field.focus(); 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"); } this.result_clear_highlight(); this.form_field_jq.trigger("liszt:hiding_dropdown", { chosen: this }); this.dropdown.css({ "left": "-9000px" }); return this.results_showing = false; }; Chosen.prototype.set_tab_index = function(el) { var ti; if (this.form_field_jq.attr("tabindex")) { ti = this.form_field_jq.attr("tabindex"); this.form_field_jq.attr("tabindex", -1); return this.search_field.attr("tabindex", ti); } }; Chosen.prototype.show_search_field_default = function() { if (this.is_multiple && this.choices < 1 && !this.active_field) { this.search_field.val(this.default_text); return this.search_field.addClass("default"); } else { this.search_field.val(""); 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(); if (target.length) { this.result_highlight = target; this.result_select(evt); return this.search_field.focus(); } }; 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); } }; 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, html, link, _this = this; if (this.is_multiple && this.max_selected_options <= this.choices) { this.form_field_jq.trigger("liszt:maxselected", { chosen: this }); return false; } choice_id = this.container_id + "_c_" + item.array_index; this.choices += 1; if (item.disabled) { html = '
      • ' + item.html + '
      • '; } else { html = '
      • ' + item.html + '
      • '; } this.search_container.before(html); link = $('#' + choice_id).find("a").first(); return link.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)); } else { return evt.stopPropagation; } }; Chosen.prototype.choice_destroy = function(link) { if (this.result_deselect(link.attr("rel"))) { this.choices -= 1; this.show_search_field_default(); if (this.is_multiple && this.choices > 0 && this.search_field.val().length < 1) { this.results_hide(); } link.parents('li').first().remove(); return this.search_field_scale(); } }; Chosen.prototype.results_reset = function() { this.form_field.options[0].selected = true; this.selected_item.find("span").text(this.default_text); if (!this.is_multiple) { this.selected_item.addClass("chzn-default"); } this.show_search_field_default(); this.results_reset_cleanup(); this.form_field_jq.trigger("change"); if (this.active_field) { return this.results_hide(); } }; Chosen.prototype.results_reset_cleanup = function() { this.current_value = this.form_field_jq.val(); return this.selected_item.find("abbr").remove(); }; Chosen.prototype.result_select = function(evt) { var high, high_id, item, position; if (this.result_highlight) { high = this.result_highlight; high_id = high.attr("id"); this.result_clear_highlight(); if (this.is_multiple) { this.result_deactivate(high); } else { this.search_results.find(".result-selected").removeClass("result-selected"); this.result_single_selected = high; this.selected_item.removeClass("chzn-default"); } high.addClass("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.find("span").first().text(item.text); if (this.allow_single_deselect) { this.single_deselect_control_build(); } } if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) { this.results_hide(); } this.search_field.val(""); if (this.is_multiple || this.form_field_jq.val() !== this.current_value) { this.form_field_jq.trigger("change", { 'selected': this.form_field.options[item.options_index].value }); } this.current_value = this.form_field_jq.val(); 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]; if (!this.form_field.options[result_data.options_index].disabled) { result_data.selected = false; this.form_field.options[result_data.options_index].selected = false; result = $("#" + this.container_id + "_o_" + pos); result.removeClass("result-selected").addClass("active-result").show(); this.result_clear_highlight(); this.winnow_results(); this.form_field_jq.trigger("change", { deselected: this.form_field.options[result_data.options_index].value }); this.search_field_scale(); return true; } else { return false; } }; 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(""); } }; Chosen.prototype.winnow_results = function() { var found, option, part, parts, regex, regexAnchor, result, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len1, _ref; this.no_results_clear(); results = 0; searchText = this.search_field.val() === this.default_text ? "" : $('
        ').text($.trim(this.search_field.val())).html(); regexAnchor = this.search_contains ? "" : "^"; regex = new RegExp(regexAnchor + 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).css('display', 'none'); } else if (!(this.is_multiple && option.selected)) { found = false; result_id = option.dom_id; result = $("#" + result_id); if (regex.test(option.html)) { found = true; results += 1; } else if (this.enable_split_word_search && (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0)) { parts = option.html.replace(/\[|\]/g, "").split(" "); if (parts.length) { for (_j = 0, _len1 = parts.length; _j < _len1; _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) + '' + option.html.substr(startpos + searchText.length); text = text.substr(0, startpos) + '' + text.substr(startpos); } else { text = option.html; } result.html(text); this.result_activate(result); if (option.group_array_index != null) { $("#" + this.results_data[option.group_array_index].dom_id).css('display', 'list-item'); } } else { if (this.result_highlight && result_id === this.result_highlight.attr('id')) { this.result_clear_highlight(); } this.result_deactivate(result); } } } } 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.val(""); lis = this.search_results.find("li"); _results = []; 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); } } 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); } } }; Chosen.prototype.no_results = function(terms) { var no_results_html; no_results_html = $('
      • ' + this.results_none_found + ' ""
      • '); 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)); } } 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 (!this.results_showing) { return this.results_show(); } }; Chosen.prototype.keyup_arrow = function() { var prev_sibs; if (!this.results_showing && !this.is_multiple) { return this.results_show(); } else if (this.result_highlight) { prev_sibs = this.result_highlight.prevAll("li.active-result"); if (prev_sibs.length) { return this.result_do_highlight(prev_sibs.first()); } else { if (this.choices > 0) { this.results_hide(); } return this.result_clear_highlight(); } } }; Chosen.prototype.keydown_backstroke = function() { var next_available_destroy; if (this.pending_backstroke) { this.choice_destroy(this.pending_backstroke.find("a").first()); return this.clear_backstroke(); } else { next_available_destroy = this.search_container.siblings("li.search-choice").last(); if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) { this.pending_backstroke = next_available_destroy; if (this.single_backstroke_delete) { return this.keydown_backstroke(); } else { 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(); } 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); } 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.css(style) + ";"; } div = $('
        ', { 'style': style_block }); div.text(this.search_field.val()); $('body').append(div); w = div.width() + 25; div.remove(); if (w > this.f_width - 10) { w = this.f_width - 10; } this.search_field.css({ 'width': w + 'px' }); dd_top = this.container.height(); return this.dropdown.css({ "top": dd_top + "px" }); } }; Chosen.prototype.generate_random_id = function() { var string; string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char(); while ($("#" + string).length > 0) { string += this.generate_random_char(); } return string; }; return Chosen; })(AbstractChosen); root.Chosen = Chosen; 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); chosen-0.9.11/chosen/chosen.jquery.min.js000066400000000000000000000561311206201407400202570ustar00rootroot00000000000000// Chosen, a Select Box Enhancer for jQuery and Protoype // by Patrick Filler for Harvest, http://getharvest.com // // Version 0.9.11 // 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 e;e=function(){function e(){this.options_index=0,this.parsed=[]}return e.prototype.add_node=function(e){return e.nodeName.toUpperCase()==="OPTGROUP"?this.add_group(e):this.add_option(e)},e.prototype.add_group=function(e){var t,n,r,i,s,o;t=this.parsed.length,this.parsed.push({array_index:t,group:!0,label:e.label,children:0,disabled:e.disabled}),s=e.childNodes,o=[];for(r=0,i=s.length;r"+e.html+"")},e.prototype.results_update_field=function(){return this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.result_single_selected=null,this.results_build()},e.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},e.prototype.results_search=function(e){return this.results_showing?this.winnow_results():this.results_show()},e.prototype.keyup_checker=function(e){var t,n;t=(n=e.which)!=null?n:e.keyCode,this.search_field_scale();switch(t){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:e.preventDefault();if(this.results_showing)return this.result_select(e);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},e.prototype.generate_field_id=function(){var e;return e=this.generate_random_id(),this.form_field.id=e,e},e.prototype.generate_random_char=function(){var e,t,n;return e="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",n=Math.floor(Math.random()*e.length),t=e.substring(n,n+1)},e}(),t.AbstractChosen=e}.call(this),function(){var e,t,n,r,i={}.hasOwnProperty,s=function(e,t){function r(){this.constructor=e}for(var n in t)i.call(t,n)&&(e[n]=t[n]);return r.prototype=t.prototype,e.prototype=new r,e.__super__=t.prototype,e};r=this,e=jQuery,e.fn.extend({chosen:function(n){return e.browser.msie&&(e.browser.version==="6.0"||e.browser.version==="7.0"&&document.documentMode===7)?this:this.each(function(r){var i;i=e(this);if(!i.hasClass("chzn-done"))return i.data("chosen",new t(this,n))})}}),t=function(t){function i(){return i.__super__.constructor.apply(this,arguments)}return s(i,t),i.prototype.setup=function(){return this.form_field_jq=e(this.form_field),this.current_value=this.form_field_jq.val(),this.is_rtl=this.form_field_jq.hasClass("chzn-rtl")},i.prototype.finish_setup=function(){return this.form_field_jq.addClass("chzn-done")},i.prototype.set_up_html=function(){var t,r,i,s,o,u;return this.container_id=this.form_field.id.length?this.form_field.id.replace(/[^\w]/g,"_"):this.generate_field_id(),this.container_id+="_chzn",t=["chzn-container"],t.push("chzn-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&t.push(this.form_field.className),this.is_rtl&&t.push("chzn-rtl"),this.f_width=this.form_field_jq.outerWidth(),i={id:this.container_id,"class":t.join(" "),style:"width: "+this.f_width+"px;",title:this.form_field.title},r=e("
        ",i),this.is_multiple?r.html('
          '):r.html(''+this.default_text+'
            '),this.form_field_jq.hide().after(r),this.container=e("#"+this.container_id),this.dropdown=this.container.find("div.chzn-drop").first(),s=this.container.height(),o=this.f_width-n(this.dropdown),this.dropdown.css({width:o+"px",top:s+"px"}),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chzn-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chzn-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chzn-search").first(),this.selected_item=this.container.find(".chzn-single").first(),u=o-n(this.search_container)-n(this.search_field),this.search_field.css({width:u+"px"})),this.results_build(),this.set_tab_index(),this.form_field_jq.trigger("liszt:ready",{chosen:this})},i.prototype.register_observers=function(){var e=this;return this.container.mousedown(function(t){return e.container_mousedown(t)}),this.container.mouseup(function(t){return e.container_mouseup(t)}),this.container.mouseenter(function(t){return e.mouse_enter(t)}),this.container.mouseleave(function(t){return e.mouse_leave(t)}),this.search_results.mouseup(function(t){return e.search_results_mouseup(t)}),this.search_results.mouseover(function(t){return e.search_results_mouseover(t)}),this.search_results.mouseout(function(t){return e.search_results_mouseout(t)}),this.form_field_jq.bind("liszt:updated",function(t){return e.results_update_field(t)}),this.form_field_jq.bind("liszt:activate",function(t){return e.activate_field(t)}),this.form_field_jq.bind("liszt:open",function(t){return e.container_mousedown(t)}),this.search_field.blur(function(t){return e.input_blur(t)}),this.search_field.keyup(function(t){return e.keyup_checker(t)}),this.search_field.keydown(function(t){return e.keydown_checker(t)}),this.search_field.focus(function(t){return e.input_focus(t)}),this.is_multiple?this.search_choices.click(function(t){return e.choices_click(t)}):this.container.click(function(e){return e.preventDefault()})},i.prototype.search_field_disabled=function(){this.is_disabled=this.form_field_jq[0].disabled;if(this.is_disabled)return this.container.addClass("chzn-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus",this.activate_action),this.close_field();this.container.removeClass("chzn-disabled"),this.search_field[0].disabled=!1;if(!this.is_multiple)return this.selected_item.bind("focus",this.activate_action)},i.prototype.container_mousedown=function(t){var n;if(!this.is_disabled)return n=t!=null?e(t.target).hasClass("search-choice-close"):!1,t&&t.type==="mousedown"&&!this.results_showing&&t.preventDefault(),!this.pending_destroy_click&&!n?(this.active_field?!this.is_multiple&&t&&(e(t.target)[0]===this.selected_item[0]||e(t.target).parents("a.chzn-single").length)&&(t.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),e(document).click(this.click_test_action),this.results_show()),this.activate_field()):this.pending_destroy_click=!1},i.prototype.container_mouseup=function(e){if(e.target.nodeName==="ABBR"&&!this.is_disabled)return this.results_reset(e)},i.prototype.blur_test=function(e){if(!this.active_field&&this.container.hasClass("chzn-container-active"))return this.close_field()},i.prototype.close_field=function(){return e(document).unbind("click",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},i.prototype.activate_field=function(){return this.container.addClass("chzn-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},i.prototype.test_active_click=function(t){return e(t.target).parents("#"+this.container_id).length?this.active_field=!0:this.close_field()},i.prototype.results_build=function(){var e,t,n,i,s;this.parsing=!0,this.results_data=r.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.find("li.search-choice").remove(),this.choices=0):this.is_multiple||(this.selected_item.addClass("chzn-default").find("span").text(this.default_text),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?this.container.addClass("chzn-container-single-nosearch"):this.container.removeClass("chzn-container-single-nosearch")),e="",s=this.results_data;for(n=0,i=s.length;n'+e("
            ").text(t.label).html()+"")},i.prototype.result_do_highlight=function(e){var t,n,r,i,s;if(e.length){this.result_clear_highlight(),this.result_highlight=e,this.result_highlight.addClass("highlighted"),r=parseInt(this.search_results.css("maxHeight"),10),s=this.search_results.scrollTop(),i=r+s,n=this.result_highlight.position().top+this.search_results.scrollTop(),t=n+this.result_highlight.outerHeight();if(t>=i)return this.search_results.scrollTop(t-r>0?t-r:0);if(n'+t.html+"":r='
          • '+t.html+'
          • ',this.search_container.before(r),i=e("#"+n).find("a").first(),i.click(function(e){return s.choice_destroy_link_click(e)}))},i.prototype.choice_destroy_link_click=function(t){return t.preventDefault(),this.is_disabled?t.stopPropagation:(this.pending_destroy_click=!0,this.choice_destroy(e(t.target)))},i.prototype.choice_destroy=function(e){if(this.result_deselect(e.attr("rel")))return this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&this.search_field.val().length<1&&this.results_hide(),e.parents("li").first().remove(),this.search_field_scale()},i.prototype.results_reset=function(){this.form_field.options[0].selected=!0,this.selected_item.find("span").text(this.default_text),this.is_multiple||this.selected_item.addClass("chzn-default"),this.show_search_field_default(),this.results_reset_cleanup(),this.form_field_jq.trigger("change");if(this.active_field)return this.results_hide()},i.prototype.results_reset_cleanup=function(){return this.current_value=this.form_field_jq.val(),this.selected_item.find("abbr").remove()},i.prototype.result_select=function(e){var t,n,r,i;if(this.result_highlight)return t=this.result_highlight,n=t.attr("id"),this.result_clear_highlight(),this.is_multiple?this.result_deactivate(t):(this.search_results.find(".result-selected").removeClass("result-selected"),this.result_single_selected=t,this.selected_item.removeClass("chzn-default")),t.addClass("result-selected"),i=n.substr(n.lastIndexOf("_")+1),r=this.results_data[i],r.selected=!0,this.form_field.options[r.options_index].selected=!0,this.is_multiple?this.choice_build(r):(this.selected_item.find("span").first().text(r.text),this.allow_single_deselect&&this.single_deselect_control_build()),(!e.metaKey&&!e.ctrlKey||!this.is_multiple)&&this.results_hide(),this.search_field.val(""),(this.is_multiple||this.form_field_jq.val()!==this.current_value)&&this.form_field_jq.trigger("change",{selected:this.form_field.options[r.options_index].value}),this.current_value=this.form_field_jq.val(),this.search_field_scale()},i.prototype.result_activate=function(e){return e.addClass("active-result")},i.prototype.result_deactivate=function(e){return e.removeClass("active-result")},i.prototype.result_deselect=function(t){var n,r;return r=this.results_data[t],this.form_field.options[r.options_index].disabled?!1:(r.selected=!1,this.form_field.options[r.options_index].selected=!1,n=e("#"+this.container_id+"_o_"+t),n.removeClass("result-selected").addClass("active-result").show(),this.result_clear_highlight(),this.winnow_results(),this.form_field_jq.trigger("change",{deselected:this.form_field.options[r.options_index].value}),this.search_field_scale(),!0)},i.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('')},i.prototype.winnow_results=function(){var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y;this.no_results_clear(),f=0,l=this.search_field.val()===this.default_text?"":e("
            ").text(e.trim(this.search_field.val())).html(),o=this.search_contains?"":"^",s=new RegExp(o+l.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),p=new RegExp(l.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),y=this.results_data;for(d=0,m=y.length;d=0||n.html.indexOf("[")===0)){i=n.html.replace(/\[|\]/g,"").split(" ");if(i.length)for(v=0,g=i.length;v"+n.html.substr(c+l.length),h=h.substr(0,c)+""+h.substr(c)):h=n.html,u.html(h),this.result_activate(u),n.group_array_index!=null&&e("#"+this.results_data[n.group_array_index].dom_id).css("display","list-item")):(this.result_highlight&&a===this.result_highlight.attr("id")&&this.result_clear_highlight(),this.result_deactivate(u))}}return f<1&&l.length?this.no_results(l):this.winnow_results_set_highlight()},i.prototype.winnow_results_clear=function(){var t,n,r,i,s;this.search_field.val(""),n=this.search_results.find("li"),s=[];for(r=0,i=n.length;r'+this.results_none_found+' ""'),n.find("span").first().html(t),this.search_results.append(n)},i.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},i.prototype.keydown_arrow=function(){var t,n;this.result_highlight?this.results_showing&&(n=this.result_highlight.nextAll("li.active-result").first(),n&&this.result_do_highlight(n)):(t=this.search_results.find("li.active-result").first(),t&&this.result_do_highlight(e(t)));if(!this.results_showing)return this.results_show()},i.prototype.keyup_arrow=function(){var e;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight)return e=this.result_highlight.prevAll("li.active-result"),e.length?this.result_do_highlight(e.first()):(this.choices>0&&this.results_hide(),this.result_clear_highlight())},i.prototype.keydown_backstroke=function(){var e;if(this.pending_backstroke)return this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke();e=this.search_container.siblings("li.search-choice").last();if(e.length&&!e.hasClass("search-choice-disabled"))return this.pending_backstroke=e,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")},i.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},i.prototype.keydown_checker=function(e){var t,n;t=(n=e.which)!=null?n:e.keyCode,this.search_field_scale(),t!==8&&this.pending_backstroke&&this.clear_backstroke();switch(t){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(e),this.mouse_on_container=!1;break;case 13:e.preventDefault();break;case 38:e.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},i.prototype.search_field_scale=function(){var t,n,r,i,s,o,u,a,f;if(this.is_multiple){r=0,u=0,s="position:absolute; left: -1000px; top: -1000px; display:none;",o=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(a=0,f=o.length;a",{style:s}),n.text(this.search_field.val()),e("body").append(n),u=n.width()+25,n.remove(),u>this.f_width-10&&(u=this.f_width-10),this.search_field.css({width:u+"px"}),t=this.container.height(),this.dropdown.css({top:t+"px"})}},i.prototype.generate_random_id=function(){var t;t="sel"+this.generate_random_char()+this.generate_random_char()+this.generate_random_char();while(e("#"+t).length>0)t+=this.generate_random_char();return t},i}(AbstractChosen),r.Chosen=t,n=function(e){var t;return t=e.outerWidth()-e.width()},r.get_side_border_padding=n}.call(this);chosen-0.9.11/chosen/chosen.proto.js000066400000000000000000001133231206201407400173160ustar00rootroot00000000000000// Chosen, a Select Box Enhancer for jQuery and Protoype // by Patrick Filler for Harvest, http://getharvest.com // // Version 0.9.11 // 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.toUpperCase() === "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.toUpperCase() === "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.is_multiple = this.form_field.multiple; this.set_default_text(); this.set_default_values(); 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.disable_search = this.options.disable_search || false; this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true; this.search_contains = this.options.search_contains || false; this.choices = 0; this.single_backstroke_delete = this.options.single_backstroke_delete || false; this.max_selected_options = this.options.max_selected_options || Infinity; return this.inherit_select_classes = this.options.inherit_select_classes || false; }; AbstractChosen.prototype.set_default_text = function() { if (this.form_field.getAttribute("data-placeholder")) { this.default_text = this.form_field.getAttribute("data-placeholder"); } else if (this.is_multiple) { this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || "Select Some Options"; } else { this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || "Select an Option"; } return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || 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.is_multiple) { if (!this.active_field) { return setTimeout((function() { return _this.container_mousedown(); }), 50); } } else { if (!this.active_field) { return this.activate_field(); } } }; 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 '
          • ' + option.html + '
          • '; } else { return ""; } }; AbstractChosen.prototype.results_update_field = function() { if (!this.is_multiple) { this.results_reset_cleanup(); } 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 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 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 = {}.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() { return Chosen.__super__.constructor.apply(this, arguments); } Chosen.prototype.setup = function() { this.current_value = this.form_field.value; 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('#{default}
              '); this.multi_temp = new Template('
                '); this.choice_temp = new Template('
              • #{choice}
              • '); this.choice_noclose_temp = new Template('
              • #{choice}
              • '); return this.no_results_temp = new Template('
              • ' + this.results_none_found + ' "#{terms}"
              • '); }; Chosen.prototype.set_up_html = function() { var base_template, container_classes, container_props, dd_top, dd_width, sf_width; this.container_id = this.form_field.identify().replace(/[^\w]/g, '_') + "_chzn"; container_classes = ["chzn-container"]; container_classes.push("chzn-container-" + (this.is_multiple ? "multi" : "single")); if (this.inherit_select_classes && this.form_field.className) { container_classes.push(this.form_field.className); } if (this.is_rtl) { container_classes.push("chzn-rtl"); } 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': container_classes.join(' '), 'style': 'width: ' + this.f_width + 'px', 'title': this.form_field.title }; 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.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.form_field.observe("liszt:activate", function(evt) { return _this.activate_field(evt); }); this.form_field.observe("liszt:open", function(evt) { return _this.container_mousedown(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); }); this.search_field.observe("focus", function(evt) { return _this.input_focus(evt); }); if (this.is_multiple) { return this.search_choices.observe("click", function(evt) { return _this.choices_click(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" && !this.results_showing) { 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" && !this.is_disabled) { 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); 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() { 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.addClassName("chzn-default").down("span").update(this.default_text); if (this.disable_search || 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.removeClassName("chzn-default").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 '
              • ' + group.label.escapeHTML() + '
              • '; } 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); } } else if (this.max_selected_options <= this.choices) { this.form_field.fire("liszt:maxselected", { chosen: this }); return false; } dd_top = this.is_multiple ? this.container.getHeight() : this.container.getHeight() - 1; this.form_field.fire("liszt:showing_dropdown", { chosen: this }); 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.form_field.fire("liszt:hiding_dropdown", { chosen: this }); 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; return this.search_field.tabIndex = ti; } }; 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; this.result_select(evt); return this.search_field.focus(); } }; 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; if (this.is_multiple && this.max_selected_options <= this.choices) { this.form_field.fire("liszt:maxselected", { chosen: this }); return false; } choice_id = this.container_id + "_c_" + item.array_index; this.choices += 1; this.search_container.insert({ before: (item.disabled ? this.choice_noclose_temp : this.choice_temp).evaluate({ id: choice_id, choice: item.html, position: item.array_index }) }); if (!item.disabled) { 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) { if (this.result_deselect(link.readAttribute("rel"))) { this.choices -= 1; this.show_search_field_default(); if (this.is_multiple && this.choices > 0 && this.search_field.value.length < 1) { this.results_hide(); } link.up('li').remove(); return this.search_field_scale(); } }; Chosen.prototype.results_reset = function() { this.form_field.options[0].selected = true; this.selected_item.down("span").update(this.default_text); if (!this.is_multiple) { this.selected_item.addClassName("chzn-default"); } this.show_search_field_default(); this.results_reset_cleanup(); if (typeof Event.simulate === 'function') { this.form_field.simulate("change"); } if (this.active_field) { return this.results_hide(); } }; Chosen.prototype.results_reset_cleanup = function() { var deselect_trigger; this.current_value = this.form_field.value; deselect_trigger = this.selected_item.down("abbr"); if (deselect_trigger) { return deselect_trigger.remove(); } }; 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.selected_item.removeClassName("chzn-default"); 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 || evt.ctrlKey) && this.is_multiple)) { this.results_hide(); } this.search_field.value = ""; if (typeof Event.simulate === 'function' && (this.is_multiple || this.form_field.value !== this.current_value)) { this.form_field.simulate("change"); } this.current_value = this.form_field.value; 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]; if (!this.form_field.options[result_data.options_index].disabled) { 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"); } this.search_field_scale(); return true; } else { return false; } }; 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: "" }); } }; Chosen.prototype.winnow_results = function() { var found, option, part, parts, regex, regexAnchor, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len1, _ref; this.no_results_clear(); results = 0; searchText = this.search_field.value === this.default_text ? "" : this.search_field.value.strip().escapeHTML(); regexAnchor = this.search_contains ? "" : "^"; regex = new RegExp(regexAnchor + 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 (this.enable_split_word_search && (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0)) { parts = option.html.replace(/\[|\]/g, "").split(" "); if (parts.length) { for (_j = 0, _len1 = parts.length; _j < _len1; _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) + '
                ' + option.html.substr(startpos + searchText.length); text = text.substr(0, startpos) + '' + 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() { var next_available_destroy; if (this.pending_backstroke) { this.choice_destroy(this.pending_backstroke.down("a")); return this.clear_backstroke(); } else { next_available_destroy = this.search_container.siblings().last(); if (next_available_destroy && next_available_destroy.hasClassName("search-choice") && !next_available_destroy.hasClassName("search-choice-disabled")) { this.pending_backstroke = next_available_destroy; if (this.pending_backstroke) { this.pending_backstroke.addClassName("search-choice-focus"); } if (this.single_backstroke_delete) { return this.keydown_backstroke(); } else { 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); chosen-0.9.11/chosen/chosen.proto.min.js000066400000000000000000000570101206201407400201000ustar00rootroot00000000000000// Chosen, a Select Box Enhancer for jQuery and Protoype // by Patrick Filler for Harvest, http://getharvest.com // // Version 0.9.11 // 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 e;e=function(){function e(){this.options_index=0,this.parsed=[]}return e.prototype.add_node=function(e){return e.nodeName.toUpperCase()==="OPTGROUP"?this.add_group(e):this.add_option(e)},e.prototype.add_group=function(e){var t,n,r,i,s,o;t=this.parsed.length,this.parsed.push({array_index:t,group:!0,label:e.label,children:0,disabled:e.disabled}),s=e.childNodes,o=[];for(r=0,i=s.length;r"+e.html+"")},e.prototype.results_update_field=function(){return this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.result_single_selected=null,this.results_build()},e.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},e.prototype.results_search=function(e){return this.results_showing?this.winnow_results():this.results_show()},e.prototype.keyup_checker=function(e){var t,n;t=(n=e.which)!=null?n:e.keyCode,this.search_field_scale();switch(t){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:e.preventDefault();if(this.results_showing)return this.result_select(e);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},e.prototype.generate_field_id=function(){var e;return e=this.generate_random_id(),this.form_field.id=e,e},e.prototype.generate_random_char=function(){var e,t,n;return e="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",n=Math.floor(Math.random()*e.length),t=e.substring(n,n+1)},e}(),t.AbstractChosen=e}.call(this),function(){var e,t,n,r={}.hasOwnProperty,i=function(e,t){function i(){this.constructor=e}for(var n in t)r.call(t,n)&&(e[n]=t[n]);return i.prototype=t.prototype,e.prototype=new i,e.__super__=t.prototype,e};n=this,e=function(e){function r(){return r.__super__.constructor.apply(this,arguments)}return i(r,e),r.prototype.setup=function(){return this.current_value=this.form_field.value,this.is_rtl=this.form_field.hasClassName("chzn-rtl")},r.prototype.finish_setup=function(){return this.form_field.addClassName("chzn-done")},r.prototype.set_default_values=function(){return r.__super__.set_default_values.call(this),this.single_temp=new Template('#{default}
                  '),this.multi_temp=new Template('
                    '),this.choice_temp=new Template('
                  • #{choice}
                  • '),this.choice_noclose_temp=new Template('
                  • #{choice}
                  • '),this.no_results_temp=new Template('
                  • '+this.results_none_found+' "#{terms}"
                  • ')},r.prototype.set_up_html=function(){var e,n,r,i,s,o;return this.container_id=this.form_field.identify().replace(/[^\w]/g,"_")+"_chzn",n=["chzn-container"],n.push("chzn-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&n.push(this.form_field.className),this.is_rtl&&n.push("chzn-rtl"),this.f_width=this.form_field.getStyle("width")?parseInt(this.form_field.getStyle("width"),10):this.form_field.getWidth(),r={id:this.container_id,"class":n.join(" "),style:"width: "+this.f_width+"px",title:this.form_field.title},e=this.is_multiple?(new Element("div",r)).update(this.multi_temp.evaluate({"default":this.default_text})):(new Element("div",r)).update(this.single_temp.evaluate({"default":this.default_text})),this.form_field.hide().insert({after:e}),this.container=$(this.container_id),this.dropdown=this.container.down("div.chzn-drop"),i=this.container.getHeight(),s=this.f_width-t(this.dropdown),this.dropdown.setStyle({width:s+"px",top:i+"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"),this.is_multiple?(this.search_choices=this.container.down("ul.chzn-choices"),this.search_container=this.container.down("li.search-field")):(this.search_container=this.container.down("div.chzn-search"),this.selected_item=this.container.down(".chzn-single"),o=s-t(this.search_container)-t(this.search_field),this.search_field.setStyle({width:o+"px"})),this.results_build(),this.set_tab_index(),this.form_field.fire("liszt:ready",{chosen:this})},r.prototype.register_observers=function(){var e=this;return this.container.observe("mousedown",function(t){return e.container_mousedown(t)}),this.container.observe("mouseup",function(t){return e.container_mouseup(t)}),this.container.observe("mouseenter",function(t){return e.mouse_enter(t)}),this.container.observe("mouseleave",function(t){return e.mouse_leave(t)}),this.search_results.observe("mouseup",function(t){return e.search_results_mouseup(t)}),this.search_results.observe("mouseover",function(t){return e.search_results_mouseover(t)}),this.search_results.observe("mouseout",function(t){return e.search_results_mouseout(t)}),this.form_field.observe("liszt:updated",function(t){return e.results_update_field(t)}),this.form_field.observe("liszt:activate",function(t){return e.activate_field(t)}),this.form_field.observe("liszt:open",function(t){return e.container_mousedown(t)}),this.search_field.observe("blur",function(t){return e.input_blur(t)}),this.search_field.observe("keyup",function(t){return e.keyup_checker(t)}),this.search_field.observe("keydown",function(t){return e.keydown_checker(t)}),this.search_field.observe("focus",function(t){return e.input_focus(t)}),this.is_multiple?this.search_choices.observe("click",function(t){return e.choices_click(t)}):this.container.observe("click",function(e){return e.preventDefault()})},r.prototype.search_field_disabled=function(){this.is_disabled=this.form_field.disabled;if(this.is_disabled)return this.container.addClassName("chzn-disabled"),this.search_field.disabled=!0,this.is_multiple||this.selected_item.stopObserving("focus",this.activate_action),this.close_field();this.container.removeClassName("chzn-disabled"),this.search_field.disabled=!1;if(!this.is_multiple)return this.selected_item.observe("focus",this.activate_action)},r.prototype.container_mousedown=function(e){var t;if(!this.is_disabled)return t=e!=null?e.target.hasClassName("search-choice-close"):!1,e&&e.type==="mousedown"&&!this.results_showing&&e.stop(),!this.pending_destroy_click&&!t?(this.active_field?!this.is_multiple&&e&&(e.target===this.selected_item||e.target.up("a.chzn-single"))&&this.results_toggle():(this.is_multiple&&this.search_field.clear(),document.observe("click",this.click_test_action),this.results_show()),this.activate_field()):this.pending_destroy_click=!1},r.prototype.container_mouseup=function(e){if(e.target.nodeName==="ABBR"&&!this.is_disabled)return this.results_reset(e)},r.prototype.blur_test=function(e){if(!this.active_field&&this.container.hasClassName("chzn-container-active"))return this.close_field()},r.prototype.close_field=function(){return document.stopObserving("click",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClassName("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},r.prototype.activate_field=function(){return this.container.addClassName("chzn-container-active"),this.active_field=!0,this.search_field.value=this.search_field.value,this.search_field.focus()},r.prototype.test_active_click=function(e){return e.target.up("#"+this.container_id)?this.active_field=!0:this.close_field()},r.prototype.results_build=function(){var e,t,r,i,s;this.parsing=!0,this.results_data=n.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.select("li.search-choice").invoke("remove"),this.choices=0):this.is_multiple||(this.selected_item.addClassName("chzn-default").down("span").update(this.default_text),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?this.container.addClassName("chzn-container-single-nosearch"):this.container.removeClassName("chzn-container-single-nosearch")),e="",s=this.results_data;for(r=0,i=s.length;r'+e.label.escapeHTML()+"")},r.prototype.result_do_highlight=function(e){var t,n,r,i,s;this.result_clear_highlight(),this.result_highlight=e,this.result_highlight.addClassName("highlighted"),r=parseInt(this.search_results.getStyle("maxHeight"),10),s=this.search_results.scrollTop,i=r+s,n=this.result_highlight.positionedOffset().top,t=n+this.result_highlight.getHeight();if(t>=i)return this.search_results.scrollTop=t-r>0?t-r:0;if(n0&&this.search_field.value.length<1&&this.results_hide(),e.up("li").remove(),this.search_field_scale()},r.prototype.results_reset=function(){this.form_field.options[0].selected=!0,this.selected_item.down("span").update(this.default_text),this.is_multiple||this.selected_item.addClassName("chzn-default"),this.show_search_field_default(),this.results_reset_cleanup(),typeof Event.simulate=="function"&&this.form_field.simulate("change");if(this.active_field)return this.results_hide()},r.prototype.results_reset_cleanup=function(){var e;this.current_value=this.form_field.value,e=this.selected_item.down("abbr");if(e)return e.remove()},r.prototype.result_select=function(e){var t,n,r;if(this.result_highlight)return t=this.result_highlight,this.result_clear_highlight(),this.is_multiple?this.result_deactivate(t):(this.search_results.descendants(".result-selected").invoke("removeClassName","result-selected"),this.selected_item.removeClassName("chzn-default"),this.result_single_selected=t),t.addClassName("result-selected"),r=t.id.substr(t.id.lastIndexOf("_")+1),n=this.results_data[r],n.selected=!0,this.form_field.options[n.options_index].selected=!0,this.is_multiple?this.choice_build(n):(this.selected_item.down("span").update(n.html),this.allow_single_deselect&&this.single_deselect_control_build()),(!e.metaKey&&!e.ctrlKey||!this.is_multiple)&&this.results_hide(),this.search_field.value="",typeof Event.simulate=="function"&&(this.is_multiple||this.form_field.value!==this.current_value)&&this.form_field.simulate("change"),this.current_value=this.form_field.value,this.search_field_scale()},r.prototype.result_activate=function(e){return e.addClassName("active-result")},r.prototype.result_deactivate=function(e){return e.removeClassName("active-result")},r.prototype.result_deselect=function(e){var t,n;return n=this.results_data[e],this.form_field.options[n.options_index].disabled?!1:(n.selected=!1,this.form_field.options[n.options_index].selected=!1,t=$(this.container_id+"_o_"+e),t.removeClassName("result-selected").addClassName("active-result").show(),this.result_clear_highlight(),this.winnow_results(),typeof Event.simulate=="function"&&this.form_field.simulate("change"),this.search_field_scale(),!0)},r.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect&&!this.selected_item.down("abbr"))return this.selected_item.down("span").insert({after:''})},r.prototype.winnow_results=function(){var e,t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m;this.no_results_clear(),u=0,a=this.search_field.value===this.default_text?"":this.search_field.value.strip().escapeHTML(),s=this.search_contains?"":"^",i=new RegExp(s+a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),c=new RegExp(a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),m=this.results_data;for(h=0,d=m.length;h=0||t.html.indexOf("[")===0)){r=t.html.replace(/\[|\]/g,"").split(" ");if(r.length)for(p=0,v=r.length;p"+t.html.substr(f+a.length),l=l.substr(0,f)+""+l.substr(f)):l=t.html,$(o).innerHTML!==l&&$(o).update(l),this.result_activate($(o)),t.group_array_index!=null&&$(this.results_data[t.group_array_index].dom_id).setStyle({display:"list-item"})):($(o)===this.result_highlight&&this.result_clear_highlight(),this.result_deactivate($(o)))}}return u<1&&a.length?this.no_results(a):this.winnow_results_set_highlight()},r.prototype.winnow_results_clear=function(){var e,t,n,r,i;this.search_field.clear(),t=this.search_results.select("li"),i=[];for(n=0,r=t.length;n0&&this.results_hide(),this.result_clear_highlight())},r.prototype.keydown_backstroke=function(){var e;if(this.pending_backstroke)return this.choice_destroy(this.pending_backstroke.down("a")),this.clear_backstroke();e=this.search_container.siblings().last();if(e&&e.hasClassName("search-choice")&&!e.hasClassName("search-choice-disabled"))return this.pending_backstroke=e,this.pending_backstroke&&this.pending_backstroke.addClassName("search-choice-focus"),this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClassName("search-choice-focus")},r.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClassName("search-choice-focus"),this.pending_backstroke=null},r.prototype.keydown_checker=function(e){var t,n;t=(n=e.which)!=null?n:e.keyCode,this.search_field_scale(),t!==8&&this.pending_backstroke&&this.clear_backstroke();switch(t){case 8:this.backstroke_length=this.search_field.value.length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(e),this.mouse_on_container=!1;break;case 13:e.preventDefault();break;case 38:e.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},r.prototype.search_field_scale=function(){var e,t,n,r,i,s,o,u,a;if(this.is_multiple){n=0,o=0,i="position:absolute; left: -1000px; top: -1000px; display:none;",s=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(u=0,a=s.length;uthis.f_width-10&&(o=this.f_width-10),this.search_field.setStyle({width:o+"px"}),e=this.container.getHeight(),this.dropdown.setStyle({top:e+"px"})}},r}(AbstractChosen),n.Chosen=e,Prototype.Browser.IE&&/MSIE (\d+\.\d+);/.test(navigator.userAgent)&&(Prototype.BrowserFeatures.Version=new Number(RegExp.$1)),t=function(e){var t,n;return t=new Element.Layout(e),n=t.get("border-left")+t.get("border-right")+t.get("padding-left")+t.get("padding-right")},n.get_side_border_padding=t}.call(this);chosen-0.9.11/coffee/000077500000000000000000000000001206201407400143045ustar00rootroot00000000000000chosen-0.9.11/coffee/chosen.jquery.coffee000066400000000000000000000507261206201407400202640ustar00rootroot00000000000000### 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 # Continue on if running IE document type but in compatibility mode return this if $.browser.msie and ($.browser.version is "6.0" or ($.browser.version is "7.0" and document.documentMode is 7 )) this.each((input_field) -> $this = $ this $this.data('chosen', new Chosen(this, options)) unless $this.hasClass "chzn-done" ) }) class Chosen extends AbstractChosen setup: -> @form_field_jq = $ @form_field @current_value = @form_field_jq.val() @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(/[^\w]/g, '_') else this.generate_field_id() @container_id += "_chzn" container_classes = ["chzn-container"] container_classes.push "chzn-container-" + (if @is_multiple then "multi" else "single") container_classes.push @form_field.className if @inherit_select_classes && @form_field.className container_classes.push "chzn-rtl" if @is_rtl @f_width = @form_field_jq.outerWidth() container_props = id: @container_id class: container_classes.join ' ' style: 'width: ' + (@f_width) + 'px;' #use parens around @f_width so coffeescript doesn't think + ' px' is a function parameter title: @form_field.title container_div = ($ "
                    ", container_props) if @is_multiple container_div.html '
                      ' else container_div.html '' + @default_text + '
                        ' @form_field_jq.hide().after container_div @container = ($ '#' + @container_id) @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) @form_field_jq.bind "liszt:activate", (evt) => this.activate_field(evt) @form_field_jq.bind "liszt:open", (evt) => this.container_mousedown(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) @search_field.focus (evt) => this.input_focus(evt) if @is_multiple @search_choices.click (evt) => this.choices_click(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" and not @results_showing evt.preventDefault() 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" and not @is_disabled blur_test: (evt) -> this.close_field() if not @active_field and @container.hasClass "chzn-container-active" close_field: -> $(document).unbind "click", @click_test_action @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: -> @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.addClass("chzn-default").find("span").text(@default_text) if @disable_search or @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.removeClass("chzn-default").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 '
                      • ' + $("
                        ").text(group.label).html() + '
                      • ' 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 ) else if @max_selected_options <= @choices @form_field_jq.trigger("liszt:maxselected", {chosen: this}) return false dd_top = if @is_multiple then @container.height() else (@container.height() - 1) @form_field_jq.trigger("liszt:showing_dropdown", {chosen: this}) @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() @form_field_jq.trigger("liszt:hiding_dropdown", {chosen: this}) @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 @search_field.attr "tabindex", ti 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_field.focus() 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) -> if @is_multiple and @max_selected_options <= @choices @form_field_jq.trigger("liszt:maxselected", {chosen: this}) return false # fire event choice_id = @container_id + "_c_" + item.array_index @choices += 1 if item.disabled html = '
                      • ' + item.html + '
                      • ' else html = '
                      • ' + item.html + '
                      • ' @search_container.before html 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) -> if this.result_deselect (link.attr "rel") @choices -= 1 this.show_search_field_default() this.results_hide() if @is_multiple and @choices > 0 and @search_field.val().length < 1 link.parents('li').first().remove() this.search_field_scale() results_reset: -> @form_field.options[0].selected = true @selected_item.find("span").text @default_text @selected_item.addClass("chzn-default") if not @is_multiple this.show_search_field_default() this.results_reset_cleanup() @form_field_jq.trigger "change" this.results_hide() if @active_field results_reset_cleanup: -> @current_value = @form_field_jq.val() @selected_item.find("abbr").remove() 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 @selected_item.removeClass("chzn-default") 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 or evt.ctrlKey) and @is_multiple @search_field.val "" @form_field_jq.trigger "change", {'selected': @form_field.options[item.options_index].value} if @is_multiple || @form_field_jq.val() != @current_value @current_value = @form_field_jq.val() 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] if not @form_field.options[result_data.options_index].disabled 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", {deselected: @form_field.options[result_data.options_index].value} this.search_field_scale() return true else return false single_deselect_control_build: -> @selected_item.find("span").first().after "" 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 $('
                        ').text($.trim(@search_field.val())).html() regexAnchor = if @search_contains then "" else "^" regex = new RegExp(regexAnchor + 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 @enable_split_word_search and (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) + '' + option.html.substr(startpos + searchText.length) text = text.substr(0, startpos) + '' + 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 = $('
                      • ' + @results_none_found + ' ""
                      • ') 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 next_available_destroy = @search_container.siblings("li.search-choice").last() if next_available_destroy.length and not next_available_destroy.hasClass("search-choice-disabled") @pending_backstroke = next_available_destroy if @single_backstroke_delete @keydown_backstroke() else @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 = $('
                        ', { '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 root.Chosen = Chosen get_side_border_padding = (elmt) -> side_border_padding = elmt.outerWidth() - elmt.width() root.get_side_border_padding = get_side_border_padding chosen-0.9.11/coffee/chosen.proto.coffee000066400000000000000000000510641206201407400201040ustar00rootroot00000000000000### Chosen source: generate output using 'cake build' Copyright (c) 2011 by Harvest ### root = this class Chosen extends AbstractChosen setup: -> @current_value = @form_field.value @is_rtl = @form_field.hasClassName "chzn-rtl" finish_setup: -> @form_field.addClassName "chzn-done" set_default_values: -> super() # HTML Templates @single_temp = new Template('#{default}
                          ') @multi_temp = new Template('
                            ') @choice_temp = new Template('
                          • #{choice}
                          • ') @choice_noclose_temp = new Template('
                          • #{choice}
                          • ') @no_results_temp = new Template('
                          • ' + @results_none_found + ' "#{terms}"
                          • ') set_up_html: -> @container_id = @form_field.identify().replace(/[^\w]/g, '_') + "_chzn" container_classes = ["chzn-container"] container_classes.push "chzn-container-" + (if @is_multiple then "multi" else "single") container_classes.push @form_field.className if @inherit_select_classes && @form_field.className container_classes.push "chzn-rtl" if @is_rtl @f_width = if @form_field.getStyle("width") then parseInt @form_field.getStyle("width"), 10 else @form_field.getWidth() container_props = 'id': @container_id 'class': container_classes.join ' ' 'style': 'width: ' + (@f_width) + 'px' #use parens around @f_width so coffeescript doesn't think + ' px' is a function parameter 'title': @form_field.title 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) @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) @form_field.observe "liszt:activate", (evt) => this.activate_field(evt) @form_field.observe "liszt:open", (evt) => this.container_mousedown(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) @search_field.observe "focus", (evt) => this.input_focus(evt) if @is_multiple @search_choices.observe "click", (evt) => this.choices_click(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" and not @results_showing 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" and not @is_disabled blur_test: (evt) -> this.close_field() if not @active_field and @container.hasClassName("chzn-container-active") close_field: -> document.stopObserving "click", @click_test_action @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: -> @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.addClassName("chzn-default").down("span").update(@default_text) if @disable_search or @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.removeClassName("chzn-default").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 '
                          • ' + group.label.escapeHTML() + '
                          • ' 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 ) else if @max_selected_options <= @choices @form_field.fire("liszt:maxselected", {chosen: this}) return false dd_top = if @is_multiple then @container.getHeight() else (@container.getHeight() - 1) @form_field.fire("liszt:showing_dropdown", {chosen: this}) @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() @form_field.fire("liszt:hiding_dropdown", {chosen: this}) @dropdown.setStyle({"left":"-9000px"}) @results_showing = false set_tab_index: (el) -> if @form_field.tabIndex ti = @form_field.tabIndex @form_field.tabIndex = -1 @search_field.tabIndex = ti 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_field.focus() 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) -> if @is_multiple and @max_selected_options <= @choices @form_field.fire("liszt:maxselected", {chosen: this}) return false choice_id = @container_id + "_c_" + item.array_index @choices += 1 @search_container.insert before: (if item.disabled then @choice_noclose_temp else @choice_temp).evaluate id: choice_id choice: item.html position: item.array_index if not item.disabled 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) -> if this.result_deselect link.readAttribute("rel") @choices -= 1 this.show_search_field_default() this.results_hide() if @is_multiple and @choices > 0 and @search_field.value.length < 1 link.up('li').remove() this.search_field_scale() results_reset: -> @form_field.options[0].selected = true @selected_item.down("span").update(@default_text) @selected_item.addClassName("chzn-default") if not @is_multiple this.show_search_field_default() this.results_reset_cleanup() @form_field.simulate("change") if typeof Event.simulate is 'function' this.results_hide() if @active_field results_reset_cleanup: -> @current_value = @form_field.value deselect_trigger = @selected_item.down("abbr") deselect_trigger.remove() if(deselect_trigger) 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" @selected_item.removeClassName("chzn-default") @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 or evt.ctrlKey) and @is_multiple @search_field.value = "" @form_field.simulate("change") if typeof Event.simulate is 'function' && (@is_multiple || @form_field.value != @current_value) @current_value = @form_field.value 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] if not @form_field.options[result_data.options_index].disabled 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() return true else return false single_deselect_control_build: -> @selected_item.down("span").insert { after: "" } 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() regexAnchor = if @search_contains then "" else "^" regex = new RegExp(regexAnchor + 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 @enable_split_word_search and (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) + '
                            ' + option.html.substr(startpos + searchText.length) text = text.substr(0, startpos) + '' + 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 next_available_destroy = @search_container.siblings().last() if next_available_destroy and next_available_destroy.hasClassName("search-choice") and not next_available_destroy.hasClassName("search-choice-disabled") @pending_backstroke = next_available_destroy @pending_backstroke.addClassName("search-choice-focus") if @pending_backstroke if @single_backstroke_delete @keydown_backstroke() else @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 chosen-0.9.11/coffee/lib/000077500000000000000000000000001206201407400150525ustar00rootroot00000000000000chosen-0.9.11/coffee/lib/abstract-chosen.coffee000066400000000000000000000102101206201407400212750ustar00rootroot00000000000000### Chosen source: generate output using 'cake build' Copyright (c) 2011 by Harvest ### root = this class AbstractChosen constructor: (@form_field, @options={}) -> @is_multiple = @form_field.multiple this.set_default_text() this.set_default_values() 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 @disable_search = @options.disable_search || false @enable_split_word_search = if @options.enable_split_word_search? then @options.enable_split_word_search else true @search_contains = @options.search_contains || false @choices = 0 @single_backstroke_delete = @options.single_backstroke_delete || false @max_selected_options = @options.max_selected_options || Infinity @inherit_select_classes = @options.inherit_select_classes || false set_default_text: -> if @form_field.getAttribute("data-placeholder") @default_text = @form_field.getAttribute("data-placeholder") else if @is_multiple @default_text = @options.placeholder_text_multiple || @options.placeholder_text || "Select Some Options" else @default_text = @options.placeholder_text_single || @options.placeholder_text || "Select an Option" @results_none_found = @form_field.getAttribute("data-no_results_text") || @options.no_results_text || "No results match" mouse_enter: -> @mouse_on_container = true mouse_leave: -> @mouse_on_container = false input_focus: (evt) -> if @is_multiple setTimeout (=> this.container_mousedown()), 50 unless @active_field else @activate_field() 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 "" '
                          • ' + option.html + '
                          • ' else "" results_update_field: -> this.results_reset_cleanup() if not @is_multiple 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 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" rand = Math.floor(Math.random() * chars.length) newchar = chars.substring rand, rand+1 root.AbstractChosen = AbstractChosen chosen-0.9.11/coffee/lib/select-parser.coffee000066400000000000000000000027301206201407400207760ustar00rootroot00000000000000class SelectParser constructor: -> @options_index = 0 @parsed = [] add_node: (child) -> if child.nodeName.toUpperCase() 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.toUpperCase() 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 chosen-0.9.11/example.jquery.html000066400000000000000000002260351206201407400167240ustar00rootroot00000000000000

                            Chosen

                            Chosen is a JavaScript plugin for Prototype and jQuery that makes long, unwieldy select boxes much more user-friendly. For more information (including usage, explanation and faqs), check out the online documentation.

                            Standard Select

                            Turns This
                            Into This

                            Multiple Select

                            Turns This
                            Into This

                            <optgroup> Support

                            Single Select with Groups
                            Multiple Select with Groups

                            Selected and Disabled Support

                            Chosen automatically highlights selected options and removes disabled options.

                            Single Select
                            Multiple Select

                            It is also possible to prevent selected options being deselected by also making them disabled.

                            Default Text Support

                            Chosen automatically sets the default field text ("Choose a country...") by reading the select element's data-placeholder value. If no data-placeholder value is present, it will default to "Select Some Option" or "Select Some Options" depending on whether the select is single or multiple. You can change these elements in the plugin js file as you see fit.

                            <select data-placeholder="Choose a country..." style="width:350px;" multiple class="chzn-select">

                            Note: on single selects, the first element is assumed to be selected by the browser. To take advantage of the default text support, you will need to include a blank option as the first element of your select list.

                            No Results Text Support

                            Setting the "No results" search text is as easy as passing an option when you create Chosen:

                            $(".chzn-select").chosen({no_results_text: "No results matched"});

                            Limit Selected Options in Multiselect

                            You can easily limit how many options can user select:

                            $(".chzn-select").chosen({max_selected_options: 5});

                            If you try to select another option with limit reached liszt:maxselected event is triggered:

                            $(".chzn-select").bind("liszt:maxselected", function () { ... });

                            Allow Deselect on Single Selects

                            When a single select box isn't a required field, you can set allow_single_deselect: true and Chosen will add a UI element for option deselection. This will only work if the first option has blank text.

                            Right to Left Support

                            Chosen supports right to left select boxes too. just add "chzn-rtl" in addition to "chzn-select" to your select tags and you are good to go.

                            <select class="chzn-select chzn-rtl">

                            Single right to left select
                            Multiple right to left select

                            Change / Update Events

                            • Form Field Change

                              When working with form fields, you often want to perform some behavior after a value has been selected or deselected. Whenever a user selects a field in Chosen, it triggers a "change" event* on the original form field. That let's you do something like this:

                              $("#form_field").chosen().change( … );

                              Note: Prototype doesn't offer support for triggering standard browser events. Event.simulate is required to trigger the change event when using the Prototype version.

                            • Updating Chosen Dynamically

                              If you need to update the options in your select field and want Chosen to pick up the changes, you'll need to trigger the "liszt:updated" event on the field. Chosen will re-build itself based on the updated content.

                              • jQuery Version: $("#form_field").trigger("liszt:updated");
                              • Prototype Version: Event.fire($("form_field"), "liszt:updated");

                            Setup (for jQuery)

                            Using Chosen is easy as can be.

                            1. Download the plugin and copy the chosen files to your app.
                            2. Activate the plugin on the select boxes of your choice: $(".chzn-select").chosen()
                            3. Disco.
                            chosen-0.9.11/example.proto.html000066400000000000000000002271541206201407400165530ustar00rootroot00000000000000

                            Chosen

                            Chosen is a JavaScript plugin for jQuery and Prototype that makes long, unwieldy select boxes much more user-friendly. For more information (including usage, explanation and faqs), check out the online documentation.

                            Standard Select

                            Turns This
                            Into This

                            Multiple Select

                            Turns This
                            Into This

                            <optgroup> Support

                            Single Select with Groups
                            Multiple Select with Groups

                            Selected and Disabled Support

                            Chosen automatically highlights selected options and removes disabled options.

                            Single Select
                            Multiple Select

                            It is also possible to prevent selected options being deselected by also making them disabled.

                            Default Text Support

                            Chosen automatically sets the default field text ("Choose a country...") by reading the select element's data-placeholder value. If no data-placeholder value is present, it will default to "Select Some Option" or "Select Some Options" depending on whether the select is single or multiple. You can change these elements in the plugin js file as you see fit.

                            <select data-placeholder="Choose a country..." style="width:350px;" multiple class="chzn-select">

                            Note: on single selects, the first element is assumed to be selected by the browser. To take advantage of the default text support, you will need to include a blank option as the first element of your select list.

                            No Results Text Support

                            Setting the "No results" search text is as easy as passing an option when you create Chosen:

                            new Chosen($("chzn_select_field"),{no_results_text: "No results matched"});

                            Limit Selected Options in Multiselect

                            You can easily limit how many options can user select:

                            new Chosen($("chzn_select_field"),{max_selected_options: 5});

                            If you try to select another option with limit reached liszt:maxselected event is triggered:

                            $("chzn_select_field").observe("liszt:maxselected", function(evt) { ... });

                            Allow Deselect on Single Selects

                            When a single select box isn't a required field, you can set allow_single_deselect: true and Chosen will add a UI element for option deselection. This will only work if the first option has blank text.

                            Right to Left Support

                            Chosen supports right to left select boxes too. just add "chzn-rtl" in addition to "chzn-select" to your select tags and you are good to go.

                            <select class="chzn-select chzn-rtl">

                            Single right to left select
                            Multiple right to left select

                            Change / Update Events

                            • Form Field Change

                              When working with form fields, you often want to perform some behavior after a value has been selected or deselected. Whenever a user selects a field in Chosen, it triggers a "change" event* on the original form field. That let's you do something like this:

                              $("#form_field").chosen().change( … );

                              Note: Prototype doesn't offer support for triggering standard browser events. Event.simulate is required to trigger the change event when using the Prototype version.

                            • Updating Chosen Dynamically

                              If you need to update the options in your select field and want Chosen to pick up the changes, you'll need to trigger the "liszt:updated" event on the field. Chosen will re-build itself based on the updated content.

                              • jQuery Version: $("#form_field").trigger("liszt:updated");
                              • Prototype Version: Event.fire($("form_field"), "liszt:updated");

                            Setup (for Prototype)

                            Using Chosen is easy as can be.

                            1. Download the plugin and copy the chosen files to your app.
                            2. Activate the plugin by creating a new instance of Chosen: new Chosen(some_form_field);
                            3. Disco.
                            chosen-0.9.11/package.json000066400000000000000000000007551206201407400153520ustar00rootroot00000000000000{ "author": "harvest", "name": "chosen", "version": "0.9.11", "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.4", "uglify-js": ">= 1.2.5 <2.0" } }