]> source.dussan.org Git - nextcloud-server.git/commitdiff
initial work on new user management
authorRobin Appelman <icewind1991@gmail.com>
Tue, 9 Aug 2011 13:25:18 +0000 (15:25 +0200)
committerRobin Appelman <icewind1991@gmail.com>
Tue, 9 Aug 2011 13:29:13 +0000 (15:29 +0200)
14 files changed:
3rdparty/css/chosen-sprite.png [new file with mode: 0644]
3rdparty/css/chosen.css [new file with mode: 0644]
3rdparty/js/chosen/LICENSE.md [new file with mode: 0644]
3rdparty/js/chosen/README.md [new file with mode: 0644]
3rdparty/js/chosen/VERSION [new file with mode: 0644]
3rdparty/js/chosen/chosen.jquery.js [new file with mode: 0644]
3rdparty/js/chosen/chosen.jquery.min.js [new file with mode: 0644]
3rdparty/js/chosen/chosen.proto.js [new file with mode: 0644]
3rdparty/js/chosen/chosen.proto.min.js [new file with mode: 0644]
admin/css/users.css [new file with mode: 0644]
admin/js/users.js
admin/templates/users.php
admin/users.php
core/js/js.js

diff --git a/3rdparty/css/chosen-sprite.png b/3rdparty/css/chosen-sprite.png
new file mode 100644 (file)
index 0000000..f20db44
Binary files /dev/null and b/3rdparty/css/chosen-sprite.png differ
diff --git a/3rdparty/css/chosen.css b/3rdparty/css/chosen.css
new file mode 100644 (file)
index 0000000..247d07b
--- /dev/null
@@ -0,0 +1,340 @@
+/* @group Base */
+select.chzn-select {
+  visibility: hidden;
+  height: 28px !important;
+  min-height: 28px !important;
+}
+.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);
+  -o-box-shadow     : 0 4px 5px rgba(0,0,0,.15);
+  box-shadow        : 0 4px 5px rgba(0,0,0,.15);
+  z-index: 999;
+}
+/* @end */
+
+/* @group Single Chosen */
+.chzn-container-single .chzn-single {
+  background-color: #fff;
+  background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white));
+  background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%);
+  background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%);
+  background-image: -o-linear-gradient(top, #eeeeee 0%,#ffffff 50%);
+  background-image: -ms-linear-gradient(top, #eeeeee 0%,#ffffff 50%);
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 );
+  background-image: linear-gradient(top, #eeeeee 0%,#ffffff 50%);
+  -webkit-border-radius: 4px;
+  -moz-border-radius   : 4px;
+  border-radius        : 4px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+  border: 1px solid #aaa;
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  position: relative;
+  height: 26px;
+  line-height: 26px;
+  padding: 0 0 0 8px;
+  color: #444;
+  text-decoration: none;
+}
+.chzn-container-single .chzn-single span {
+  margin-right: 26px;
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  -o-text-overflow: ellipsis;
+  -ms-text-overflow: ellipsis;
+  -moz-binding: url('/xml/ellipsis.xml#ellipsis');
+  text-overflow: ellipsis;
+}
+.chzn-container-single .chzn-single div {
+  -webkit-border-radius: 0 4px 4px 0;
+  -moz-border-radius   : 0 4px 4px 0;
+  border-radius        : 0 4px 4px 0;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+  background: #ccc;
+  background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
+  background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
+  background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
+  background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%);
+  background-image: -ms-linear-gradient(top, #cccccc 0%,#eeeeee 60%);
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#eeeeee',GradientType=0 );
+  background-image: linear-gradient(top, #cccccc 0%,#eeeeee 60%);
+  border-left: 1px solid #aaa;
+  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 1px;
+  display: block;
+  width: 100%;
+  height: 100%;
+}
+.chzn-container-single .chzn-search {
+  padding: 3px 4px;
+  margin: 0;
+  white-space: nowrap;
+}
+.chzn-container-single .chzn-search input {
+  background: #fff url('chosen-sprite.png') no-repeat 100% -20px;
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+  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 */
+
+/* @group Multi Chosen */
+.chzn-container-multi .chzn-choices {
+  background-color: #fff;
+  background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
+  background-image: -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+  background-image: -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+  background-image: -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
+  background-image: -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 );
+  background-image: linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+  border: 1px solid #aaa;
+  margin: 0;
+  padding: 0;
+  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;
+  padding: 5px;
+  margin: 1px 0;
+  outline: 0;
+  -webkit-box-shadow: none;
+  -moz-box-shadow   : none;
+  -o-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;
+  background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e4e4e4), color-stop(0.7, #eeeeee));
+  background-image: -webkit-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%);
+  background-image: -moz-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%);
+  background-image: -o-linear-gradient(bottom, #e4e4e4 0%, #eeeeee 70%);
+  background-image: -ms-linear-gradient(top, #e4e4e4 0%,#eeeeee 70%);
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e4e4e4', endColorstr='#eeeeee',GradientType=0 );
+  background-image: linear-gradient(top, #e4e4e4 0%,#eeeeee 70%);
+  color: #333;
+  border: 1px solid #b4b4b4;
+  line-height: 13px;
+  padding: 3px 19px 3px 6px;
+  margin: 3px 0 3px 5px;
+  position: relative;
+}
+.chzn-container-multi .chzn-choices .search-choice span {
+  cursor: default;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus {
+  background: #d4d4d4;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
+  display: block;
+  position: absolute;
+  right: 5px;
+  top: 6px;
+  width: 8px;
+  height: 9px;
+  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 -9px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
+  background-position: right -9px;
+}
+/* @end */
+
+/* @group Results */
+.chzn-container .chzn-results {
+  margin: 0 4px 4px 0;
+  max-height: 190px;
+  padding: 0 0 0 4px;
+  position: relative;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.chzn-container-multi .chzn-results {
+  margin: -1px 0 0;
+  padding: 0;
+}
+.chzn-container .chzn-results li {
+  line-height: 80%;
+  padding: 7px 7px 8px;
+  margin: 0;
+  list-style: none;
+}
+.chzn-container .chzn-results .active-result {
+  cursor: pointer;
+}
+.chzn-container .chzn-results .highlighted {
+  background: #3875d7;
+  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;
+}
+.chzn-container .chzn-results .group-result {
+  cursor: default;
+  color: #999;
+  font-weight: bold;
+}
+.chzn-container .chzn-results .group-option {
+  padding-left: 20px;
+}
+.chzn-container-multi .chzn-drop .result-selected {
+  display: none;
+}
+/* @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);
+  -o-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;
+  -o-box-shadow     : 0 1px 0 #fff inset;
+  box-shadow        : 0 1px 0 #fff inset;
+  background-color: #eee;
+  background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee));
+  background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%);
+  background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%);
+  background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%);
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 );
+  background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%);
+  -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);
+  -o-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 Right to Left */
+.chzn-rtl { direction:rtl;text-align: right; }
+.chzn-rtl .chzn-single { padding-left: 0; padding-right: 8px; }
+.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; }
+.chzn-rtl .chzn-single div { 
+  left: 0; right: auto; 
+  border-left: none; border-right: 1px solid #aaaaaa;
+  -webkit-border-radius: 4px 0 0 4px;
+  -moz-border-radius   : 4px 0 0 4px;
+  border-radius        : 4px 0 0 4px; 
+}
+.chzn-rtl .chzn-choices li { float: right; }
+.chzn-rtl .chzn-choices .search-choice { padding: 3px 6px 3px 19px; margin: 3px 5px 3px 0; }
+.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 5px; right: auto; background-position: right top;}
+.chzn-rtl.chzn-container-single .chzn-results { margin-left: 4px; margin-right: 0; padding-left: 0; padding-right: 4px; }
+.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 20px; }
+.chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; }
+.chzn-rtl .chzn-search input {
+  background: url('chosen-sprite.png') no-repeat -38px -20px, #ffffff;
+  background: url('chosen-sprite.png') no-repeat -38px -20px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
+  background: url('chosen-sprite.png') no-repeat -38px -20px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);  
+  background: url('chosen-sprite.png') no-repeat -38px -20px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+  background: url('chosen-sprite.png') no-repeat -38px -20px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
+  background: url('chosen-sprite.png') no-repeat -38px -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+  background: url('chosen-sprite.png') no-repeat -38px -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+  background: url('chosen-sprite.png') no-repeat -38px -20px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+  padding: 4px 5px 4px 20px;
+}
+/* @end */
\ No newline at end of file
diff --git a/3rdparty/js/chosen/LICENSE.md b/3rdparty/js/chosen/LICENSE.md
new file mode 100644 (file)
index 0000000..80109bb
--- /dev/null
@@ -0,0 +1,24 @@
+# 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.
\ No newline at end of file
diff --git a/3rdparty/js/chosen/README.md b/3rdparty/js/chosen/README.md
new file mode 100644 (file)
index 0000000..cee8ed1
--- /dev/null
@@ -0,0 +1,46 @@
+# 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 'cake build' to generate Chosen's JavaScript file and minified version.
+4. Don't touch the VERSION file
+5. Submit a Pull Request using GitHub.
+
+### Using CoffeeScript & Cake
+
+First, make sure you have the proper CoffeeScript / Cake set-up in place.
+
+1. Install Coffeescript: the [CoffeeScript documentation](http://jashkenas.github.com/coffee-script/) provides easy-to-follow instructions.
+2. Install UglifyJS: <code>npm -g install uglify-js</code>
+3. Verify that your $NODE_PATH is properly configured using <code>echo $NODE_PATH</code>
+
+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/)
+- 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](https://github.com/Polzme/chosen), by Pol Dell'Aiera
\ No newline at end of file
diff --git a/3rdparty/js/chosen/VERSION b/3rdparty/js/chosen/VERSION
new file mode 100644 (file)
index 0000000..f374f66
--- /dev/null
@@ -0,0 +1 @@
+0.9.1
diff --git a/3rdparty/js/chosen/chosen.jquery.js b/3rdparty/js/chosen/chosen.jquery.js
new file mode 100644 (file)
index 0000000..5ea409d
--- /dev/null
@@ -0,0 +1,786 @@
+// Chosen, a Select Box Enhancer for jQuery and Protoype
+// by Patrick Filler for Harvest, http://getharvest.com
+// 
+// Version 0.9
+// 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() {
+  /*
+  Chosen source: generate output using 'cake build'
+  Copyright (c) 2011 by Harvest
+  */  var $, Chosen, get_side_border_padding, root;
+  var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
+  root = this;
+  $ = jQuery;
+  $.fn.extend({
+    chosen: function(data, options) {
+      return $(this).each(function(input_field) {
+        if (!($(this)).hasClass("chzn-done")) {
+          return new Chosen(this, data, options);
+        }
+      });
+    }
+  });
+  Chosen = (function() {
+    function Chosen(elmn) {
+      this.set_default_values();
+      this.form_field = elmn;
+      this.form_field_jq = $(this.form_field);
+      this.is_multiple = this.form_field.multiple;
+      this.is_rtl = this.form_field_jq.hasClass("chzn-rtl");
+      this.default_text_default = this.form_field.multiple ? "Select Some Options" : "Select an Option";
+      this.set_up_html();
+      this.register_observers();
+      this.form_field_jq.addClass("chzn-done");
+    }
+    Chosen.prototype.set_default_values = function() {
+      this.click_test_action = __bind(function(evt) {
+        return this.test_active_click(evt);
+      }, this);
+      this.active_field = false;
+      this.mouse_on_container = false;
+      this.results_showing = false;
+      this.result_highlighted = null;
+      this.result_single_selected = null;
+      return this.choices = 0;
+    };
+    Chosen.prototype.set_up_html = function() {
+      var container_div, dd_top, dd_width, sf_width;
+      this.container_id = this.form_field.id.length ? this.form_field.id.replace(/(:|\.)/g, '_') : this.generate_field_id();
+      this.container_id += "_chzn";
+      this.f_width = this.form_field_jq.width();
+      this.default_text = this.form_field_jq.data('placeholder') ? this.form_field_jq.data('placeholder') : this.default_text_default;
+      container_div = $("<div />", {
+        id: this.container_id,
+        "class": "chzn-container " + (this.is_rtl ? ' chzn-rtl' : void 0),
+        style: 'width: ' + this.f_width + 'px;'
+      });
+      if (this.is_multiple) {
+        container_div.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>');
+      } else {
+        container_div.html('<a href="javascript:void(0)" class="chzn-single"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>');
+      }
+      this.form_field_jq.hide().after(container_div);
+      this.container = $('#' + this.container_id);
+      this.container.addClass("chzn-container-" + (this.is_multiple ? "multi" : "single"));
+      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();
+      return this.set_tab_index();
+    };
+    Chosen.prototype.register_observers = function() {
+      this.container.click(__bind(function(evt) {
+        return this.container_click(evt);
+      }, this));
+      this.container.mouseenter(__bind(function(evt) {
+        return this.mouse_enter(evt);
+      }, this));
+      this.container.mouseleave(__bind(function(evt) {
+        return this.mouse_leave(evt);
+      }, this));
+      this.search_results.click(__bind(function(evt) {
+        return this.search_results_click(evt);
+      }, this));
+      this.search_results.mouseover(__bind(function(evt) {
+        return this.search_results_mouseover(evt);
+      }, this));
+      this.search_results.mouseout(__bind(function(evt) {
+        return this.search_results_mouseout(evt);
+      }, this));
+      this.form_field_jq.bind("liszt:updated", __bind(function(evt) {
+        return this.results_update_field(evt);
+      }, this));
+      this.search_field.blur(__bind(function(evt) {
+        return this.input_blur(evt);
+      }, this));
+      this.search_field.keyup(__bind(function(evt) {
+        return this.keyup_checker(evt);
+      }, this));
+      this.search_field.keydown(__bind(function(evt) {
+        return this.keydown_checker(evt);
+      }, this));
+      if (this.is_multiple) {
+        this.search_choices.click(__bind(function(evt) {
+          return this.choices_click(evt);
+        }, this));
+        return this.search_field.focus(__bind(function(evt) {
+          return this.input_focus(evt);
+        }, this));
+      } else {
+        return this.selected_item.focus(__bind(function(evt) {
+          return this.activate_field(evt);
+        }, this));
+      }
+    };
+    Chosen.prototype.container_click = function(evt) {
+      if (evt && evt.type === "click") {
+        evt.stopPropagation();
+      }
+      if (!this.pending_destroy_click) {
+        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) === this.selected_item || $(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.mouse_enter = function() {
+      return this.mouse_on_container = true;
+    };
+    Chosen.prototype.mouse_leave = function() {
+      return this.mouse_on_container = false;
+    };
+    Chosen.prototype.input_focus = function(evt) {
+      if (!this.active_field) {
+        return setTimeout((__bind(function() {
+          return this.container_click();
+        }, this)), 50);
+      }
+    };
+    Chosen.prototype.input_blur = function(evt) {
+      if (!this.mouse_on_container) {
+        this.active_field = false;
+        return setTimeout((__bind(function() {
+          return this.blur_test();
+        }, this)), 100);
+      }
+    };
+    Chosen.prototype.blur_test = function(evt) {
+      if (!this.active_field && this.container.hasClass("chzn-container-active")) {
+        return this.close_field();
+      }
+    };
+    Chosen.prototype.close_field = function() {
+      $(document).unbind("click", this.click_test_action);
+      if (!this.is_multiple) {
+        this.selected_item.attr("tabindex", this.search_field.attr("tabindex"));
+        this.search_field.attr("tabindex", -1);
+      }
+      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() {
+      if (!this.is_multiple && !this.active_field) {
+        this.search_field.attr("tabindex", this.selected_item.attr("tabindex"));
+        this.selected_item.attr("tabindex", -1);
+      }
+      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, startTime, _i, _len, _ref;
+      startTime = new Date();
+      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.find("span").text(this.default_text);
+      }
+      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.find("span").text(data.text);
+          }
+        }
+      }
+      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 '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>';
+      } else {
+        return "";
+      }
+    };
+    Chosen.prototype.result_add_option = function(option) {
+      var classes;
+      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");
+        }
+        return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '">' + option.html + '</li>';
+      } else {
+        return "";
+      }
+    };
+    Chosen.prototype.results_update_field = function() {
+      this.result_clear_highlight();
+      this.result_single_selected = null;
+      return this.results_build();
+    };
+    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_toggle = function() {
+      if (this.results_showing) {
+        return this.results_hide();
+      } else {
+        return this.results_show();
+      }
+    };
+    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);
+        }
+      }
+      dd_top = this.is_multiple ? this.container.height() : this.container.height() - 1;
+      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.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);
+        if (this.is_multiple) {
+          return this.search_field.attr("tabindex", ti);
+        } else {
+          this.selected_item.attr("tabindex", ti);
+          return this.search_field.attr("tabindex", -1);
+        }
+      }
+    };
+    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_click = 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;
+        return this.result_select();
+      }
+    };
+    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, link;
+      choice_id = this.container_id + "_c_" + item.array_index;
+      this.choices += 1;
+      this.search_container.before('<li class="search-choice" id="' + choice_id + '"><span>' + item.html + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>');
+      link = $('#' + choice_id).find("a").first();
+      return link.click(__bind(function(evt) {
+        return this.choice_destroy_link_click(evt);
+      }, this));
+    };
+    Chosen.prototype.choice_destroy_link_click = function(evt) {
+      evt.preventDefault();
+      this.pending_destroy_click = true;
+      return this.choice_destroy($(evt.target));
+    };
+    Chosen.prototype.choice_destroy = function(link) {
+      this.choices -= 1;
+      this.show_search_field_default();
+      if (this.is_multiple && this.choices > 0 && this.search_field.val().length < 1) {
+        this.results_hide();
+      }
+      this.result_deselect(link.attr("rel"));
+      return link.parents('li').first().remove();
+    };
+    Chosen.prototype.result_select = function() {
+      var high, high_id, item, position;
+      if (this.result_highlight) {
+        high = this.result_highlight;
+        high_id = high.attr("id");
+        this.result_clear_highlight();
+        high.addClass("result-selected");
+        if (this.is_multiple) {
+          this.result_deactivate(high);
+        } else {
+          this.result_single_selected = high;
+        }
+        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);
+        }
+        this.results_hide();
+        this.search_field.val("");
+        this.form_field_jq.trigger("change");
+        return this.search_field_scale();
+      }
+    };
+    Chosen.prototype.result_activate = function(el) {
+      return el.addClass("active-result").show();
+    };
+    Chosen.prototype.result_deactivate = function(el) {
+      return el.removeClass("active-result").hide();
+    };
+    Chosen.prototype.result_deselect = function(pos) {
+      var result, result_data;
+      result_data = this.results_data[pos];
+      result_data.selected = false;
+      this.form_field.options[result_data.options_index].selected = false;
+      result = $("#" + this.container_id + "_o_" + pos);
+      result.removeClass("result-selected").addClass("active-result").show();
+      this.result_clear_highlight();
+      this.winnow_results();
+      this.form_field_jq.trigger("change");
+      return this.search_field_scale();
+    };
+    Chosen.prototype.results_search = function(evt) {
+      if (this.results_showing) {
+        return this.winnow_results();
+      } else {
+        return this.results_show();
+      }
+    };
+    Chosen.prototype.winnow_results = function() {
+      var found, option, part, parts, regex, result_id, results, searchText, startTime, startpos, text, zregex, _i, _j, _len, _len2, _ref;
+      startTime = new Date();
+      this.no_results_clear();
+      results = 0;
+      searchText = this.search_field.val() === this.default_text ? "" : $('<div/>').text($.trim(this.search_field.val())).html();
+      regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+      zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+      _ref = this.results_data;
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        option = _ref[_i];
+        if (!option.disabled && !option.empty) {
+          if (option.group) {
+            $('#' + option.dom_id).hide();
+          } else if (!(this.is_multiple && option.selected)) {
+            found = false;
+            result_id = option.dom_id;
+            if (regex.test(option.html)) {
+              found = true;
+              results += 1;
+            } else if (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0) {
+              parts = option.html.replace(/\[|\]/g, "").split(" ");
+              if (parts.length) {
+                for (_j = 0, _len2 = parts.length; _j < _len2; _j++) {
+                  part = parts[_j];
+                  if (regex.test(part)) {
+                    found = true;
+                    results += 1;
+                  }
+                }
+              }
+            }
+            if (found) {
+              if (searchText.length) {
+                startpos = option.html.search(zregex);
+                text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length);
+                text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
+              } else {
+                text = option.html;
+              }
+              if ($("#" + result_id).html !== text) {
+                $("#" + result_id).html(text);
+              }
+              this.result_activate($("#" + result_id));
+              if (option.group_array_index != null) {
+                $("#" + this.results_data[option.group_array_index].dom_id).show();
+              }
+            } else {
+              if (this.result_highlight && result_id === this.result_highlight.attr('id')) {
+                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.val("");
+      lis = this.search_results.find("li");
+      _results = [];
+      for (_i = 0, _len = lis.length; _i < _len; _i++) {
+        li = lis[_i];
+        li = $(li);
+        _results.push(li.hasClass("group-result") ? li.show() : !this.is_multiple || !li.hasClass("result-selected") ? this.result_activate(li) : void 0);
+      }
+      return _results;
+    };
+    Chosen.prototype.winnow_results_set_highlight = function() {
+      var do_high;
+      if (!this.result_highlight) {
+        do_high = this.search_results.find(".active-result").first();
+        if (do_high) {
+          return this.result_do_highlight(do_high);
+        }
+      }
+    };
+    Chosen.prototype.no_results = function(terms) {
+      var no_results_html;
+      no_results_html = $('<li class="no-results">No results match "<span></span>"</li>');
+      no_results_html.find("span").first().html(terms);
+      return this.search_results.append(no_results_html);
+    };
+    Chosen.prototype.no_results_clear = function() {
+      return this.search_results.find(".no-results").remove();
+    };
+    Chosen.prototype.keydown_arrow = function() {
+      var first_active, next_sib;
+      if (!this.result_highlight) {
+        first_active = this.search_results.find("li.active-result").first();
+        if (first_active) {
+          this.result_do_highlight($(first_active));
+        }
+      } 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() {
+      if (this.pending_backstroke) {
+        this.choice_destroy(this.pending_backstroke.find("a").first());
+        return this.clear_backstroke();
+      } else {
+        this.pending_backstroke = this.search_container.siblings("li.search-choice").last();
+        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.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();
+          }
+          break;
+        case 27:
+          if (this.results_showing) {
+            return this.results_hide();
+          }
+          break;
+        case 9:
+        case 38:
+        case 40:
+        case 16:
+          break;
+        default:
+          return this.results_search();
+      }
+    };
+    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:
+          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 = $('<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_field_id = function() {
+      var new_id;
+      new_id = this.generate_random_id();
+      this.form_field.id = new_id;
+      return new_id;
+    };
+    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;
+    };
+    Chosen.prototype.generate_random_char = function() {
+      var chars, newchar, rand;
+      chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ";
+      rand = Math.floor(Math.random() * chars.length);
+      return newchar = chars.substring(rand, rand + 1);
+    };
+    return 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);
+(function() {
+  var SelectParser;
+  SelectParser = (function() {
+    function SelectParser() {
+      this.options_index = 0;
+      this.parsed = [];
+    }
+    SelectParser.prototype.add_node = function(child) {
+      if (child.nodeName === "OPTGROUP") {
+        return this.add_group(child);
+      } else {
+        return this.add_option(child);
+      }
+    };
+    SelectParser.prototype.add_group = function(group) {
+      var group_position, option, _i, _len, _ref, _results;
+      group_position = this.parsed.length;
+      this.parsed.push({
+        array_index: group_position,
+        group: true,
+        label: group.label,
+        children: 0,
+        disabled: group.disabled
+      });
+      _ref = group.childNodes;
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        option = _ref[_i];
+        _results.push(this.add_option(option, group_position, group.disabled));
+      }
+      return _results;
+    };
+    SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
+      if (option.nodeName === "OPTION") {
+        if (option.text !== "") {
+          if (group_position != null) {
+            this.parsed[group_position].children += 1;
+          }
+          this.parsed.push({
+            array_index: this.parsed.length,
+            options_index: this.options_index,
+            value: option.value,
+            text: option.text,
+            html: option.innerHTML,
+            selected: option.selected,
+            disabled: group_disabled === true ? group_disabled : option.disabled,
+            group_array_index: group_position
+          });
+        } 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);
diff --git a/3rdparty/js/chosen/chosen.jquery.min.js b/3rdparty/js/chosen/chosen.jquery.min.js
new file mode 100644 (file)
index 0000000..1d6a698
--- /dev/null
@@ -0,0 +1,10 @@
+// Chosen, a Select Box Enhancer for jQuery and Protoype
+// by Patrick Filler for Harvest, http://getharvest.com
+// 
+// Version 0.9
+// 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 a,b,c,d,e=function(a,b){return function(){return a.apply(b,arguments)}};d=this,a=jQuery,a.fn.extend({chosen:function(c,d){return a(this).each(function(e){if(!a(this).hasClass("chzn-done"))return new b(this,c,d)})}}),b=function(){function b(b){this.set_default_values(),this.form_field=b,this.form_field_jq=a(this.form_field),this.is_multiple=this.form_field.multiple,this.is_rtl=this.form_field_jq.hasClass("chzn-rtl"),this.default_text_default=this.form_field.multiple?"Select Some Options":"Select an Option",this.set_up_html(),this.register_observers(),this.form_field_jq.addClass("chzn-done")}b.prototype.set_default_values=function(){this.click_test_action=e(function(a){return this.test_active_click(a)},this),this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.result_single_selected=null;return this.choices=0},b.prototype.set_up_html=function(){var b,d,e,f;this.container_id=this.form_field.id.length?this.form_field.id.replace(/(:|\.)/g,"_"):this.generate_field_id(),this.container_id+="_chzn",this.f_width=this.form_field_jq.width(),this.default_text=this.form_field_jq.data("placeholder")?this.form_field_jq.data("placeholder"):this.default_text_default,b=a("<div />",{id:this.container_id,"class":"chzn-container "+(this.is_rtl?" chzn-rtl":void 0),style:"width: "+this.f_width+"px;"}),this.is_multiple?b.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="'+this.default_text+'" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>'):b.html('<a href="javascript:void(0)" class="chzn-single"><span>'+this.default_text+'</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>'),this.form_field_jq.hide().after(b),this.container=a("#"+this.container_id),this.container.addClass("chzn-container-"+(this.is_multiple?"multi":"single")),this.dropdown=this.container.find("div.chzn-drop").first(),d=this.container.height(),e=this.f_width-c(this.dropdown),this.dropdown.css({width:e+"px",top:d+"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(),f=e-c(this.search_container)-c(this.search_field),this.search_field.css({width:f+"px"})),this.results_build();return this.set_tab_index()},b.prototype.register_observers=function(){this.container.click(e(function(a){return this.container_click(a)},this)),this.container.mouseenter(e(function(a){return this.mouse_enter(a)},this)),this.container.mouseleave(e(function(a){return this.mouse_leave(a)},this)),this.search_results.click(e(function(a){return this.search_results_click(a)},this)),this.search_results.mouseover(e(function(a){return this.search_results_mouseover(a)},this)),this.search_results.mouseout(e(function(a){return this.search_results_mouseout(a)},this)),this.form_field_jq.bind("liszt:updated",e(function(a){return this.results_update_field(a)},this)),this.search_field.blur(e(function(a){return this.input_blur(a)},this)),this.search_field.keyup(e(function(a){return this.keyup_checker(a)},this)),this.search_field.keydown(e(function(a){return this.keydown_checker(a)},this));if(this.is_multiple){this.search_choices.click(e(function(a){return this.choices_click(a)},this));return this.search_field.focus(e(function(a){return this.input_focus(a)},this))}return this.selected_item.focus(e(function(a){return this.activate_field(a)},this))},b.prototype.container_click=function(b){b&&b.type==="click"&&b.stopPropagation();if(!this.pending_destroy_click){this.active_field?!this.is_multiple&&b&&(a(b.target)===this.selected_item||a(b.target).parents("a.chzn-single").length)&&(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),a(document).click(this.click_test_action),this.results_show());return this.activate_field()}return this.pending_destroy_click=!1},b.prototype.mouse_enter=function(){return this.mouse_on_container=!0},b.prototype.mouse_leave=function(){return this.mouse_on_container=!1},b.prototype.input_focus=function(a){if(!this.active_field)return setTimeout(e(function(){return this.container_click()},this),50)},b.prototype.input_blur=function(a){if(!this.mouse_on_container){this.active_field=!1;return setTimeout(e(function(){return this.blur_test()},this),100)}},b.prototype.blur_test=function(a){if(!this.active_field&&this.container.hasClass("chzn-container-active"))return this.close_field()},b.prototype.close_field=function(){a(document).unbind("click",this.click_test_action),this.is_multiple||(this.selected_item.attr("tabindex",this.search_field.attr("tabindex")),this.search_field.attr("tabindex",-1)),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();return this.search_field_scale()},b.prototype.activate_field=function(){!this.is_multiple&&!this.active_field&&(this.search_field.attr("tabindex",this.selected_item.attr("tabindex")),this.selected_item.attr("tabindex",-1)),this.container.addClass("chzn-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val());return this.search_field.focus()},b.prototype.test_active_click=function(b){return a(b.target).parents("#"+this.container_id).length?this.active_field=!0:this.close_field()},b.prototype.results_build=function(){var a,b,c,e,f,g;c=new Date,this.parsing=!0,this.results_data=d.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.find("span").text(this.default_text),a="",g=this.results_data;for(e=0,f=g.length;e<f;e++)b=g[e],b.group?a+=this.result_add_group(b):b.empty||(a+=this.result_add_option(b),b.selected&&this.is_multiple?this.choice_build(b):b.selected&&!this.is_multiple&&this.selected_item.find("span").text(b.text));this.show_search_field_default(),this.search_field_scale(),this.search_results.html(a);return this.parsing=!1},b.prototype.result_add_group=function(b){if(!b.disabled){b.dom_id=this.container_id+"_g_"+b.array_index;return'<li id="'+b.dom_id+'" class="group-result">'+a("<div />").text(b.label).html()+"</li>"}return""},b.prototype.result_add_option=function(a){var b;if(!a.disabled){a.dom_id=this.container_id+"_o_"+a.array_index,b=a.selected&&this.is_multiple?[]:["active-result"],a.selected&&b.push("result-selected"),a.group_array_index!=null&&b.push("group-option");return'<li id="'+a.dom_id+'" class="'+b.join(" ")+'">'+a.html+"</li>"}return""},b.prototype.results_update_field=function(){this.result_clear_highlight(),this.result_single_selected=null;return this.results_build()},b.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass("highlighted"),d=parseInt(this.search_results.css("maxHeight"),10),f=this.search_results.scrollTop(),e=d+f,c=this.result_highlight.position().top+this.search_results.scrollTop(),b=c+this.result_highlight.outerHeight();if(b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(c<f)return this.search_results.scrollTop(c)}},b.prototype.result_clear_highlight=function(){this.result_highlight&&this.result_highlight.removeClass("highlighted");return this.result_highlight=null},b.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},b.prototype.results_show=function(){var a;this.is_multiple||(this.selected_item.addClass("chzn-single-with-drop"),this.result_single_selected&&this.result_do_highlight(this.result_single_selected)),a=this.is_multiple?this.container.height():this.container.height()-1,this.dropdown.css({top:a+"px",left:0}),this.results_showing=!0,this.search_field.focus(),this.search_field.val(this.search_field.val());return this.winnow_results()},b.prototype.results_hide=function(){this.is_multiple||this.selected_item.removeClass("chzn-single-with-drop"),this.result_clear_highlight(),this.dropdown.css({left:"-9000px"});return this.results_showing=!1},b.prototype.set_tab_index=function(a){var b;if(this.form_field_jq.attr("tabindex")){b=this.form_field_jq.attr("tabindex"),this.form_field_jq.attr("tabindex",-1);if(this.is_multiple)return this.search_field.attr("tabindex",b);this.selected_item.attr("tabindex",b);return this.search_field.attr("tabindex",-1)}},b.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")}this.search_field.val("");return this.search_field.removeClass("default")},b.prototype.search_results_click=function(b){var c;c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first();if(c.length){this.result_highlight=c;return this.result_select()}},b.prototype.search_results_mouseover=function(b){var c;c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first();if(c)return this.result_do_highlight(c)},b.prototype.search_results_mouseout=function(b){if(a(b.target).hasClass("active-result"))return this.result_clear_highlight()},b.prototype.choices_click=function(b){b.preventDefault();if(this.active_field&&!a(b.target).hasClass("search-choice")&&!this.results_showing)return this.results_show()},b.prototype.choice_build=function(b){var c,d;c=this.container_id+"_c_"+b.array_index,this.choices+=1,this.search_container.before('<li class="search-choice" id="'+c+'"><span>'+b.html+'</span><a href="javascript:void(0)" class="search-choice-close" rel="'+b.array_index+'"></a></li>'),d=a("#"+c).find("a").first();return d.click(e(function(a){return this.choice_destroy_link_click(a)},this))},b.prototype.choice_destroy_link_click=function(b){b.preventDefault(),this.pending_destroy_click=!0;return this.choice_destroy(a(b.target))},b.prototype.choice_destroy=function(a){this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&this.search_field.val().length<1&&this.results_hide(),this.result_deselect(a.attr("rel"));return a.parents("li").first().remove()},b.prototype.result_select=function(){var a,b,c,d;if(this.result_highlight){a=this.result_highlight,b=a.attr("id"),this.result_clear_highlight(),a.addClass("result-selected"),this.is_multiple?this.result_deactivate(a):this.result_single_selected=a,d=b.substr(b.lastIndexOf("_")+1),c=this.results_data[d],c.selected=!0,this.form_field.options[c.options_index].selected=!0,this.is_multiple?this.choice_build(c):this.selected_item.find("span").first().text(c.text),this.results_hide(),this.search_field.val(""),this.form_field_jq.trigger("change");return this.search_field_scale()}},b.prototype.result_activate=function(a){return a.addClass("active-result").show()},b.prototype.result_deactivate=function(a){return a.removeClass("active-result").hide()},b.prototype.result_deselect=function(b){var c,d;d=this.results_data[b],d.selected=!1,this.form_field.options[d.options_index].selected=!1,c=a("#"+this.container_id+"_o_"+b),c.removeClass("result-selected").addClass("active-result").show(),this.result_clear_highlight(),this.winnow_results(),this.form_field_jq.trigger("change");return this.search_field_scale()},b.prototype.results_search=function(a){return this.results_showing?this.winnow_results():this.results_show()},b.prototype.winnow_results=function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;j=new Date,this.no_results_clear(),h=0,i=this.search_field.val()===this.default_text?"":a("<div/>").text(a.trim(this.search_field.val())).html(),f=new RegExp("^"+i.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),m=new RegExp(i.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),r=this.results_data;for(n=0,p=r.length;n<p;n++){c=r[n];if(!c.disabled&&!c.empty)if(c.group)a("#"+c.dom_id).hide();else if(!this.is_multiple||!c.selected){b=!1,g=c.dom_id;if(f.test(c.html))b=!0,h+=1;else if(c.html.indexOf(" ")>=0||c.html.indexOf("[")===0){e=c.html.replace(/\[|\]/g,"").split(" ");if(e.length)for(o=0,q=e.length;o<q;o++)d=e[o],f.test(d)&&(b=!0,h+=1)}b?(i.length?(k=c.html.search(m),l=c.html.substr(0,k+i.length)+"</em>"+c.html.substr(k+i.length),l=l.substr(0,k)+"<em>"+l.substr(k)):l=c.html,a("#"+g).html!==l&&a("#"+g).html(l),this.result_activate(a("#"+g)),c.group_array_index!=null&&a("#"+this.results_data[c.group_array_index].dom_id).show()):(this.result_highlight&&g===this.result_highlight.attr("id")&&this.result_clear_highlight(),this.result_deactivate(a("#"+g)))}}return h<1&&i.length?this.no_results(i):this.winnow_results_set_highlight()},b.prototype.winnow_results_clear=function(){var b,c,d,e,f;this.search_field.val(""),c=this.search_results.find("li"),f=[];for(d=0,e=c.length;d<e;d++)b=c[d],b=a(b),f.push(b.hasClass("group-result")?b.show():!this.is_multiple||!b.hasClass("result-selected")?this.result_activate(b):void 0);return f},b.prototype.winnow_results_set_highlight=function(){var a;if(!this.result_highlight){a=this.search_results.find(".active-result").first();if(a)return this.result_do_highlight(a)}},b.prototype.no_results=function(b){var c;c=a('<li class="no-results">No results match "<span></span>"</li>'),c.find("span").first().html(b);return this.search_results.append(c)},b.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},b.prototype.keydown_arrow=function(){var b,c;this.result_highlight?this.results_showing&&(c=this.result_highlight.nextAll("li.active-result").first(),c&&this.result_do_highlight(c)):(b=this.search_results.find("li.active-result").first(),b&&this.result_do_highlight(a(b)));if(!this.results_showing)return this.results_show()},b.prototype.keyup_arrow=function(){var a;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight){a=this.result_highlight.prevAll("li.active-result");if(a.length)return this.result_do_highlight(a.first());this.choices>0&&this.results_hide();return this.result_clear_highlight()}},b.prototype.keydown_backstroke=function(){if(this.pending_backstroke){this.choice_destroy(this.pending_backstroke.find("a").first());return this.clear_backstroke()}this.pending_backstroke=this.search_container.siblings("li.search-choice").last();return this.pending_backstroke.addClass("search-choice-focus")},b.prototype.clear_backstroke=function(){this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus");return this.pending_backstroke=null},b.prototype.keyup_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale();switch(b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke){this.result_clear_highlight();return this.results_search()}break;case 13:a.preventDefault();if(this.results_showing)return this.result_select();break;case 27:if(this.results_showing)return this.results_hide();break;case 9:case 38:case 40:case 16:break;default:return this.results_search()}},b.prototype.keydown_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale(),b!==8&&this.pending_backstroke&&this.clear_backstroke();switch(b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.mouse_on_container=!1;break;case 13:a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},b.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){d=0,h=0,f="position:absolute; left: -1000px; top: -1000px; display:none;",g=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(i=0,j=g.length;i<j;i++)e=g[i],f+=e+":"+this.search_field.css(e)+";";c=a("<div />",{style:f}),c.text(this.search_field.val()),a("body").append(c),h=c.width()+25,c.remove(),h>this.f_width-10&&(h=this.f_width-10),this.search_field.css({width:h+"px"}),b=this.container.height();return this.dropdown.css({top:b+"px"})}},b.prototype.generate_field_id=function(){var a;a=this.generate_random_id(),this.form_field.id=a;return a},b.prototype.generate_random_id=function(){var b;b="sel"+this.generate_random_char()+this.generate_random_char()+this.generate_random_char();while(a("#"+b).length>0)b+=this.generate_random_char();return b},b.prototype.generate_random_char=function(){var a,b,c;a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ",c=Math.floor(Math.random()*a.length);return b=a.substring(c,c+1)};return b}(),c=function(a){var b;return b=a.outerWidth()-a.width()},d.get_side_border_padding=c}).call(this),function(){var a;a=function(){function a(){this.options_index=0,this.parsed=[]}a.prototype.add_node=function(a){return a.nodeName==="OPTGROUP"?this.add_group(a):this.add_option(a)},a.prototype.add_group=function(a){var b,c,d,e,f,g;b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:a.label,children:0,disabled:a.disabled}),f=a.childNodes,g=[];for(d=0,e=f.length;d<e;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},a.prototype.add_option=function(a,b,c){if(a.nodeName==="OPTION"){a.text!==""?(b!=null&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:a.value,text:a.text,html:a.innerHTML,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0});return this.options_index+=1}};return a}(),a.select_to_array=function(b){var c,d,e,f,g;d=new a,g=b.childNodes;for(e=0,f=g.length;e<f;e++)c=g[e],d.add_node(c);return d.parsed},this.SelectParser=a}.call(this)
\ No newline at end of file
diff --git a/3rdparty/js/chosen/chosen.proto.js b/3rdparty/js/chosen/chosen.proto.js
new file mode 100644 (file)
index 0000000..5e269fe
--- /dev/null
@@ -0,0 +1,774 @@
+// Chosen, a Select Box Enhancer for jQuery and Protoype
+// by Patrick Filler for Harvest, http://getharvest.com
+// 
+// Version 0.9
+// 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() {
+  /*
+  Chosen source: generate output using 'cake build'
+  Copyright (c) 2011 by Harvest
+  */  var Chosen, get_side_border_padding, root;
+  var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
+  root = this;
+  Chosen = (function() {
+    function Chosen(elmn) {
+      this.set_default_values();
+      this.form_field = elmn;
+      this.is_multiple = this.form_field.multiple;
+      this.is_rtl = this.form_field.hasClassName("chzn-rtl");
+      this.default_text_default = this.form_field.multiple ? "Select Some Options" : "Select an Option";
+      this.set_up_html();
+      this.register_observers();
+    }
+    Chosen.prototype.set_default_values = function() {
+      this.click_test_action = __bind(function(evt) {
+        return this.test_active_click(evt);
+      }, this);
+      this.active_field = false;
+      this.mouse_on_container = false;
+      this.results_showing = false;
+      this.result_highlighted = null;
+      this.result_single_selected = null;
+      this.choices = 0;
+      this.single_temp = new Template('<a href="javascript:void(0)" class="chzn-single"><span>#{default}</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>');
+      this.multi_temp = new Template('<ul class="chzn-choices"><li class="search-field"><input type="text" value="#{default}" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>');
+      this.choice_temp = new Template('<li class="search-choice" id="#{id}"><span>#{choice}</span><a href="javascript:void(0)" class="search-choice-close" rel="#{position}"></a></li>');
+      return this.no_results_temp = new Template('<li class="no-results">No results match "<span>#{terms}</span>"</li>');
+    };
+    Chosen.prototype.set_up_html = function() {
+      var base_template, container_props, dd_top, dd_width, sf_width;
+      this.container_id = this.form_field.identify().replace(/(:|\.)/g, '_') + "_chzn";
+      this.f_width = this.form_field.getStyle("width") ? parseInt(this.form_field.getStyle("width"), 10) : this.form_field.getWidth();
+      container_props = {
+        'id': this.container_id,
+        'class': "chzn-container " + (this.is_rtl ? ' chzn-rtl' : void 0),
+        'style': 'width: ' + this.f_width + 'px'
+      };
+      this.default_text = this.form_field.readAttribute('data-placeholder') ? this.form_field.readAttribute('data-placeholder') : this.default_text_default;
+      base_template = this.is_multiple ? new Element('div', container_props).update(this.multi_temp.evaluate({
+        "default": this.default_text
+      })) : new Element('div', container_props).update(this.single_temp.evaluate({
+        "default": this.default_text
+      }));
+      this.form_field.hide().insert({
+        after: base_template
+      });
+      this.container = $(this.container_id);
+      this.container.addClassName("chzn-container-" + (this.is_multiple ? "multi" : "single"));
+      this.dropdown = this.container.down('div.chzn-drop');
+      dd_top = this.container.getHeight();
+      dd_width = this.f_width - get_side_border_padding(this.dropdown);
+      this.dropdown.setStyle({
+        "width": dd_width + "px",
+        "top": dd_top + "px"
+      });
+      this.search_field = this.container.down('input');
+      this.search_results = this.container.down('ul.chzn-results');
+      this.search_field_scale();
+      this.search_no_results = this.container.down('li.no-results');
+      if (this.is_multiple) {
+        this.search_choices = this.container.down('ul.chzn-choices');
+        this.search_container = this.container.down('li.search-field');
+      } else {
+        this.search_container = this.container.down('div.chzn-search');
+        this.selected_item = this.container.down('.chzn-single');
+        sf_width = dd_width - get_side_border_padding(this.search_container) - get_side_border_padding(this.search_field);
+        this.search_field.setStyle({
+          "width": sf_width + "px"
+        });
+      }
+      this.results_build();
+      return this.set_tab_index();
+    };
+    Chosen.prototype.register_observers = function() {
+      this.container.observe("click", __bind(function(evt) {
+        return this.container_click(evt);
+      }, this));
+      this.container.observe("mouseenter", __bind(function(evt) {
+        return this.mouse_enter(evt);
+      }, this));
+      this.container.observe("mouseleave", __bind(function(evt) {
+        return this.mouse_leave(evt);
+      }, this));
+      this.search_results.observe("click", __bind(function(evt) {
+        return this.search_results_click(evt);
+      }, this));
+      this.search_results.observe("mouseover", __bind(function(evt) {
+        return this.search_results_mouseover(evt);
+      }, this));
+      this.search_results.observe("mouseout", __bind(function(evt) {
+        return this.search_results_mouseout(evt);
+      }, this));
+      this.form_field.observe("liszt:updated", __bind(function(evt) {
+        return this.results_update_field(evt);
+      }, this));
+      this.search_field.observe("blur", __bind(function(evt) {
+        return this.input_blur(evt);
+      }, this));
+      this.search_field.observe("keyup", __bind(function(evt) {
+        return this.keyup_checker(evt);
+      }, this));
+      this.search_field.observe("keydown", __bind(function(evt) {
+        return this.keydown_checker(evt);
+      }, this));
+      if (this.is_multiple) {
+        this.search_choices.observe("click", __bind(function(evt) {
+          return this.choices_click(evt);
+        }, this));
+        return this.search_field.observe("focus", __bind(function(evt) {
+          return this.input_focus(evt);
+        }, this));
+      } else {
+        return this.selected_item.observe("focus", __bind(function(evt) {
+          return this.activate_field(evt);
+        }, this));
+      }
+    };
+    Chosen.prototype.container_click = function(evt) {
+      if (evt && evt.type === "click") {
+        evt.stop();
+      }
+      if (!this.pending_destroy_click) {
+        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.mouse_enter = function() {
+      return this.mouse_on_container = true;
+    };
+    Chosen.prototype.mouse_leave = function() {
+      return this.mouse_on_container = false;
+    };
+    Chosen.prototype.input_focus = function(evt) {
+      if (!this.active_field) {
+        return setTimeout(this.container_click.bind(this), 50);
+      }
+    };
+    Chosen.prototype.input_blur = function(evt) {
+      if (!this.mouse_on_container) {
+        this.active_field = false;
+        return setTimeout(this.blur_test.bind(this), 100);
+      }
+    };
+    Chosen.prototype.blur_test = function(evt) {
+      if (!this.active_field && this.container.hasClassName("chzn-container-active")) {
+        return this.close_field();
+      }
+    };
+    Chosen.prototype.close_field = function() {
+      document.stopObserving("click", this.click_test_action);
+      if (!this.is_multiple) {
+        this.selected_item.tabIndex = this.search_field.tabIndex;
+        this.search_field.tabIndex = -1;
+      }
+      this.active_field = false;
+      this.results_hide();
+      this.container.removeClassName("chzn-container-active");
+      this.winnow_results_clear();
+      this.clear_backstroke();
+      this.show_search_field_default();
+      return this.search_field_scale();
+    };
+    Chosen.prototype.activate_field = function() {
+      if (!this.is_multiple && !this.active_field) {
+        this.search_field.tabIndex = this.selected_item.tabIndex;
+        this.selected_item.tabIndex = -1;
+      }
+      this.container.addClassName("chzn-container-active");
+      this.active_field = true;
+      this.search_field.value = this.search_field.value;
+      return this.search_field.focus();
+    };
+    Chosen.prototype.test_active_click = function(evt) {
+      if (evt.target.up('#' + this.container_id)) {
+        return this.active_field = true;
+      } else {
+        return this.close_field();
+      }
+    };
+    Chosen.prototype.results_build = function() {
+      var content, data, startTime, _i, _len, _ref;
+      startTime = new Date();
+      this.parsing = true;
+      this.results_data = root.SelectParser.select_to_array(this.form_field);
+      if (this.is_multiple && this.choices > 0) {
+        this.search_choices.select("li.search-choice").invoke("remove");
+        this.choices = 0;
+      } else if (!this.is_multiple) {
+        this.selected_item.down("span").update(this.default_text);
+      }
+      content = '';
+      _ref = this.results_data;
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        data = _ref[_i];
+        if (data.group) {
+          content += this.result_add_group(data);
+        } else if (!data.empty) {
+          content += this.result_add_option(data);
+          if (data.selected && this.is_multiple) {
+            this.choice_build(data);
+          } else if (data.selected && !this.is_multiple) {
+            this.selected_item.down("span").update(data.html);
+          }
+        }
+      }
+      this.show_search_field_default();
+      this.search_field_scale();
+      this.search_results.update(content);
+      return this.parsing = false;
+    };
+    Chosen.prototype.result_add_group = function(group) {
+      if (!group.disabled) {
+        group.dom_id = this.container_id + "_g_" + group.array_index;
+        return '<li id="' + group.dom_id + '" class="group-result">' + group.label.escapeHTML() + '</li>';
+      } else {
+        return "";
+      }
+    };
+    Chosen.prototype.result_add_option = function(option) {
+      var classes;
+      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");
+        }
+        return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '">' + option.html + '</li>';
+      } else {
+        return "";
+      }
+    };
+    Chosen.prototype.results_update_field = function() {
+      this.result_clear_highlight();
+      this.result_single_selected = null;
+      return this.results_build();
+    };
+    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_toggle = function() {
+      if (this.results_showing) {
+        return this.results_hide();
+      } else {
+        return this.results_show();
+      }
+    };
+    Chosen.prototype.results_show = function() {
+      var dd_top;
+      if (!this.is_multiple) {
+        this.selected_item.addClassName('chzn-single-with-drop');
+        if (this.result_single_selected) {
+          this.result_do_highlight(this.result_single_selected);
+        }
+      }
+      dd_top = this.is_multiple ? this.container.getHeight() : this.container.getHeight() - 1;
+      this.dropdown.setStyle({
+        "top": dd_top + "px",
+        "left": 0
+      });
+      this.results_showing = true;
+      this.search_field.focus();
+      this.search_field.value = this.search_field.value;
+      return this.winnow_results();
+    };
+    Chosen.prototype.results_hide = function() {
+      if (!this.is_multiple) {
+        this.selected_item.removeClassName('chzn-single-with-drop');
+      }
+      this.result_clear_highlight();
+      this.dropdown.setStyle({
+        "left": "-9000px"
+      });
+      return this.results_showing = false;
+    };
+    Chosen.prototype.set_tab_index = function(el) {
+      var ti;
+      if (this.form_field.tabIndex) {
+        ti = this.form_field.tabIndex;
+        this.form_field.tabIndex = -1;
+        if (this.is_multiple) {
+          return this.search_field.tabIndex = ti;
+        } else {
+          this.selected_item.tabIndex = ti;
+          return this.search_field.tabIndex = -1;
+        }
+      }
+    };
+    Chosen.prototype.show_search_field_default = function() {
+      if (this.is_multiple && this.choices < 1 && !this.active_field) {
+        this.search_field.value = this.default_text;
+        return this.search_field.addClassName("default");
+      } else {
+        this.search_field.value = "";
+        return this.search_field.removeClassName("default");
+      }
+    };
+    Chosen.prototype.search_results_click = function(evt) {
+      var target;
+      target = evt.target.hasClassName("active-result") ? evt.target : evt.target.up(".active-result");
+      if (target) {
+        this.result_highlight = target;
+        return this.result_select();
+      }
+    };
+    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;
+      choice_id = this.container_id + "_c_" + item.array_index;
+      this.choices += 1;
+      this.search_container.insert({
+        before: this.choice_temp.evaluate({
+          id: choice_id,
+          choice: item.html,
+          position: item.array_index
+        })
+      });
+      link = $(choice_id).down('a');
+      return link.observe("click", __bind(function(evt) {
+        return this.choice_destroy_link_click(evt);
+      }, this));
+    };
+    Chosen.prototype.choice_destroy_link_click = function(evt) {
+      evt.preventDefault();
+      this.pending_destroy_click = true;
+      return this.choice_destroy(evt.target);
+    };
+    Chosen.prototype.choice_destroy = function(link) {
+      this.choices -= 1;
+      this.show_search_field_default();
+      if (this.is_multiple && this.choices > 0 && this.search_field.value.length < 1) {
+        this.results_hide();
+      }
+      this.result_deselect(link.readAttribute("rel"));
+      return link.up('li').remove();
+    };
+    Chosen.prototype.result_select = function() {
+      var high, item, position;
+      if (this.result_highlight) {
+        high = this.result_highlight;
+        this.result_clear_highlight();
+        high.addClassName("result-selected");
+        if (this.is_multiple) {
+          this.result_deactivate(high);
+        } else {
+          this.result_single_selected = high;
+        }
+        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);
+        }
+        this.results_hide();
+        this.search_field.value = "";
+        if (typeof Event.simulate === 'function') {
+          this.form_field.simulate("change");
+        }
+        return this.search_field_scale();
+      }
+    };
+    Chosen.prototype.result_activate = function(el) {
+      return el.addClassName("active-result").show();
+    };
+    Chosen.prototype.result_deactivate = function(el) {
+      return el.removeClassName("active-result").hide();
+    };
+    Chosen.prototype.result_deselect = function(pos) {
+      var result, result_data;
+      result_data = this.results_data[pos];
+      result_data.selected = false;
+      this.form_field.options[result_data.options_index].selected = false;
+      result = $(this.container_id + "_o_" + pos);
+      result.removeClassName("result-selected").addClassName("active-result").show();
+      this.result_clear_highlight();
+      this.winnow_results();
+      if (typeof Event.simulate === 'function') {
+        this.form_field.simulate("change");
+      }
+      return this.search_field_scale();
+    };
+    Chosen.prototype.results_search = function(evt) {
+      if (this.results_showing) {
+        return this.winnow_results();
+      } else {
+        return this.results_show();
+      }
+    };
+    Chosen.prototype.winnow_results = function() {
+      var found, option, part, parts, regex, result_id, results, searchText, startTime, startpos, text, zregex, _i, _j, _len, _len2, _ref;
+      startTime = new Date();
+      this.no_results_clear();
+      results = 0;
+      searchText = this.search_field.value === this.default_text ? "" : this.search_field.value.strip().escapeHTML();
+      regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+      zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+      _ref = this.results_data;
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        option = _ref[_i];
+        if (!option.disabled && !option.empty) {
+          if (option.group) {
+            $(option.dom_id).hide();
+          } else if (!(this.is_multiple && option.selected)) {
+            found = false;
+            result_id = option.dom_id;
+            if (regex.test(option.html)) {
+              found = true;
+              results += 1;
+            } else if (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0) {
+              parts = option.html.replace(/\[|\]/g, "").split(" ");
+              if (parts.length) {
+                for (_j = 0, _len2 = parts.length; _j < _len2; _j++) {
+                  part = parts[_j];
+                  if (regex.test(part)) {
+                    found = true;
+                    results += 1;
+                  }
+                }
+              }
+            }
+            if (found) {
+              if (searchText.length) {
+                startpos = option.html.search(zregex);
+                text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length);
+                text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
+              } else {
+                text = option.html;
+              }
+              if ($(result_id).innerHTML !== text) {
+                $(result_id).update(text);
+              }
+              this.result_activate($(result_id));
+              if (option.group_array_index != null) {
+                $(this.results_data[option.group_array_index].dom_id).show();
+              }
+            } 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];
+        _results.push(li.hasClassName("group-result") ? li.show() : !this.is_multiple || !li.hasClassName("result-selected") ? this.result_activate(li) : void 0);
+      }
+      return _results;
+    };
+    Chosen.prototype.winnow_results_set_highlight = function() {
+      var do_high;
+      if (!this.result_highlight) {
+        do_high = this.search_results.down(".active-result");
+        if (do_high) {
+          return this.result_do_highlight(do_high);
+        }
+      }
+    };
+    Chosen.prototype.no_results = function(terms) {
+      return this.search_results.insert(this.no_results_temp.evaluate({
+        terms: terms
+      }));
+    };
+    Chosen.prototype.no_results_clear = function() {
+      var nr, _results;
+      nr = null;
+      _results = [];
+      while (nr = this.search_results.down(".no-results")) {
+        _results.push(nr.remove());
+      }
+      return _results;
+    };
+    Chosen.prototype.keydown_arrow = function() {
+      var actives, nexts, sibs;
+      actives = this.search_results.select("li.active-result");
+      if (actives.length) {
+        if (!this.result_highlight) {
+          this.result_do_highlight(actives.first());
+        } else if (this.results_showing) {
+          sibs = this.result_highlight.nextSiblings();
+          nexts = sibs.intersect(actives);
+          if (nexts.length) {
+            this.result_do_highlight(nexts.first());
+          }
+        }
+        if (!this.results_showing) {
+          return this.results_show();
+        }
+      }
+    };
+    Chosen.prototype.keyup_arrow = function() {
+      var actives, prevs, sibs;
+      if (!this.results_showing && !this.is_multiple) {
+        return this.results_show();
+      } else if (this.result_highlight) {
+        sibs = this.result_highlight.previousSiblings();
+        actives = this.search_results.select("li.active-result");
+        prevs = sibs.intersect(actives);
+        if (prevs.length) {
+          return this.result_do_highlight(prevs.first());
+        } else {
+          if (this.choices > 0) {
+            this.results_hide();
+          }
+          return this.result_clear_highlight();
+        }
+      }
+    };
+    Chosen.prototype.keydown_backstroke = function() {
+      if (this.pending_backstroke) {
+        this.choice_destroy(this.pending_backstroke.down("a"));
+        return this.clear_backstroke();
+      } else {
+        this.pending_backstroke = this.search_container.siblings("li.search-choice").last();
+        return this.pending_backstroke.addClassName("search-choice-focus");
+      }
+    };
+    Chosen.prototype.clear_backstroke = function() {
+      if (this.pending_backstroke) {
+        this.pending_backstroke.removeClassName("search-choice-focus");
+      }
+      return this.pending_backstroke = null;
+    };
+    Chosen.prototype.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();
+          }
+          break;
+        case 27:
+          if (this.results_showing) {
+            return this.results_hide();
+          }
+          break;
+        case 9:
+        case 38:
+        case 40:
+        case 16:
+          break;
+        default:
+          return this.results_search();
+      }
+    };
+    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:
+          return this.backstroke_length = this.search_field.value.length;
+        case 9:
+          return this.mouse_on_container = false;
+        case 13:
+          return evt.preventDefault();
+        case 38:
+          evt.preventDefault();
+          return this.keyup_arrow();
+        case 40:
+          return this.keydown_arrow();
+      }
+    };
+    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;
+  })();
+  root.Chosen = Chosen;
+  document.observe('dom:loaded', function(evt) {
+    var select, selects, _i, _len, _results;
+    selects = $$(".chzn-select");
+    _results = [];
+    for (_i = 0, _len = selects.length; _i < _len; _i++) {
+      select = selects[_i];
+      _results.push(new Chosen(select));
+    }
+    return _results;
+  });
+  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);
+(function() {
+  var SelectParser;
+  SelectParser = (function() {
+    function SelectParser() {
+      this.options_index = 0;
+      this.parsed = [];
+    }
+    SelectParser.prototype.add_node = function(child) {
+      if (child.nodeName === "OPTGROUP") {
+        return this.add_group(child);
+      } else {
+        return this.add_option(child);
+      }
+    };
+    SelectParser.prototype.add_group = function(group) {
+      var group_position, option, _i, _len, _ref, _results;
+      group_position = this.parsed.length;
+      this.parsed.push({
+        array_index: group_position,
+        group: true,
+        label: group.label,
+        children: 0,
+        disabled: group.disabled
+      });
+      _ref = group.childNodes;
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        option = _ref[_i];
+        _results.push(this.add_option(option, group_position, group.disabled));
+      }
+      return _results;
+    };
+    SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
+      if (option.nodeName === "OPTION") {
+        if (option.text !== "") {
+          if (group_position != null) {
+            this.parsed[group_position].children += 1;
+          }
+          this.parsed.push({
+            array_index: this.parsed.length,
+            options_index: this.options_index,
+            value: option.value,
+            text: option.text,
+            html: option.innerHTML,
+            selected: option.selected,
+            disabled: group_disabled === true ? group_disabled : option.disabled,
+            group_array_index: group_position
+          });
+        } 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);
diff --git a/3rdparty/js/chosen/chosen.proto.min.js b/3rdparty/js/chosen/chosen.proto.min.js
new file mode 100644 (file)
index 0000000..c197c4d
--- /dev/null
@@ -0,0 +1,10 @@
+// Chosen, a Select Box Enhancer for jQuery and Protoype
+// by Patrick Filler for Harvest, http://getharvest.com
+// 
+// Version 0.9
+// 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 a,b,c,d=function(a,b){return function(){return a.apply(b,arguments)}};c=this,a=function(){function a(a){this.set_default_values(),this.form_field=a,this.is_multiple=this.form_field.multiple,this.is_rtl=this.form_field.hasClassName("chzn-rtl"),this.default_text_default=this.form_field.multiple?"Select Some Options":"Select an Option",this.set_up_html(),this.register_observers()}a.prototype.set_default_values=function(){this.click_test_action=d(function(a){return this.test_active_click(a)},this),this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.result_single_selected=null,this.choices=0,this.single_temp=new Template('<a href="javascript:void(0)" class="chzn-single"><span>#{default}</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>'),this.multi_temp=new Template('<ul class="chzn-choices"><li class="search-field"><input type="text" value="#{default}" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>'),this.choice_temp=new Template('<li class="search-choice" id="#{id}"><span>#{choice}</span><a href="javascript:void(0)" class="search-choice-close" rel="#{position}"></a></li>');return this.no_results_temp=new Template('<li class="no-results">No results match "<span>#{terms}</span>"</li>')},a.prototype.set_up_html=function(){var a,c,d,e,f;this.container_id=this.form_field.identify().replace(/(:|\.)/g,"_")+"_chzn",this.f_width=this.form_field.getStyle("width")?parseInt(this.form_field.getStyle("width"),10):this.form_field.getWidth(),c={id:this.container_id,"class":"chzn-container "+(this.is_rtl?" chzn-rtl":void 0),style:"width: "+this.f_width+"px"},this.default_text=this.form_field.readAttribute("data-placeholder")?this.form_field.readAttribute("data-placeholder"):this.default_text_default,a=this.is_multiple?(new Element("div",c)).update(this.multi_temp.evaluate({"default":this.default_text})):(new Element("div",c)).update(this.single_temp.evaluate({"default":this.default_text})),this.form_field.hide().insert({after:a}),this.container=$(this.container_id),this.container.addClassName("chzn-container-"+(this.is_multiple?"multi":"single")),this.dropdown=this.container.down("div.chzn-drop"),d=this.container.getHeight(),e=this.f_width-b(this.dropdown),this.dropdown.setStyle({width:e+"px",top:d+"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"),f=e-b(this.search_container)-b(this.search_field),this.search_field.setStyle({width:f+"px"})),this.results_build();return this.set_tab_index()},a.prototype.register_observers=function(){this.container.observe("click",d(function(a){return this.container_click(a)},this)),this.container.observe("mouseenter",d(function(a){return this.mouse_enter(a)},this)),this.container.observe("mouseleave",d(function(a){return this.mouse_leave(a)},this)),this.search_results.observe("click",d(function(a){return this.search_results_click(a)},this)),this.search_results.observe("mouseover",d(function(a){return this.search_results_mouseover(a)},this)),this.search_results.observe("mouseout",d(function(a){return this.search_results_mouseout(a)},this)),this.form_field.observe("liszt:updated",d(function(a){return this.results_update_field(a)},this)),this.search_field.observe("blur",d(function(a){return this.input_blur(a)},this)),this.search_field.observe("keyup",d(function(a){return this.keyup_checker(a)},this)),this.search_field.observe("keydown",d(function(a){return this.keydown_checker(a)},this));if(this.is_multiple){this.search_choices.observe("click",d(function(a){return this.choices_click(a)},this));return this.search_field.observe("focus",d(function(a){return this.input_focus(a)},this))}return this.selected_item.observe("focus",d(function(a){return this.activate_field(a)},this))},a.prototype.container_click=function(a){a&&a.type==="click"&&a.stop();if(!this.pending_destroy_click){this.active_field?!this.is_multiple&&a&&(a.target===this.selected_item||a.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());return this.activate_field()}return this.pending_destroy_click=!1},a.prototype.mouse_enter=function(){return this.mouse_on_container=!0},a.prototype.mouse_leave=function(){return this.mouse_on_container=!1},a.prototype.input_focus=function(a){if(!this.active_field)return setTimeout(this.container_click.bind(this),50)},a.prototype.input_blur=function(a){if(!this.mouse_on_container){this.active_field=!1;return setTimeout(this.blur_test.bind(this),100)}},a.prototype.blur_test=function(a){if(!this.active_field&&this.container.hasClassName("chzn-container-active"))return this.close_field()},a.prototype.close_field=function(){document.stopObserving("click",this.click_test_action),this.is_multiple||(this.selected_item.tabIndex=this.search_field.tabIndex,this.search_field.tabIndex=-1),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();return this.search_field_scale()},a.prototype.activate_field=function(){!this.is_multiple&&!this.active_field&&(this.search_field.tabIndex=this.selected_item.tabIndex,this.selected_item.tabIndex=-1),this.container.addClassName("chzn-container-active"),this.active_field=!0,this.search_field.value=this.search_field.value;return this.search_field.focus()},a.prototype.test_active_click=function(a){return a.target.up("#"+this.container_id)?this.active_field=!0:this.close_field()},a.prototype.results_build=function(){var a,b,d,e,f,g;d=new Date,this.parsing=!0,this.results_data=c.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.down("span").update(this.default_text),a="",g=this.results_data;for(e=0,f=g.length;e<f;e++)b=g[e],b.group?a+=this.result_add_group(b):b.empty||(a+=this.result_add_option(b),b.selected&&this.is_multiple?this.choice_build(b):b.selected&&!this.is_multiple&&this.selected_item.down("span").update(b.html));this.show_search_field_default(),this.search_field_scale(),this.search_results.update(a);return this.parsing=!1},a.prototype.result_add_group=function(a){if(!a.disabled){a.dom_id=this.container_id+"_g_"+a.array_index;return'<li id="'+a.dom_id+'" class="group-result">'+a.label.escapeHTML()+"</li>"}return""},a.prototype.result_add_option=function(a){var b;if(!a.disabled){a.dom_id=this.container_id+"_o_"+a.array_index,b=a.selected&&this.is_multiple?[]:["active-result"],a.selected&&b.push("result-selected"),a.group_array_index!=null&&b.push("group-option");return'<li id="'+a.dom_id+'" class="'+b.join(" ")+'">'+a.html+"</li>"}return""},a.prototype.results_update_field=function(){this.result_clear_highlight(),this.result_single_selected=null;return this.results_build()},a.prototype.result_do_highlight=function(a){var b,c,d,e,f;this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClassName("highlighted"),d=parseInt(this.search_results.getStyle("maxHeight"),10),f=this.search_results.scrollTop,e=d+f,c=this.result_highlight.positionedOffset().top,b=c+this.result_highlight.getHeight();if(b>=e)return this.search_results.scrollTop=b-d>0?b-d:0;if(c<f)return this.search_results.scrollTop=c},a.prototype.result_clear_highlight=function(){this.result_highlight&&this.result_highlight.removeClassName("highlighted");return this.result_highlight=null},a.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},a.prototype.results_show=function(){var a;this.is_multiple||(this.selected_item.addClassName("chzn-single-with-drop"),this.result_single_selected&&this.result_do_highlight(this.result_single_selected)),a=this.is_multiple?this.container.getHeight():this.container.getHeight()-1,this.dropdown.setStyle({top:a+"px",left:0}),this.results_showing=!0,this.search_field.focus(),this.search_field.value=this.search_field.value;return this.winnow_results()},a.prototype.results_hide=function(){this.is_multiple||this.selected_item.removeClassName("chzn-single-with-drop"),this.result_clear_highlight(),this.dropdown.setStyle({left:"-9000px"});return this.results_showing=!1},a.prototype.set_tab_index=function(a){var b;if(this.form_field.tabIndex){b=this.form_field.tabIndex,this.form_field.tabIndex=-1;if(this.is_multiple)return this.search_field.tabIndex=b;this.selected_item.tabIndex=b;return this.search_field.tabIndex=-1}},a.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")}this.search_field.value="";return this.search_field.removeClassName("default")},a.prototype.search_results_click=function(a){var b;b=a.target.hasClassName("active-result")?a.target:a.target.up(".active-result");if(b){this.result_highlight=b;return this.result_select()}},a.prototype.search_results_mouseover=function(a){var b;b=a.target.hasClassName("active-result")?a.target:a.target.up(".active-result");if(b)return this.result_do_highlight(b)},a.prototype.search_results_mouseout=function(a){if(a.target.hasClassName("active-result")||a.target.up(".active-result"))return this.result_clear_highlight()},a.prototype.choices_click=function(a){a.preventDefault();if(this.active_field&&!a.target.hasClassName("search-choice")&&!a.target.up(".search-choice")&&!this.results_showing)return this.results_show()},a.prototype.choice_build=function(a){var b,c;b=this.container_id+"_c_"+a.array_index,this.choices+=1,this.search_container.insert({before:this.choice_temp.evaluate({id:b,choice:a.html,position:a.array_index})}),c=$(b).down("a");return c.observe("click",d(function(a){return this.choice_destroy_link_click(a)},this))},a.prototype.choice_destroy_link_click=function(a){a.preventDefault(),this.pending_destroy_click=!0;return this.choice_destroy(a.target)},a.prototype.choice_destroy=function(a){this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&this.search_field.value.length<1&&this.results_hide(),this.result_deselect(a.readAttribute("rel"));return a.up("li").remove()},a.prototype.result_select=function(){var a,b,c;if(this.result_highlight){a=this.result_highlight,this.result_clear_highlight(),a.addClassName("result-selected"),this.is_multiple?this.result_deactivate(a):this.result_single_selected=a,c=a.id.substr(a.id.lastIndexOf("_")+1),b=this.results_data[c],b.selected=!0,this.form_field.options[b.options_index].selected=!0,this.is_multiple?this.choice_build(b):this.selected_item.down("span").update(b.html),this.results_hide(),this.search_field.value="",typeof Event.simulate=="function"&&this.form_field.simulate("change");return this.search_field_scale()}},a.prototype.result_activate=function(a){return a.addClassName("active-result").show()},a.prototype.result_deactivate=function(a){return a.removeClassName("active-result").hide()},a.prototype.result_deselect=function(a){var b,c;c=this.results_data[a],c.selected=!1,this.form_field.options[c.options_index].selected=!1,b=$(this.container_id+"_o_"+a),b.removeClassName("result-selected").addClassName("active-result").show(),this.result_clear_highlight(),this.winnow_results(),typeof Event.simulate=="function"&&this.form_field.simulate("change");return this.search_field_scale()},a.prototype.results_search=function(a){return this.results_showing?this.winnow_results():this.results_show()},a.prototype.winnow_results=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;i=new Date,this.no_results_clear(),g=0,h=this.search_field.value===this.default_text?"":this.search_field.value.strip().escapeHTML(),e=new RegExp("^"+h.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),l=new RegExp(h.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),q=this.results_data;for(m=0,o=q.length;m<o;m++){b=q[m];if(!b.disabled&&!b.empty)if(b.group)$(b.dom_id).hide();else if(!this.is_multiple||!b.selected){a=!1,f=b.dom_id;if(e.test(b.html))a=!0,g+=1;else if(b.html.indexOf(" ")>=0||b.html.indexOf("[")===0){d=b.html.replace(/\[|\]/g,"").split(" ");if(d.length)for(n=0,p=d.length;n<p;n++)c=d[n],e.test(c)&&(a=!0,g+=1)}a?(h.length?(j=b.html.search(l),k=b.html.substr(0,j+h.length)+"</em>"+b.html.substr(j+h.length),k=k.substr(0,j)+"<em>"+k.substr(j)):k=b.html,$(f).innerHTML!==k&&$(f).update(k),this.result_activate($(f)),b.group_array_index!=null&&$(this.results_data[b.group_array_index].dom_id).show()):($(f)===this.result_highlight&&this.result_clear_highlight(),this.result_deactivate($(f)))}}return g<1&&h.length?this.no_results(h):this.winnow_results_set_highlight()},a.prototype.winnow_results_clear=function(){var a,b,c,d,e;this.search_field.clear(),b=this.search_results.select("li"),e=[];for(c=0,d=b.length;c<d;c++)a=b[c],e.push(a.hasClassName("group-result")?a.show():!this.is_multiple||!a.hasClassName("result-selected")?this.result_activate(a):void 0);return e},a.prototype.winnow_results_set_highlight=function(){var a;if(!this.result_highlight){a=this.search_results.down(".active-result");if(a)return this.result_do_highlight(a)}},a.prototype.no_results=function(a){return this.search_results.insert(this.no_results_temp.evaluate({terms:a}))},a.prototype.no_results_clear=function(){var a,b;a=null,b=[];while(a=this.search_results.down(".no-results"))b.push(a.remove());return b},a.prototype.keydown_arrow=function(){var a,b,c;a=this.search_results.select("li.active-result");if(a.length){this.result_highlight?this.results_showing&&(c=this.result_highlight.nextSiblings(),b=c.intersect(a),b.length&&this.result_do_highlight(b.first())):this.result_do_highlight(a.first());if(!this.results_showing)return this.results_show()}},a.prototype.keyup_arrow=function(){var a,b,c;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight){c=this.result_highlight.previousSiblings(),a=this.search_results.select("li.active-result"),b=c.intersect(a);if(b.length)return this.result_do_highlight(b.first());this.choices>0&&this.results_hide();return this.result_clear_highlight()}},a.prototype.keydown_backstroke=function(){if(this.pending_backstroke){this.choice_destroy(this.pending_backstroke.down("a"));return this.clear_backstroke()}this.pending_backstroke=this.search_container.siblings("li.search-choice").last();return this.pending_backstroke.addClassName("search-choice-focus")},a.prototype.clear_backstroke=function(){this.pending_backstroke&&this.pending_backstroke.removeClassName("search-choice-focus");return this.pending_backstroke=null},a.prototype.keyup_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale();switch(b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke){this.result_clear_highlight();return this.results_search()}break;case 13:a.preventDefault();if(this.results_showing)return this.result_select();break;case 27:if(this.results_showing)return this.results_hide();break;case 9:case 38:case 40:case 16:break;default:return this.results_search()}},a.prototype.keydown_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale(),b!==8&&this.pending_backstroke&&this.clear_backstroke();switch(b){case 8:return this.backstroke_length=this.search_field.value.length;case 9:return this.mouse_on_container=!1;case 13:return a.preventDefault();case 38:a.preventDefault();return this.keyup_arrow();case 40:return this.keydown_arrow()}},a.prototype.search_field_scale=function(){var a,b,c,d,e,f,g,h,i;if(this.is_multiple){c=0,g=0,e="position:absolute; left: -1000px; top: -1000px; display:none;",f=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(h=0,i=f.length;h<i;h++)d=f[h],e+=d+":"+this.search_field.getStyle(d)+";";b=(new Element("div",{style:e})).update(this.search_field.value.escapeHTML()),document.body.appendChild(b),g=Element.measure(b,"width")+25,b.remove(),g>this.f_width-10&&(g=this.f_width-10),this.search_field.setStyle({width:g+"px"}),a=this.container.getHeight();return this.dropdown.setStyle({top:a+"px"})}};return a}(),c.Chosen=a,document.observe("dom:loaded",function(b){var c,d,e,f,g;d=$$(".chzn-select"),g=[];for(e=0,f=d.length;e<f;e++)c=d[e],g.push(new a(c));return g}),b=function(a){var b,c;b=new Element.Layout(a);return c=b.get("border-left")+b.get("border-right")+b.get("padding-left")+b.get("padding-right")},c.get_side_border_padding=b}).call(this),function(){var a;a=function(){function a(){this.options_index=0,this.parsed=[]}a.prototype.add_node=function(a){return a.nodeName==="OPTGROUP"?this.add_group(a):this.add_option(a)},a.prototype.add_group=function(a){var b,c,d,e,f,g;b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:a.label,children:0,disabled:a.disabled}),f=a.childNodes,g=[];for(d=0,e=f.length;d<e;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},a.prototype.add_option=function(a,b,c){if(a.nodeName==="OPTION"){a.text!==""?(b!=null&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:a.value,text:a.text,html:a.innerHTML,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0});return this.options_index+=1}};return a}(),a.select_to_array=function(b){var c,d,e,f,g;d=new a,g=b.childNodes;for(e=0,f=g.length;e<f;e++)c=g[e],d.add_node(c);return d.parsed},this.SelectParser=a}.call(this)
\ No newline at end of file
diff --git a/admin/css/users.css b/admin/css/users.css
new file mode 100644 (file)
index 0000000..521217d
--- /dev/null
@@ -0,0 +1,5 @@
+form {display:inline}
+td.remove>img,td.select>input{display:none;cursor:pointer}
+td.select,td.remove{width:1em}
+tr:hover>td.remove>img{display:inline}
+li.selected{background-color:#ddd}
index 5a99362726c578a6b87443cc977046052094b5ee..7e643fb60a280708fe227dbc5f4267dcd15af72a 100644 (file)
 $(document).ready(function(){
-       // Vars we need
-       var uid = "";
-       var gid = "";
-       var togglepassword = "";
-       var togglegroup = "";
-
-       //#########################################################################
-       // Stuff I don't understand
-       //#########################################################################
-
-       function doToggleGroup( group ){
-               $("#changegroupgid").val(group);
-
-               // Serialize the data
-               var post = $( "#changegroupsform" ).serialize();
-               // Ajax foo
-               $.post( 'ajax/togglegroups.php', post, function(data){
-                       if( data.status == "success" ){
-                               var groups = [];
-                               $("input[x-use='togglegroup']").each( function(index){
-                                       if( $(this).attr("checked")){
-                                               groups.push($(this).val());
-                                       }
-                               });
-                               if( groups.length == 0 ){
-                                       $("#changegroups").prev().html( '&nbsp;' );
-                               }
-                               else{
-                                       $("#changegroups").prev().html( groups.join(", "));
-                               }
-                       }
-                       else{
-                               printError( data.data.message );
+       $('select[multiple]').chosen();
+       
+       $('td.remove>img').live('click',function(event){
+               var uid=$(this).parent().parent().data('uid');
+               $.post(
+                       OC.filePath('admin','ajax','removeuser.php'),
+                       {username:uid},
+                       function(result){
+                       
                        }
-               });
-               return false;
-       }
-
-       function printError( message ){
-               $("#errormessage").text( message );
-               $("#errordialog").dialog( "open" );
-               return false;
-       }
-
-       //#########################################################################
-       // Functions for editing the dom after user manipulation
-       //#########################################################################
-
-       // Manipulating the page after crteating a user
-       function userCreated( username, groups ){
-               // We need at least a space for showing the div
-               if( groups == "" ){
-                       groups = '&nbsp;';
-               }
-
-               // Add user to table
-               var newrow = '<tr x-uid="'+username+'"><td x-use="username"><div x-use="usernamediv">'+username+'</div></td>';
-               newrow = newrow+'<td x-use="usergroups"><div x-use="usergroupsdiv">'+groups+'</td>';
-               newrow = newrow+'<td><input type="submit" class="removeuserbutton" value="Remove" /></td></tr>';
-               $("#usertable").append( newrow  );
-
-               // Clear forms
-               $("input[x-use='createuserfield']").val( "" );
-               $("input[x-use='createusercheckbox']").attr( "checked", false );
-       }
-
-       function userRemoved( username ){
-               $( "tr[x-uid='"+username+"']" ).remove();
-       }
-
-       function groupCreated( groupname ){
-               var newrow = '<tr x-gid="'+groupname+'"><td>' + groupname + '</td>';
-               newrow = newrow + '<td><input type="submit" class="removeuserbutton" value="Remove" /></td></tr>';
-               $("#grouptable").append( newrow  );
-
-               // Delete form content
-               $("input[x-use='creategroupfield']").val( "" );
-
-               // Add group option to Create User and Edit User
-               var createuser = '<input x-use="createusercheckbox" x-gid="'+groupname+'" type="checkbox" name="groups[]" value="'+groupname+'" /> <span x-gid="'+groupname+'">'+groupname+'<br /></span>';
-               $("#createusergroups").append( createuser );
-               var changeuser = '<input x-use="togglegroup" x-gid="'+groupname+'" type="checkbox" name="groups[]" value="'+groupname+'" /> <span x-use="togglegroup" x-gid="'+groupname+'">'+groupname+'<br /></span>';
-               $("#changegroupsform").append( changeuser );
-       }
-
-       function groupRemoved( groupname ){
-               // Delete the options
-               $( "tr[x-gid='"+groupname+"']" ).remove();
-               $( "span[x-gid='"+groupname+"']" ).remove();
-               $( "input[x-gid='"+groupname+"']" ).remove();
-
-               // remove it from user list
-               $( "div[x-use='usergroupsdiv']" ).each(function(index){
-                       var content = $(this).text();
-                       var list = content.split( ", " );
-                       var newlist = [];
-                       for( var i = 0; i < list.length; i++ ){
-                               var temp = list[i];
-                               if( temp != groupname ){
-                                       newlist.push( temp );
-                               }
+               );
+               $(this).parent().parent().remove();
+       });
+       
+       $('#newuser').submit(function(event){
+               event.preventDefault();
+               var username=$('#newusername').val();
+               var password=$('#newuserpassword').val();
+               var groups=$('#newusergroups').val();
+               $.post(
+                       OC.filePath('admin','ajax','createuser.php'),
+                       {
+                               username:username,
+                               password:password,
+                               groups:groups,
+                       },
+                       function(result){
+                               
                        }
-                       var newstring = newlist.join( ", " );
-                       $(this).html( newstring )
-               });
-
-       }
-
-       //#########################################################################
-       // Editing the users properties by clicking the cell
-       //#########################################################################
-
-       // Password (clicking on user name)
-       $("span[x-use='usernamediv']").live( "click", function(){
-               if( togglepassword == "" || $(this).parent().parent().attr("x-uid") != togglepassword ){
-                       togglepassword = $(this).parent().parent().attr("x-uid");
-                       // Set the username!
-                       $("#changepassworduid").val(togglepassword);
-                       $("#changepasswordpwd").val("");
-                       $(this).parent().append( $('#changepassword') );
-                       $('#changepassword').show();
-               }
-               else{
-                       $('#changepassword').hide();
-                       togglepassword = "";
+               );
+               var tr=$('#rightcontent tr').first().clone();
+               tr.attr('data-uid',username);
+               tr.find('td.name').text(username);
+               tr.find('td.groups').text(groups.join(', '));
+               $('#rightcontent tr').first().after(tr);
+               if(groups.indexOf($('#leftcontent li.selected').text().trim())!=-1){
+                       tr.find('td.select input').attr('checked','checked');
                }
        });
-
-       $("#changepasswordbutton").click( function(){
-               // Serialize the data
-               var post = $( "#changepasswordform" ).serialize();
-               // Ajax foo
-               $.post( 'ajax/changepassword.php', post, function(data){
-                       if( data.status == "success" ){
-                               togglepassword = "";
-                               $('#changepassword').hide();
-                       }
-                       else{
-                               printError( data.data.message );
+       
+       $('#newgroup').submit(function(event){
+               event.preventDefault();
+               var name=$('#newgroupname').val();
+               $.post(
+                       OC.filePath('admin','ajax','creategroup.php'),
+                       {groupname:name},
+                       function(result){
+                       
                        }
-               });
-               return false;
+               );
+               $('#newusergroups').append('<option value="'+name+'">'+name+'</option>');
+               $('select[multiple]').trigger("liszt:updated");
+               var li=$('#leftcontent li').first().next().clone();
+               li.text(name);
+               $('#leftcontent li').first().after(li);
        });
-
-       // Groups
-       $("div[x-use='usergroupsdiv']").live( "click", function(){
-               if( togglegroup == "" || $(this).parent().parent().attr("x-uid") != togglegroup){
-                       togglegroup = $(this).parent().parent().attr("x-uid");
-                       var groups = $(this).text();
-                       groups = groups.split(", ");
-                       $("input[x-use='togglegroup']").each( function(index){
-                               var check = false;
-                               // Group checked?
-                               for( var i = 0; i < groups.length; i++ ){
-                                       if( $(this).val() == groups[i] ){
-                                               check = true;
-                                       }
-                               }
-
-                               // Check/uncheck
-                               if( check ){
-                                       $(this).attr("checked","checked");
-                               }
-                               else{
-                                       $(this).removeAttr("checked");
-                               }
-                       });
-                       $("#changegroupuid").val(togglegroup);
-                       $(this).empty();
-                       $(this).parent().append( $('#changegroups') );
-                       $('#changegroups').show();
-               }
-               else{
-                       var groups = [];
-                       $("input[x-use='togglegroup']").each( function(index){
-                               if( $(this).attr("checked")){
-                                       groups.push($(this).val());
-                               }
-                       });
-                       if( groups.length == 0 ){
-                               $("#changegroups").prev().html( '&nbsp;' );
-                       }
-                       else{
-                               $("#changegroups").prev().html( groups.join(", "));
-                       }
-                       $('#changegroups').hide();
-                       togglegroup = "";
-               }
+       
+       $('#leftcontent li').live('click',function(event){
+               $('#leftcontent li').removeClass('selected');
+               $(this).addClass('selected');
+               $('#rightcontent tr td.select input').show();
+               $('#rightcontent tr td.select input').removeAttr('checked');
+               var group=$(this).text().trim();
+               var rows=$('#rightcontent tr').filter(function(i,tr){
+                       return ($(tr).children('td.groups').text().split(', ').indexOf(group)>-1);
+               });
+               rows.find('td.select input').attr('checked','checked');
        });
-
-       $("span[x-use='togglegroup']").live( "click", function(){
-               if( $(this).prev().attr("checked")){
-                       $(this).prev().removeAttr("checked")
-               }
-               else{
-                       $(this).prev().attr("checked","checked")
+       $('#rightcontent tr td.select input').live('change',function(event){
+               var group=$('#leftcontent li.selected').text().trim();
+               var user=$(this).parent().parent().children('td.name').text().trim();
+               if(group=='admin' && user==OC.currentUser){
+                       event.preventDefault();
+                       $(this).attr('checked','checked');
+                       return false;
                }
-               doToggleGroup( $(this).attr("x-gid"));
-       });
-
-       $("input[x-use='togglegroup']").live( "click", function(){
-               doToggleGroup( $(this).attr("x-gid"));
-       });
-       //#########################################################################
-       // Clicking on buttons
-       //#########################################################################
-
-
-       // Create a new user
-       $( "#createuserbutton" )
-               .click(function(){
-                       if(!$( "#createuserbutton" ).data('active')){
-                               $( "#createuserbutton" ).data('active',true);
-                               
-                               // Create the post data
-                               var post = $( "#createuserdata" ).serialize();
-                               
-                               // Ajax call
-                               $.post( 'ajax/createuser.php', post, function(data){
-                                       $( "#createuserbutton" ).data('active',false);
+               if(group){
+                       $.post(
+                               OC.filePath('admin','ajax','togglegroups.php'),
+                               {
+                                       username:user,
+                                       group:group
+                               },
+                               function(result){
                                        
-                                       // If it says "success" then we are happy
-                                       if( data.status == "success" ){
-                                               userCreated( data.data.username, data.data.groups );
-                                       }
-                                       else{
-                                               printError( data.data.message );
-                                       }
-                               });
-                       }
-                       return false;
-               });
-
-       $( ".removeuserbutton" ).live( 'click', function() {
-                       uid = $( this ).parent().parent().attr( 'x-uid' );
-                       $("#deleteuserusername").html(uid);
-                       $("#deleteusernamefield").val(uid);
-                       $("#removeuserform").dialog( "open" );
-                       return false;
-               });
-
-       $( "#creategroupbutton" )
-               .click(function(){
-                       // Serialize the data
-                       var post = $( "#creategroupdata" ).serialize();
-                       // Ajax foo
-                       $.post( 'ajax/creategroup.php', post, function(data){
-                               if( data.status == "success" ){
-                                       groupCreated( data.data.groupname );
-                               }
-                               else{
-                                       printError( data.data.message );
                                }
-                       });
-                       return false;
-               });
-
-       $( ".removegroupbutton" ).live( 'click', function(){
-                       gid = $( this ).parent().parent().attr( 'x-gid' );
-                       $("#removegroupgroupname").html(gid);
-                       $("#removegroupnamefield").val(gid);
-                       $("#removegroupform").dialog( "open" );
-                       return false;
-               });
-
-       //#########################################################################
-       // Dialogs
-       //#########################################################################
-
-       // Removing users
-       $( "#errordialog" ).dialog({
-               autoOpen: false,
-               modal: true,
-               buttons: {
-                       OK: function() {
-                               $( this ).dialog( "close" );
-                       }
-               }
-       });
-
-       // Removing users
-       $( "#removeuserform" ).dialog({
-               autoOpen: false,
-               height: 300,
-               width: 350,
-               modal: true,
-               buttons: {
-                       "Remove user": function() {
-                               var post = $( "#removeuserdata" ).serialize();
-                               $.post( 'ajax/removeuser.php', post, function(data){
-                                       if( data.status == "success" ){
-                                               userRemoved( uid );
-                                       }
-                                       else{
-                                               printError( data.data.message );
-                                       }
-                               });
-                               $( this ).dialog( "close" );
-                       },
-                       Cancel: function() {
-                               $( this ).dialog( "close" );
-                       }
-               },
-               close: function() {
-                       true;
-               }
-       });
-
-
-       // Dialog for adding users
-       $( "#removegroupform" ).dialog({
-               autoOpen: false,
-               height: 300,
-               width: 350,
-               modal: true,
-               buttons: {
-                       "Remove group": function(){
-                               var post = $( "#removegroupdata" ).serialize();
-                               $.post( 'ajax/removegroup.php', post, function(data){
-                                       if( data.status == "success" ){
-                                               groupRemoved( gid );
-                                       }
-                                       else{
-                                               printError( data.data.message );
-                                       }
-                               });
-                               $( this ).dialog( "close" );
-                       },
-                       Cancel: function() {
-                               $( this ).dialog( "close" );
+                       );
+                       var groups=$(this).parent().parent().children('td.groups').text().trim().split(', ');
+                       if(groups[0]=='') groups.pop();
+                       var index=groups.indexOf(group);
+                       if(index==-1){
+                               groups.push(group);
+                       }else{
+                               groups.splice(index,1);
                        }
-               },
-               close: function(){
-                       true;
+                       $(this).parent().parent().children('td.groups').text(groups.join(', '));
                }
        });
-
-} );
-
+});
index fbb0fe79f3908eebd06254bf6aaef5267cf89ff3..8e34c908fcdcefc660903f3b796078e2e8674c63 100644 (file)
-<fieldset>
-       <legend><?php echo $l->t( 'Users' ); ?></legend>
-       <table id="usertable">
-               <thead>
-                       <tr>
-                               <th><?php echo $l->t( 'Name' ); ?></th>
-                               <th><?php echo $l->t( 'Groups' ); ?></th>
-                               <th></th>
-                       </tr>
-               </thead>
-               <tbody>
-                       <tr id="createuserform">
-                               <form id="createuserdata">
-                                       <td>
-                                               <input x-use="createuserfield" type="text" name="username" placeholder="<?php echo $l->t( 'Name' ); ?>" />
-                                               <input x-use="createuserfield" type="password" name="password" placeholder="<?php echo $l->t( 'Password' ); ?>" />
-                                       </td>
-                                       <td id="createusergroups">
-                                               <?php foreach($_["groups"] as $i): ?>
-                                                       <input id='newuser_group_<?php echo $i["name"]; ?>' x-use="createusercheckbox" x-gid="<?php echo $i["name"]; ?>" type="checkbox" name="groups[]" value="<?php echo $i["name"]; ?>" />
-                                                       <span x-gid="<?php echo $i["name"]; ?>"><label for='newuser_group_<?php echo $i["name"]; ?>'><?php echo $i["name"]; ?></label></span>
-                                               <?php endforeach; ?>
-                                       </td>
-                                       <td>
-                                               <input type="submit" id="createuserbutton" value="<?php echo $l->t( 'Add user' ); ?>" />
-                                       </td>
-                               </form>
-                       </tr>
-                       <?php foreach($_["users"] as $user): ?>
-                               <tr x-uid="<?php echo $user["name"] ?>">
-                                       <td x-use="username"><span x-use="usernamediv"><?php echo $user["name"]; ?></span></td>
-                                       <td x-use="usergroups"><div x-use="usergroupsdiv"><?php if( $user["groups"] ){ echo $user["groups"]; }else{echo "&nbsp";} ?></div></td>
-                                       <td>
-                                               <?php if($user['name']!=OC_User::getUser()):?>
-                                                       <input type="submit" class="removeuserbutton" value="<?php echo $l->t( 'Remove' ); ?>" />
-                                               <?php endif;?>
-                                       </td>
-                               </tr>
-                       <?php endforeach; ?>
-               </tbody>
-       </table>
-</fieldset>
-
-<fieldset>
-       <legend><?php echo $l->t( 'Groups' ); ?></legend>
-       <table id="grouptable">
-               <tbody>
-                       <form id="creategroupdata">
-                               <tr>
-                                       <td><input x-use="creategroupfield" type="text" name="groupname" placeholder="New group" /></td>
-                                       <td><input type="submit" id="creategroupbutton" value="<?php echo $l->t( 'Create group' ); ?>" /></td>
-                               </tr>
-                       </form>
-                       <?php foreach($_["groups"] as $group): ?>
-                               <tr x-gid="<?php echo $group["name"]; ?>">
-                                       <td><?php echo $group["name"] ?></td>
-                                       <td>
-                                               <?php if( $group["name"] != "admin" ): ?>
-                                                       <input type="submit" class="removegroupbutton" value="<?php echo $l->t( 'Remove' ); ?>" />
-                                               <?php else: ?>
-                                                       &nbsp;
-                                               <?php endif; ?>
-                                       </td>
-                               </tr>
-                       <?php endforeach; ?>
-               </tbody>
-       </table>
-</fieldset>
-
-
-<span id="changegroups" style="display:none">
-       <form id="changegroupsform">
-               <input id="changegroupuid" type="hidden" name="username" value="" />
-               <input id="changegroupgid" type="hidden" name="group" value="" />
-               <?php foreach($_["groups"] as $i): ?>
-                       <input x-use="togglegroup" x-gid="<?php echo $i["name"]; ?>" type="checkbox" name="groups[]" value="<?php echo $i["name"]; ?>" />
-                       <span x-use="togglegroup" x-gid="<?php echo $i["name"]; ?>"><?php echo $i["name"]; ?></span>
-               <?php endforeach; ?>
-       </form>
-</span>
-
-<span id="changepassword" style="display:none">
-       <form id="changepasswordform">
-               <input id="changepassworduid" type="hidden" name="username" value="" />
-               <?php echo $l->t( 'Force new password:' ); ?>
-               <input id="changepasswordpwd" type="password" name="password" value="" />
-               <input type="submit" id="changepasswordbutton" value="<?php echo $l->t( 'Set' ); ?>" />
+<div id="controls">
+       <form id="newgroup">
+               <input id="newgroupname" placeholder="name"></input>
+               <input type="submit" value="create"></input>
        </form>
-</span>
-
-<div id="removeuserform" title="Remove user">
-       <form id="removeuserdata">
-               <?php echo $l->t( 'Do you really want to delete user' ); ?> <span id="deleteuserusername">$user</span>?
-               <input id="deleteusernamefield" type="hidden" name="username" value="">
-       </form>
-</div>
-
-<div id="removegroupform" title="Remove Group">
-       <form id="removegroupdata">
-               <?php echo $l->t( 'Do you really want to delete group' ); ?> <span id="removegroupgroupname">$group</span>?
-               <input id="removegroupnamefield" type="hidden" name="groupname" value="">
+       <form id="newuser">
+               <input id="newusername" placeholder="username"></input>
+               <input type="password" id="newuserpassword" placeholder="password"></input>
+               <select id="newusergroups" data-placeholder="groups" title="groups" multiple="multiple">
+                       <?php foreach($_["groups"] as $group): ?>
+                               <option value="<?php echo $group['name'];?>"><?php echo $group['name'];?></option>
+                       <?php endforeach;?>
+               </select>
+               <input type="submit" value="Create"></input>
        </form>
 </div>
-
-<div id="errordialog" title="Error">
-       <span id="errormessage"></span>
+<ul id="leftcontent">
+       <?php foreach($_["groups"] as $group): ?>
+               <li data-gid="<?php echo $group["name"]; ?>">
+                       <?php echo $group["name"] ?>
+               </li>
+       <?php endforeach; ?>
+</ul>
+<div id="rightcontent">
+       <table>
+               <?php foreach($_["users"] as $user): ?>
+                       <tr data-uid="<?php echo $user["name"] ?>">
+                               <td class="select"><input type="checkbox"></input></td>
+                               <td class="name"><?php echo $user["name"]; ?></td>
+                               <td class="groups"><?php if( $user["groups"] ){ echo $user["groups"]; }else{echo "&nbsp";} ?></td>
+                               <td class="remove">
+                                       <?php if($user['name']!=OC_User::getUser()):?>
+                                               <img alt="Remove" title="Remove" class='svg' src='<?php echo image_path('core','actions/delete.svg') ?>'/>
+                                       <?php endif;?>
+                               </td>
+                       </tr>
+               <?php endforeach; ?>
+       </table>
 </div>
index 30b9fa46d3c349eb486f06d03f539889fe9485c6..4a83510cb724e0489086970e2d4c5cc405e08586 100644 (file)
@@ -28,8 +28,11 @@ if( !OC_User::isLoggedIn() || !OC_Group::inGroup( OC_User::getUser(), 'admin' ))
 }
 
 // We have some javascript foo!
-OC_Util::addScript( "admin", "users" );
-OC_App::setActiveNavigationEntry( "core_users" );
+OC_Util::addScript( 'admin', 'users' );
+OC_Util::addStyle( 'admin', 'users' );
+OC_Util::addScript( '3rdparty', 'chosen/chosen.jquery.min' );
+OC_Util::addStyle( '3rdparty', 'chosen' );
+OC_App::setActiveNavigationEntry( 'core_users' );
 
 $users = array();
 $groups = array();
index 6ad999878c1d45382131d3327e796b1a14c2d2f5..952c1b86ea988aeeddaf52b773b33caad99834f2 100644 (file)
@@ -27,7 +27,8 @@ t.cache={};
 
 OC={
        webroot:oc_webroot,
-       coreApps:['files','admin','log','search','settings','core'],
+       currentUser:oc_current_user,
+       coreApps:['files','admin','log','search','settings','core','3rdparty'],
        /**
         * get an absolute url to a file in an appen
         * @param app the id of the app the file belongs to