Commit 3ba392b3cb82a655a814e34759e678cdef94fdfa

Authored by gitlabhq
1 parent 5f900772

new ref switch

app/assets/images/chosen-sprite.png 0 → 100644

396 Bytes

app/assets/javascripts/chosen.jquery.js 0 → 100644
... ... @@ -0,0 +1,901 @@
  1 +// Chosen, a Select Box Enhancer for jQuery and Protoype
  2 +// by Patrick Filler for Harvest, http://getharvest.com
  3 +//
  4 +// Version 0.9.5
  5 +// Full source at https://github.com/harvesthq/chosen
  6 +// Copyright (c) 2011 Harvest http://getharvest.com
  7 +
  8 +// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
  9 +// This file is generated by `cake build`, do not edit it by hand.
  10 +(function() {
  11 + var SelectParser;
  12 + SelectParser = (function() {
  13 + function SelectParser() {
  14 + this.options_index = 0;
  15 + this.parsed = [];
  16 + }
  17 + SelectParser.prototype.add_node = function(child) {
  18 + if (child.nodeName === "OPTGROUP") {
  19 + return this.add_group(child);
  20 + } else {
  21 + return this.add_option(child);
  22 + }
  23 + };
  24 + SelectParser.prototype.add_group = function(group) {
  25 + var group_position, option, _i, _len, _ref, _results;
  26 + group_position = this.parsed.length;
  27 + this.parsed.push({
  28 + array_index: group_position,
  29 + group: true,
  30 + label: group.label,
  31 + children: 0,
  32 + disabled: group.disabled
  33 + });
  34 + _ref = group.childNodes;
  35 + _results = [];
  36 + for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  37 + option = _ref[_i];
  38 + _results.push(this.add_option(option, group_position, group.disabled));
  39 + }
  40 + return _results;
  41 + };
  42 + SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
  43 + if (option.nodeName === "OPTION") {
  44 + if (option.text !== "") {
  45 + if (group_position != null) {
  46 + this.parsed[group_position].children += 1;
  47 + }
  48 + this.parsed.push({
  49 + array_index: this.parsed.length,
  50 + options_index: this.options_index,
  51 + value: option.value,
  52 + text: option.text,
  53 + html: option.innerHTML,
  54 + selected: option.selected,
  55 + disabled: group_disabled === true ? group_disabled : option.disabled,
  56 + group_array_index: group_position,
  57 + classes: option.className,
  58 + style: option.style.cssText
  59 + });
  60 + } else {
  61 + this.parsed.push({
  62 + array_index: this.parsed.length,
  63 + options_index: this.options_index,
  64 + empty: true
  65 + });
  66 + }
  67 + return this.options_index += 1;
  68 + }
  69 + };
  70 + return SelectParser;
  71 + })();
  72 + SelectParser.select_to_array = function(select) {
  73 + var child, parser, _i, _len, _ref;
  74 + parser = new SelectParser();
  75 + _ref = select.childNodes;
  76 + for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  77 + child = _ref[_i];
  78 + parser.add_node(child);
  79 + }
  80 + return parser.parsed;
  81 + };
  82 + this.SelectParser = SelectParser;
  83 +}).call(this);
  84 +(function() {
  85 + /*
  86 + Chosen source: generate output using 'cake build'
  87 + Copyright (c) 2011 by Harvest
  88 + */
  89 + var AbstractChosen, root;
  90 + var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
  91 + root = this;
  92 + AbstractChosen = (function() {
  93 + function AbstractChosen(form_field, options) {
  94 + this.form_field = form_field;
  95 + this.options = options != null ? options : {};
  96 + this.set_default_values();
  97 + this.is_multiple = this.form_field.multiple;
  98 + this.default_text_default = this.is_multiple ? "Select Some Options" : "Select an Option";
  99 + this.setup();
  100 + this.set_up_html();
  101 + this.register_observers();
  102 + this.finish_setup();
  103 + }
  104 + AbstractChosen.prototype.set_default_values = function() {
  105 + this.click_test_action = __bind(function(evt) {
  106 + return this.test_active_click(evt);
  107 + }, this);
  108 + this.activate_action = __bind(function(evt) {
  109 + return this.activate_field(evt);
  110 + }, this);
  111 + this.active_field = false;
  112 + this.mouse_on_container = false;
  113 + this.results_showing = false;
  114 + this.result_highlighted = null;
  115 + this.result_single_selected = null;
  116 + this.allow_single_deselect = (this.options.allow_single_deselect != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
  117 + this.disable_search_threshold = this.options.disable_search_threshold || 0;
  118 + this.choices = 0;
  119 + return this.results_none_found = this.options.no_results_text || "No results match";
  120 + };
  121 + AbstractChosen.prototype.mouse_enter = function() {
  122 + return this.mouse_on_container = true;
  123 + };
  124 + AbstractChosen.prototype.mouse_leave = function() {
  125 + return this.mouse_on_container = false;
  126 + };
  127 + AbstractChosen.prototype.input_focus = function(evt) {
  128 + if (!this.active_field) {
  129 + return setTimeout((__bind(function() {
  130 + return this.container_mousedown();
  131 + }, this)), 50);
  132 + }
  133 + };
  134 + AbstractChosen.prototype.input_blur = function(evt) {
  135 + if (!this.mouse_on_container) {
  136 + this.active_field = false;
  137 + return setTimeout((__bind(function() {
  138 + return this.blur_test();
  139 + }, this)), 100);
  140 + }
  141 + };
  142 + AbstractChosen.prototype.result_add_option = function(option) {
  143 + var classes, style;
  144 + if (!option.disabled) {
  145 + option.dom_id = this.container_id + "_o_" + option.array_index;
  146 + classes = option.selected && this.is_multiple ? [] : ["active-result"];
  147 + if (option.selected) {
  148 + classes.push("result-selected");
  149 + }
  150 + if (option.group_array_index != null) {
  151 + classes.push("group-option");
  152 + }
  153 + if (option.classes !== "") {
  154 + classes.push(option.classes);
  155 + }
  156 + style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
  157 + return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
  158 + } else {
  159 + return "";
  160 + }
  161 + };
  162 + AbstractChosen.prototype.results_update_field = function() {
  163 + this.result_clear_highlight();
  164 + this.result_single_selected = null;
  165 + return this.results_build();
  166 + };
  167 + AbstractChosen.prototype.results_toggle = function() {
  168 + if (this.results_showing) {
  169 + return this.results_hide();
  170 + } else {
  171 + return this.results_show();
  172 + }
  173 + };
  174 + AbstractChosen.prototype.results_search = function(evt) {
  175 + if (this.results_showing) {
  176 + return this.winnow_results();
  177 + } else {
  178 + return this.results_show();
  179 + }
  180 + };
  181 + AbstractChosen.prototype.keyup_checker = function(evt) {
  182 + var stroke, _ref;
  183 + stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
  184 + this.search_field_scale();
  185 + switch (stroke) {
  186 + case 8:
  187 + if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
  188 + return this.keydown_backstroke();
  189 + } else if (!this.pending_backstroke) {
  190 + this.result_clear_highlight();
  191 + return this.results_search();
  192 + }
  193 + break;
  194 + case 13:
  195 + evt.preventDefault();
  196 + if (this.results_showing) {
  197 + return this.result_select(evt);
  198 + }
  199 + break;
  200 + case 27:
  201 + if (this.results_showing) {
  202 + return this.results_hide();
  203 + }
  204 + break;
  205 + case 9:
  206 + case 38:
  207 + case 40:
  208 + case 16:
  209 + case 91:
  210 + case 17:
  211 + break;
  212 + default:
  213 + return this.results_search();
  214 + }
  215 + };
  216 + AbstractChosen.prototype.generate_field_id = function() {
  217 + var new_id;
  218 + new_id = this.generate_random_id();
  219 + this.form_field.id = new_id;
  220 + return new_id;
  221 + };
  222 + AbstractChosen.prototype.generate_random_char = function() {
  223 + var chars, newchar, rand;
  224 + chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ";
  225 + rand = Math.floor(Math.random() * chars.length);
  226 + return newchar = chars.substring(rand, rand + 1);
  227 + };
  228 + return AbstractChosen;
  229 + })();
  230 + root.AbstractChosen = AbstractChosen;
  231 +}).call(this);
  232 +(function() {
  233 + /*
  234 + Chosen source: generate output using 'cake build'
  235 + Copyright (c) 2011 by Harvest
  236 + */
  237 + var $, Chosen, get_side_border_padding, root;
  238 + var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
  239 + for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
  240 + function ctor() { this.constructor = child; }
  241 + ctor.prototype = parent.prototype;
  242 + child.prototype = new ctor;
  243 + child.__super__ = parent.prototype;
  244 + return child;
  245 + }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
  246 + root = this;
  247 + $ = jQuery;
  248 + $.fn.extend({
  249 + chosen: function(options) {
  250 + if ($.browser.msie && ($.browser.version === "6.0" || $.browser.version === "7.0")) {
  251 + return this;
  252 + }
  253 + return $(this).each(function(input_field) {
  254 + if (!($(this)).hasClass("chzn-done")) {
  255 + return new Chosen(this, options);
  256 + }
  257 + });
  258 + }
  259 + });
  260 + Chosen = (function() {
  261 + __extends(Chosen, AbstractChosen);
  262 + function Chosen() {
  263 + Chosen.__super__.constructor.apply(this, arguments);
  264 + }
  265 + Chosen.prototype.setup = function() {
  266 + this.form_field_jq = $(this.form_field);
  267 + return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl");
  268 + };
  269 + Chosen.prototype.finish_setup = function() {
  270 + return this.form_field_jq.addClass("chzn-done");
  271 + };
  272 + Chosen.prototype.set_up_html = function() {
  273 + var container_div, dd_top, dd_width, sf_width;
  274 + this.container_id = this.form_field.id.length ? this.form_field.id.replace(/(:|\.)/g, '_') : this.generate_field_id();
  275 + this.container_id += "_chzn";
  276 + this.f_width = this.form_field_jq.outerWidth();
  277 + this.default_text = this.form_field_jq.data('placeholder') ? this.form_field_jq.data('placeholder') : this.default_text_default;
  278 + container_div = $("<div />", {
  279 + id: this.container_id,
  280 + "class": "chzn-container" + (this.is_rtl ? ' chzn-rtl' : ''),
  281 + style: 'width: ' + this.f_width + 'px;'
  282 + });
  283 + if (this.is_multiple) {
  284 + 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>');
  285 + } else {
  286 + 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>');
  287 + }
  288 + this.form_field_jq.hide().after(container_div);
  289 + this.container = $('#' + this.container_id);
  290 + this.container.addClass("chzn-container-" + (this.is_multiple ? "multi" : "single"));
  291 + this.dropdown = this.container.find('div.chzn-drop').first();
  292 + dd_top = this.container.height();
  293 + dd_width = this.f_width - get_side_border_padding(this.dropdown);
  294 + this.dropdown.css({
  295 + "width": dd_width + "px",
  296 + "top": dd_top + "px"
  297 + });
  298 + this.search_field = this.container.find('input').first();
  299 + this.search_results = this.container.find('ul.chzn-results').first();
  300 + this.search_field_scale();
  301 + this.search_no_results = this.container.find('li.no-results').first();
  302 + if (this.is_multiple) {
  303 + this.search_choices = this.container.find('ul.chzn-choices').first();
  304 + this.search_container = this.container.find('li.search-field').first();
  305 + } else {
  306 + this.search_container = this.container.find('div.chzn-search').first();
  307 + this.selected_item = this.container.find('.chzn-single').first();
  308 + sf_width = dd_width - get_side_border_padding(this.search_container) - get_side_border_padding(this.search_field);
  309 + this.search_field.css({
  310 + "width": sf_width + "px"
  311 + });
  312 + }
  313 + this.results_build();
  314 + this.set_tab_index();
  315 + return this.form_field_jq.trigger("liszt:ready", {
  316 + chosen: this
  317 + });
  318 + };
  319 + Chosen.prototype.register_observers = function() {
  320 + this.container.mousedown(__bind(function(evt) {
  321 + return this.container_mousedown(evt);
  322 + }, this));
  323 + this.container.mouseup(__bind(function(evt) {
  324 + return this.container_mouseup(evt);
  325 + }, this));
  326 + this.container.mouseenter(__bind(function(evt) {
  327 + return this.mouse_enter(evt);
  328 + }, this));
  329 + this.container.mouseleave(__bind(function(evt) {
  330 + return this.mouse_leave(evt);
  331 + }, this));
  332 + this.search_results.mouseup(__bind(function(evt) {
  333 + return this.search_results_mouseup(evt);
  334 + }, this));
  335 + this.search_results.mouseover(__bind(function(evt) {
  336 + return this.search_results_mouseover(evt);
  337 + }, this));
  338 + this.search_results.mouseout(__bind(function(evt) {
  339 + return this.search_results_mouseout(evt);
  340 + }, this));
  341 + this.form_field_jq.bind("liszt:updated", __bind(function(evt) {
  342 + return this.results_update_field(evt);
  343 + }, this));
  344 + this.search_field.blur(__bind(function(evt) {
  345 + return this.input_blur(evt);
  346 + }, this));
  347 + this.search_field.keyup(__bind(function(evt) {
  348 + return this.keyup_checker(evt);
  349 + }, this));
  350 + this.search_field.keydown(__bind(function(evt) {
  351 + return this.keydown_checker(evt);
  352 + }, this));
  353 + if (this.is_multiple) {
  354 + this.search_choices.click(__bind(function(evt) {
  355 + return this.choices_click(evt);
  356 + }, this));
  357 + return this.search_field.focus(__bind(function(evt) {
  358 + return this.input_focus(evt);
  359 + }, this));
  360 + }
  361 + };
  362 + Chosen.prototype.search_field_disabled = function() {
  363 + this.is_disabled = this.form_field_jq[0].disabled;
  364 + if (this.is_disabled) {
  365 + this.container.addClass('chzn-disabled');
  366 + this.search_field[0].disabled = true;
  367 + if (!this.is_multiple) {
  368 + this.selected_item.unbind("focus", this.activate_action);
  369 + }
  370 + return this.close_field();
  371 + } else {
  372 + this.container.removeClass('chzn-disabled');
  373 + this.search_field[0].disabled = false;
  374 + if (!this.is_multiple) {
  375 + return this.selected_item.bind("focus", this.activate_action);
  376 + }
  377 + }
  378 + };
  379 + Chosen.prototype.container_mousedown = function(evt) {
  380 + var target_closelink;
  381 + if (!this.is_disabled) {
  382 + target_closelink = evt != null ? ($(evt.target)).hasClass("search-choice-close") : false;
  383 + if (evt && evt.type === "mousedown") {
  384 + evt.stopPropagation();
  385 + }
  386 + if (!this.pending_destroy_click && !target_closelink) {
  387 + if (!this.active_field) {
  388 + if (this.is_multiple) {
  389 + this.search_field.val("");
  390 + }
  391 + $(document).click(this.click_test_action);
  392 + this.results_show();
  393 + } else if (!this.is_multiple && evt && ($(evt.target) === this.selected_item || $(evt.target).parents("a.chzn-single").length)) {
  394 + evt.preventDefault();
  395 + this.results_toggle();
  396 + }
  397 + return this.activate_field();
  398 + } else {
  399 + return this.pending_destroy_click = false;
  400 + }
  401 + }
  402 + };
  403 + Chosen.prototype.container_mouseup = function(evt) {
  404 + if (evt.target.nodeName === "ABBR") {
  405 + return this.results_reset(evt);
  406 + }
  407 + };
  408 + Chosen.prototype.blur_test = function(evt) {
  409 + if (!this.active_field && this.container.hasClass("chzn-container-active")) {
  410 + return this.close_field();
  411 + }
  412 + };
  413 + Chosen.prototype.close_field = function() {
  414 + $(document).unbind("click", this.click_test_action);
  415 + if (!this.is_multiple) {
  416 + this.selected_item.attr("tabindex", this.search_field.attr("tabindex"));
  417 + this.search_field.attr("tabindex", -1);
  418 + }
  419 + this.active_field = false;
  420 + this.results_hide();
  421 + this.container.removeClass("chzn-container-active");
  422 + this.winnow_results_clear();
  423 + this.clear_backstroke();
  424 + this.show_search_field_default();
  425 + return this.search_field_scale();
  426 + };
  427 + Chosen.prototype.activate_field = function() {
  428 + if (!this.is_multiple && !this.active_field) {
  429 + this.search_field.attr("tabindex", this.selected_item.attr("tabindex"));
  430 + this.selected_item.attr("tabindex", -1);
  431 + }
  432 + this.container.addClass("chzn-container-active");
  433 + this.active_field = true;
  434 + this.search_field.val(this.search_field.val());
  435 + return this.search_field.focus();
  436 + };
  437 + Chosen.prototype.test_active_click = function(evt) {
  438 + if ($(evt.target).parents('#' + this.container_id).length) {
  439 + return this.active_field = true;
  440 + } else {
  441 + return this.close_field();
  442 + }
  443 + };
  444 + Chosen.prototype.results_build = function() {
  445 + var content, data, startTime, _i, _len, _ref;
  446 + startTime = new Date();
  447 + this.parsing = true;
  448 + this.results_data = root.SelectParser.select_to_array(this.form_field);
  449 + if (this.is_multiple && this.choices > 0) {
  450 + this.search_choices.find("li.search-choice").remove();
  451 + this.choices = 0;
  452 + } else if (!this.is_multiple) {
  453 + this.selected_item.find("span").text(this.default_text);
  454 + if (this.form_field.options.length <= this.disable_search_threshold) {
  455 + this.container.addClass("chzn-container-single-nosearch");
  456 + } else {
  457 + this.container.removeClass("chzn-container-single-nosearch");
  458 + }
  459 + }
  460 + content = '';
  461 + _ref = this.results_data;
  462 + for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  463 + data = _ref[_i];
  464 + if (data.group) {
  465 + content += this.result_add_group(data);
  466 + } else if (!data.empty) {
  467 + content += this.result_add_option(data);
  468 + if (data.selected && this.is_multiple) {
  469 + this.choice_build(data);
  470 + } else if (data.selected && !this.is_multiple) {
  471 + this.selected_item.find("span").text(data.text);
  472 + if (this.allow_single_deselect) {
  473 + this.single_deselect_control_build();
  474 + }
  475 + }
  476 + }
  477 + }
  478 + this.search_field_disabled();
  479 + this.show_search_field_default();
  480 + this.search_field_scale();
  481 + this.search_results.html(content);
  482 + return this.parsing = false;
  483 + };
  484 + Chosen.prototype.result_add_group = function(group) {
  485 + if (!group.disabled) {
  486 + group.dom_id = this.container_id + "_g_" + group.array_index;
  487 + return '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>';
  488 + } else {
  489 + return "";
  490 + }
  491 + };
  492 + Chosen.prototype.result_do_highlight = function(el) {
  493 + var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
  494 + if (el.length) {
  495 + this.result_clear_highlight();
  496 + this.result_highlight = el;
  497 + this.result_highlight.addClass("highlighted");
  498 + maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
  499 + visible_top = this.search_results.scrollTop();
  500 + visible_bottom = maxHeight + visible_top;
  501 + high_top = this.result_highlight.position().top + this.search_results.scrollTop();
  502 + high_bottom = high_top + this.result_highlight.outerHeight();
  503 + if (high_bottom >= visible_bottom) {
  504 + return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
  505 + } else if (high_top < visible_top) {
  506 + return this.search_results.scrollTop(high_top);
  507 + }
  508 + }
  509 + };
  510 + Chosen.prototype.result_clear_highlight = function() {
  511 + if (this.result_highlight) {
  512 + this.result_highlight.removeClass("highlighted");
  513 + }
  514 + return this.result_highlight = null;
  515 + };
  516 + Chosen.prototype.results_show = function() {
  517 + var dd_top;
  518 + if (!this.is_multiple) {
  519 + this.selected_item.addClass("chzn-single-with-drop");
  520 + if (this.result_single_selected) {
  521 + this.result_do_highlight(this.result_single_selected);
  522 + }
  523 + }
  524 + dd_top = this.is_multiple ? this.container.height() : this.container.height() - 1;
  525 + this.dropdown.css({
  526 + "top": dd_top + "px",
  527 + "left": 0
  528 + });
  529 + this.results_showing = true;
  530 + this.search_field.focus();
  531 + this.search_field.val(this.search_field.val());
  532 + return this.winnow_results();
  533 + };
  534 + Chosen.prototype.results_hide = function() {
  535 + if (!this.is_multiple) {
  536 + this.selected_item.removeClass("chzn-single-with-drop");
  537 + }
  538 + this.result_clear_highlight();
  539 + this.dropdown.css({
  540 + "left": "-9000px"
  541 + });
  542 + return this.results_showing = false;
  543 + };
  544 + Chosen.prototype.set_tab_index = function(el) {
  545 + var ti;
  546 + if (this.form_field_jq.attr("tabindex")) {
  547 + ti = this.form_field_jq.attr("tabindex");
  548 + this.form_field_jq.attr("tabindex", -1);
  549 + if (this.is_multiple) {
  550 + return this.search_field.attr("tabindex", ti);
  551 + } else {
  552 + this.selected_item.attr("tabindex", ti);
  553 + return this.search_field.attr("tabindex", -1);
  554 + }
  555 + }
  556 + };
  557 + Chosen.prototype.show_search_field_default = function() {
  558 + if (this.is_multiple && this.choices < 1 && !this.active_field) {
  559 + this.search_field.val(this.default_text);
  560 + return this.search_field.addClass("default");
  561 + } else {
  562 + this.search_field.val("");
  563 + return this.search_field.removeClass("default");
  564 + }
  565 + };
  566 + Chosen.prototype.search_results_mouseup = function(evt) {
  567 + var target;
  568 + target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
  569 + if (target.length) {
  570 + this.result_highlight = target;
  571 + return this.result_select(evt);
  572 + }
  573 + };
  574 + Chosen.prototype.search_results_mouseover = function(evt) {
  575 + var target;
  576 + target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
  577 + if (target) {
  578 + return this.result_do_highlight(target);
  579 + }
  580 + };
  581 + Chosen.prototype.search_results_mouseout = function(evt) {
  582 + if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
  583 + return this.result_clear_highlight();
  584 + }
  585 + };
  586 + Chosen.prototype.choices_click = function(evt) {
  587 + evt.preventDefault();
  588 + if (this.active_field && !($(evt.target).hasClass("search-choice" || $(evt.target).parents('.search-choice').first)) && !this.results_showing) {
  589 + return this.results_show();
  590 + }
  591 + };
  592 + Chosen.prototype.choice_build = function(item) {
  593 + var choice_id, link;
  594 + choice_id = this.container_id + "_c_" + item.array_index;
  595 + this.choices += 1;
  596 + 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>');
  597 + link = $('#' + choice_id).find("a").first();
  598 + return link.click(__bind(function(evt) {
  599 + return this.choice_destroy_link_click(evt);
  600 + }, this));
  601 + };
  602 + Chosen.prototype.choice_destroy_link_click = function(evt) {
  603 + evt.preventDefault();
  604 + if (!this.is_disabled) {
  605 + this.pending_destroy_click = true;
  606 + return this.choice_destroy($(evt.target));
  607 + } else {
  608 + return evt.stopPropagation;
  609 + }
  610 + };
  611 + Chosen.prototype.choice_destroy = function(link) {
  612 + this.choices -= 1;
  613 + this.show_search_field_default();
  614 + if (this.is_multiple && this.choices > 0 && this.search_field.val().length < 1) {
  615 + this.results_hide();
  616 + }
  617 + this.result_deselect(link.attr("rel"));
  618 + return link.parents('li').first().remove();
  619 + };
  620 + Chosen.prototype.results_reset = function(evt) {
  621 + this.form_field.options[0].selected = true;
  622 + this.selected_item.find("span").text(this.default_text);
  623 + this.show_search_field_default();
  624 + $(evt.target).remove();
  625 + this.form_field_jq.trigger("change");
  626 + if (this.active_field) {
  627 + return this.results_hide();
  628 + }
  629 + };
  630 + Chosen.prototype.result_select = function(evt) {
  631 + var high, high_id, item, position;
  632 + if (this.result_highlight) {
  633 + high = this.result_highlight;
  634 + high_id = high.attr("id");
  635 + this.result_clear_highlight();
  636 + if (this.is_multiple) {
  637 + this.result_deactivate(high);
  638 + } else {
  639 + this.search_results.find(".result-selected").removeClass("result-selected");
  640 + this.result_single_selected = high;
  641 + }
  642 + high.addClass("result-selected");
  643 + position = high_id.substr(high_id.lastIndexOf("_") + 1);
  644 + item = this.results_data[position];
  645 + item.selected = true;
  646 + this.form_field.options[item.options_index].selected = true;
  647 + if (this.is_multiple) {
  648 + this.choice_build(item);
  649 + } else {
  650 + this.selected_item.find("span").first().text(item.text);
  651 + if (this.allow_single_deselect) {
  652 + this.single_deselect_control_build();
  653 + }
  654 + }
  655 + if (!(evt.metaKey && this.is_multiple)) {
  656 + this.results_hide();
  657 + }
  658 + this.search_field.val("");
  659 + this.form_field_jq.trigger("change");
  660 + return this.search_field_scale();
  661 + }
  662 + };
  663 + Chosen.prototype.result_activate = function(el) {
  664 + return el.addClass("active-result");
  665 + };
  666 + Chosen.prototype.result_deactivate = function(el) {
  667 + return el.removeClass("active-result");
  668 + };
  669 + Chosen.prototype.result_deselect = function(pos) {
  670 + var result, result_data;
  671 + result_data = this.results_data[pos];
  672 + result_data.selected = false;
  673 + this.form_field.options[result_data.options_index].selected = false;
  674 + result = $("#" + this.container_id + "_o_" + pos);
  675 + result.removeClass("result-selected").addClass("active-result").show();
  676 + this.result_clear_highlight();
  677 + this.winnow_results();
  678 + this.form_field_jq.trigger("change");
  679 + return this.search_field_scale();
  680 + };
  681 + Chosen.prototype.single_deselect_control_build = function() {
  682 + if (this.allow_single_deselect && this.selected_item.find("abbr").length < 1) {
  683 + return this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
  684 + }
  685 + };
  686 + Chosen.prototype.winnow_results = function() {
  687 + var found, option, part, parts, regex, result_id, results, searchText, startTime, startpos, text, zregex, _i, _j, _len, _len2, _ref;
  688 + startTime = new Date();
  689 + this.no_results_clear();
  690 + results = 0;
  691 + searchText = this.search_field.val() === this.default_text ? "" : $('<div/>').text($.trim(this.search_field.val())).html();
  692 + regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
  693 + zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
  694 + _ref = this.results_data;
  695 + for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  696 + option = _ref[_i];
  697 + if (!option.disabled && !option.empty) {
  698 + if (option.group) {
  699 + $('#' + option.dom_id).hide();
  700 + } else if (!(this.is_multiple && option.selected)) {
  701 + found = false;
  702 + result_id = option.dom_id;
  703 + if (regex.test(option.html)) {
  704 + found = true;
  705 + results += 1;
  706 + } else if (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0) {
  707 + parts = option.html.replace(/\[|\]/g, "").split(" ");
  708 + if (parts.length) {
  709 + for (_j = 0, _len2 = parts.length; _j < _len2; _j++) {
  710 + part = parts[_j];
  711 + if (regex.test(part)) {
  712 + found = true;
  713 + results += 1;
  714 + }
  715 + }
  716 + }
  717 + }
  718 + if (found) {
  719 + if (searchText.length) {
  720 + startpos = option.html.search(zregex);
  721 + text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length);
  722 + text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
  723 + } else {
  724 + text = option.html;
  725 + }
  726 + if ($("#" + result_id).html !== text) {
  727 + $("#" + result_id).html(text);
  728 + }
  729 + this.result_activate($("#" + result_id));
  730 + if (option.group_array_index != null) {
  731 + $("#" + this.results_data[option.group_array_index].dom_id).show();
  732 + }
  733 + } else {
  734 + if (this.result_highlight && result_id === this.result_highlight.attr('id')) {
  735 + this.result_clear_highlight();
  736 + }
  737 + this.result_deactivate($("#" + result_id));
  738 + }
  739 + }
  740 + }
  741 + }
  742 + if (results < 1 && searchText.length) {
  743 + return this.no_results(searchText);
  744 + } else {
  745 + return this.winnow_results_set_highlight();
  746 + }
  747 + };
  748 + Chosen.prototype.winnow_results_clear = function() {
  749 + var li, lis, _i, _len, _results;
  750 + this.search_field.val("");
  751 + lis = this.search_results.find("li");
  752 + _results = [];
  753 + for (_i = 0, _len = lis.length; _i < _len; _i++) {
  754 + li = lis[_i];
  755 + li = $(li);
  756 + _results.push(li.hasClass("group-result") ? li.show() : !this.is_multiple || !li.hasClass("result-selected") ? this.result_activate(li) : void 0);
  757 + }
  758 + return _results;
  759 + };
  760 + Chosen.prototype.winnow_results_set_highlight = function() {
  761 + var do_high, selected_results;
  762 + if (!this.result_highlight) {
  763 + selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
  764 + do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
  765 + if (do_high != null) {
  766 + return this.result_do_highlight(do_high);
  767 + }
  768 + }
  769 + };
  770 + Chosen.prototype.no_results = function(terms) {
  771 + var no_results_html;
  772 + no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
  773 + no_results_html.find("span").first().html(terms);
  774 + return this.search_results.append(no_results_html);
  775 + };
  776 + Chosen.prototype.no_results_clear = function() {
  777 + return this.search_results.find(".no-results").remove();
  778 + };
  779 + Chosen.prototype.keydown_arrow = function() {
  780 + var first_active, next_sib;
  781 + if (!this.result_highlight) {
  782 + first_active = this.search_results.find("li.active-result").first();
  783 + if (first_active) {
  784 + this.result_do_highlight($(first_active));
  785 + }
  786 + } else if (this.results_showing) {
  787 + next_sib = this.result_highlight.nextAll("li.active-result").first();
  788 + if (next_sib) {
  789 + this.result_do_highlight(next_sib);
  790 + }
  791 + }
  792 + if (!this.results_showing) {
  793 + return this.results_show();
  794 + }
  795 + };
  796 + Chosen.prototype.keyup_arrow = function() {
  797 + var prev_sibs;
  798 + if (!this.results_showing && !this.is_multiple) {
  799 + return this.results_show();
  800 + } else if (this.result_highlight) {
  801 + prev_sibs = this.result_highlight.prevAll("li.active-result");
  802 + if (prev_sibs.length) {
  803 + return this.result_do_highlight(prev_sibs.first());
  804 + } else {
  805 + if (this.choices > 0) {
  806 + this.results_hide();
  807 + }
  808 + return this.result_clear_highlight();
  809 + }
  810 + }
  811 + };
  812 + Chosen.prototype.keydown_backstroke = function() {
  813 + if (this.pending_backstroke) {
  814 + this.choice_destroy(this.pending_backstroke.find("a").first());
  815 + return this.clear_backstroke();
  816 + } else {
  817 + this.pending_backstroke = this.search_container.siblings("li.search-choice").last();
  818 + return this.pending_backstroke.addClass("search-choice-focus");
  819 + }
  820 + };
  821 + Chosen.prototype.clear_backstroke = function() {
  822 + if (this.pending_backstroke) {
  823 + this.pending_backstroke.removeClass("search-choice-focus");
  824 + }
  825 + return this.pending_backstroke = null;
  826 + };
  827 + Chosen.prototype.keydown_checker = function(evt) {
  828 + var stroke, _ref;
  829 + stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
  830 + this.search_field_scale();
  831 + if (stroke !== 8 && this.pending_backstroke) {
  832 + this.clear_backstroke();
  833 + }
  834 + switch (stroke) {
  835 + case 8:
  836 + this.backstroke_length = this.search_field.val().length;
  837 + break;
  838 + case 9:
  839 + if (this.results_showing && !this.is_multiple) {
  840 + this.result_select(evt);
  841 + }
  842 + this.mouse_on_container = false;
  843 + break;
  844 + case 13:
  845 + evt.preventDefault();
  846 + break;
  847 + case 38:
  848 + evt.preventDefault();
  849 + this.keyup_arrow();
  850 + break;
  851 + case 40:
  852 + this.keydown_arrow();
  853 + break;
  854 + }
  855 + };
  856 + Chosen.prototype.search_field_scale = function() {
  857 + var dd_top, div, h, style, style_block, styles, w, _i, _len;
  858 + if (this.is_multiple) {
  859 + h = 0;
  860 + w = 0;
  861 + style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
  862 + styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
  863 + for (_i = 0, _len = styles.length; _i < _len; _i++) {
  864 + style = styles[_i];
  865 + style_block += style + ":" + this.search_field.css(style) + ";";
  866 + }
  867 + div = $('<div />', {
  868 + 'style': style_block
  869 + });
  870 + div.text(this.search_field.val());
  871 + $('body').append(div);
  872 + w = div.width() + 25;
  873 + div.remove();
  874 + if (w > this.f_width - 10) {
  875 + w = this.f_width - 10;
  876 + }
  877 + this.search_field.css({
  878 + 'width': w + 'px'
  879 + });
  880 + dd_top = this.container.height();
  881 + return this.dropdown.css({
  882 + "top": dd_top + "px"
  883 + });
  884 + }
  885 + };
  886 + Chosen.prototype.generate_random_id = function() {
  887 + var string;
  888 + string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char();
  889 + while ($("#" + string).length > 0) {
  890 + string += this.generate_random_char();
  891 + }
  892 + return string;
  893 + };
  894 + return Chosen;
  895 + })();
  896 + get_side_border_padding = function(elmt) {
  897 + var side_border_padding;
  898 + return side_border_padding = elmt.outerWidth() - elmt.width();
  899 + };
  900 + root.get_side_border_padding = get_side_border_padding;
  901 +}).call(this);
... ...
app/assets/stylesheets/chosen.css 0 → 100644
... ... @@ -0,0 +1,367 @@
  1 +/* @group Base */
  2 +.chzn-container {
  3 + font-size: 13px;
  4 + position: relative;
  5 + display: inline-block;
  6 + zoom: 1;
  7 + *display: inline;
  8 +}
  9 +.chzn-container .chzn-drop {
  10 + background: #fff;
  11 + border: 1px solid #aaa;
  12 + border-top: 0;
  13 + position: absolute;
  14 + top: 29px;
  15 + left: 0;
  16 + -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
  17 + -moz-box-shadow : 0 4px 5px rgba(0,0,0,.15);
  18 + -o-box-shadow : 0 4px 5px rgba(0,0,0,.15);
  19 + box-shadow : 0 4px 5px rgba(0,0,0,.15);
  20 + z-index: 999;
  21 +}
  22 +/* @end */
  23 +
  24 +/* @group Single Chosen */
  25 +.chzn-container-single .chzn-single {
  26 + background-color: #fff;
  27 + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white));
  28 + background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%);
  29 + background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%);
  30 + background-image: -o-linear-gradient(top, #eeeeee 0%,#ffffff 50%);
  31 + background-image: -ms-linear-gradient(top, #eeeeee 0%,#ffffff 50%);
  32 + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 );
  33 + background-image: linear-gradient(top, #eeeeee 0%,#ffffff 50%);
  34 + -webkit-border-radius: 4px;
  35 + -moz-border-radius : 4px;
  36 + border-radius : 4px;
  37 + -moz-background-clip : padding;
  38 + -webkit-background-clip: padding-box;
  39 + background-clip : padding-box;
  40 + border: 1px solid #aaa;
  41 + display: block;
  42 + overflow: hidden;
  43 + white-space: nowrap;
  44 + position: relative;
  45 + height: 26px;
  46 + line-height: 26px;
  47 + padding: 0 0 0 8px;
  48 + color: #444;
  49 + text-decoration: none;
  50 +}
  51 +.chzn-container-single .chzn-single span {
  52 + margin-right: 26px;
  53 + display: block;
  54 + overflow: hidden;
  55 + white-space: nowrap;
  56 + -o-text-overflow: ellipsis;
  57 + -ms-text-overflow: ellipsis;
  58 + text-overflow: ellipsis;
  59 +}
  60 +.chzn-container-single .chzn-single abbr {
  61 + display: block;
  62 + position: absolute;
  63 + right: 26px;
  64 + top: 8px;
  65 + width: 12px;
  66 + height: 13px;
  67 + font-size: 1px;
  68 + background: url(chosen-sprite.png) right top no-repeat;
  69 +}
  70 +.chzn-container-single .chzn-single abbr:hover {
  71 + background-position: right -11px;
  72 +}
  73 +.chzn-container-single .chzn-single div {
  74 + -webkit-border-radius: 0 4px 4px 0;
  75 + -moz-border-radius : 0 4px 4px 0;
  76 + border-radius : 0 4px 4px 0;
  77 + -moz-background-clip : padding;
  78 + -webkit-background-clip: padding-box;
  79 + background-clip : padding-box;
  80 + background: #ccc;
  81 + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
  82 + background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
  83 + background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
  84 + background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%);
  85 + background-image: -ms-linear-gradient(top, #cccccc 0%,#eeeeee 60%);
  86 + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#eeeeee',GradientType=0 );
  87 + background-image: linear-gradient(top, #cccccc 0%,#eeeeee 60%);
  88 + border-left: 1px solid #aaa;
  89 + position: absolute;
  90 + right: 0;
  91 + top: 0;
  92 + display: block;
  93 + height: 100%;
  94 + width: 18px;
  95 +}
  96 +.chzn-container-single .chzn-single div b {
  97 + background: url('chosen-sprite.png') no-repeat 0 1px;
  98 + display: block;
  99 + width: 100%;
  100 + height: 100%;
  101 +}
  102 +.chzn-container-single .chzn-search {
  103 + padding: 3px 4px;
  104 + position: relative;
  105 + margin: 0;
  106 + white-space: nowrap;
  107 + z-index: 1010;
  108 +}
  109 +.chzn-container-single .chzn-search input {
  110 + background: #fff url('chosen-sprite.png') no-repeat 100% -22px;
  111 + background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
  112 + background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
  113 + background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
  114 + background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
  115 + background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
  116 + background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
  117 + margin: 1px 0;
  118 + padding: 4px 20px 4px 5px;
  119 + outline: 0;
  120 + border: 1px solid #aaa;
  121 + font-family: sans-serif;
  122 + font-size: 1em;
  123 +}
  124 +.chzn-container-single .chzn-drop {
  125 + -webkit-border-radius: 0 0 4px 4px;
  126 + -moz-border-radius : 0 0 4px 4px;
  127 + border-radius : 0 0 4px 4px;
  128 + -moz-background-clip : padding;
  129 + -webkit-background-clip: padding-box;
  130 + background-clip : padding-box;
  131 +}
  132 +/* @end */
  133 +
  134 +.chzn-container-single-nosearch .chzn-search input {
  135 + position: absolute;
  136 + left: -9000px;
  137 +}
  138 +
  139 +/* @group Multi Chosen */
  140 +.chzn-container-multi .chzn-choices {
  141 + background-color: #fff;
  142 + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
  143 + background-image: -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
  144 + background-image: -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
  145 + background-image: -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
  146 + background-image: -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
  147 + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 );
  148 + background-image: linear-gradient(top, #ffffff 85%,#eeeeee 99%);
  149 + border: 1px solid #aaa;
  150 + margin: 0;
  151 + padding: 0;
  152 + cursor: text;
  153 + overflow: hidden;
  154 + height: auto !important;
  155 + height: 1%;
  156 + position: relative;
  157 +}
  158 +.chzn-container-multi .chzn-choices li {
  159 + float: left;
  160 + list-style: none;
  161 +}
  162 +.chzn-container-multi .chzn-choices .search-field {
  163 + white-space: nowrap;
  164 + margin: 0;
  165 + padding: 0;
  166 +}
  167 +.chzn-container-multi .chzn-choices .search-field input {
  168 + color: #666;
  169 + background: transparent !important;
  170 + border: 0 !important;
  171 + padding: 5px;
  172 + margin: 1px 0;
  173 + outline: 0;
  174 + -webkit-box-shadow: none;
  175 + -moz-box-shadow : none;
  176 + -o-box-shadow : none;
  177 + box-shadow : none;
  178 +}
  179 +.chzn-container-multi .chzn-choices .search-field .default {
  180 + color: #999;
  181 +}
  182 +.chzn-container-multi .chzn-choices .search-choice {
  183 + -webkit-border-radius: 3px;
  184 + -moz-border-radius : 3px;
  185 + border-radius : 3px;
  186 + -moz-background-clip : padding;
  187 + -webkit-background-clip: padding-box;
  188 + background-clip : padding-box;
  189 + background-color: #e4e4e4;
  190 + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e4e4e4), color-stop(0.7, #eeeeee));
  191 + background-image: -webkit-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%);
  192 + background-image: -moz-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%);
  193 + background-image: -o-linear-gradient(bottom, #e4e4e4 0%, #eeeeee 70%);
  194 + background-image: -ms-linear-gradient(top, #e4e4e4 0%,#eeeeee 70%);
  195 + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e4e4e4', endColorstr='#eeeeee',GradientType=0 );
  196 + background-image: linear-gradient(top, #e4e4e4 0%,#eeeeee 70%);
  197 + color: #333;
  198 + border: 1px solid #b4b4b4;
  199 + line-height: 13px;
  200 + padding: 3px 19px 3px 6px;
  201 + margin: 3px 0 3px 5px;
  202 + position: relative;
  203 +}
  204 +.chzn-container-multi .chzn-choices .search-choice span {
  205 + cursor: default;
  206 +}
  207 +.chzn-container-multi .chzn-choices .search-choice-focus {
  208 + background: #d4d4d4;
  209 +}
  210 +.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
  211 + display: block;
  212 + position: absolute;
  213 + right: 3px;
  214 + top: 4px;
  215 + width: 12px;
  216 + height: 13px;
  217 + font-size: 1px;
  218 + background: url(chosen-sprite.png) right top no-repeat;
  219 +}
  220 +.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
  221 + background-position: right -11px;
  222 +}
  223 +.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
  224 + background-position: right -11px;
  225 +}
  226 +/* @end */
  227 +
  228 +/* @group Results */
  229 +.chzn-container .chzn-results {
  230 + margin: 0 4px 4px 0;
  231 + max-height: 190px;
  232 + padding: 0 0 0 4px;
  233 + position: relative;
  234 + overflow-x: hidden;
  235 + overflow-y: auto;
  236 +}
  237 +.chzn-container-multi .chzn-results {
  238 + margin: -1px 0 0;
  239 + padding: 0;
  240 +}
  241 +.chzn-container .chzn-results li {
  242 + display: none;
  243 + line-height: 80%;
  244 + padding: 7px 7px 8px;
  245 + margin: 0;
  246 + list-style: none;
  247 +}
  248 +.chzn-container .chzn-results .active-result {
  249 + cursor: pointer;
  250 + display: list-item;
  251 +}
  252 +.chzn-container .chzn-results .highlighted {
  253 + background: #3875d7;
  254 + color: #fff;
  255 +}
  256 +.chzn-container .chzn-results li em {
  257 + background: #feffde;
  258 + font-style: normal;
  259 +}
  260 +.chzn-container .chzn-results .highlighted em {
  261 + background: transparent;
  262 +}
  263 +.chzn-container .chzn-results .no-results {
  264 + background: #f4f4f4;
  265 + display: list-item;
  266 +}
  267 +.chzn-container .chzn-results .group-result {
  268 + cursor: default;
  269 + color: #999;
  270 + font-weight: bold;
  271 +}
  272 +.chzn-container .chzn-results .group-option {
  273 + padding-left: 20px;
  274 +}
  275 +.chzn-container-multi .chzn-drop .result-selected {
  276 + display: none;
  277 +}
  278 +/* @end */
  279 +
  280 +/* @group Active */
  281 +.chzn-container-active .chzn-single {
  282 + -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
  283 + -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
  284 + -o-box-shadow : 0 0 5px rgba(0,0,0,.3);
  285 + box-shadow : 0 0 5px rgba(0,0,0,.3);
  286 + border: 1px solid #5897fb;
  287 +}
  288 +.chzn-container-active .chzn-single-with-drop {
  289 + border: 1px solid #aaa;
  290 + -webkit-box-shadow: 0 1px 0 #fff inset;
  291 + -moz-box-shadow : 0 1px 0 #fff inset;
  292 + -o-box-shadow : 0 1px 0 #fff inset;
  293 + box-shadow : 0 1px 0 #fff inset;
  294 + background-color: #eee;
  295 + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee));
  296 + background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%);
  297 + background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%);
  298 + background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%);
  299 + background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%);
  300 + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 );
  301 + background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%);
  302 + -webkit-border-bottom-left-radius : 0;
  303 + -webkit-border-bottom-right-radius: 0;
  304 + -moz-border-radius-bottomleft : 0;
  305 + -moz-border-radius-bottomright: 0;
  306 + border-bottom-left-radius : 0;
  307 + border-bottom-right-radius: 0;
  308 +}
  309 +.chzn-container-active .chzn-single-with-drop div {
  310 + background: transparent;
  311 + border-left: none;
  312 +}
  313 +.chzn-container-active .chzn-single-with-drop div b {
  314 + background-position: -18px 1px;
  315 +}
  316 +.chzn-container-active .chzn-choices {
  317 + -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
  318 + -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
  319 + -o-box-shadow : 0 0 5px rgba(0,0,0,.3);
  320 + box-shadow : 0 0 5px rgba(0,0,0,.3);
  321 + border: 1px solid #5897fb;
  322 +}
  323 +.chzn-container-active .chzn-choices .search-field input {
  324 + color: #111 !important;
  325 +}
  326 +/* @end */
  327 +
  328 +/* @group Disabled Support */
  329 +.chzn-disabled {
  330 + cursor: default;
  331 + opacity:0.5 !important;
  332 +}
  333 +.chzn-disabled .chzn-single {
  334 + cursor: default;
  335 +}
  336 +.chzn-disabled .chzn-choices .search-choice .search-choice-close {
  337 + cursor: default;
  338 +}
  339 +
  340 +/* @group Right to Left */
  341 +.chzn-rtl { direction:rtl;text-align: right; }
  342 +.chzn-rtl .chzn-single { padding-left: 0; padding-right: 8px; }
  343 +.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; }
  344 +.chzn-rtl .chzn-single div {
  345 + left: 0; right: auto;
  346 + border-left: none; border-right: 1px solid #aaaaaa;
  347 + -webkit-border-radius: 4px 0 0 4px;
  348 + -moz-border-radius : 4px 0 0 4px;
  349 + border-radius : 4px 0 0 4px;
  350 +}
  351 +.chzn-rtl .chzn-choices li { float: right; }
  352 +.chzn-rtl .chzn-choices .search-choice { padding: 3px 6px 3px 19px; margin: 3px 5px 3px 0; }
  353 +.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 5px; right: auto; background-position: right top;}
  354 +.chzn-rtl.chzn-container-single .chzn-results { margin-left: 4px; margin-right: 0; padding-left: 0; padding-right: 4px; }
  355 +.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 20px; }
  356 +.chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; }
  357 +.chzn-rtl .chzn-search input {
  358 + background: url('chosen-sprite.png') no-repeat -38px -22px, #ffffff;
  359 + background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
  360 + background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
  361 + background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
  362 + background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
  363 + background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
  364 + background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
  365 + padding: 4px 5px 4px 20px;
  366 +}
  367 +/* @end */
... ...
app/assets/stylesheets/projects.css.scss
... ... @@ -706,3 +706,16 @@ table.highlighttable pre{
706 706 line-height:16px !important;
707 707 font-size:12px !important;
708 708 }
  709 +
  710 +.project-refs-form {
  711 + span {
  712 + background: none !important;
  713 + position:static !important;
  714 + width:auto !important;
  715 + height: auto !important;
  716 + }
  717 +}
  718 +
  719 +.project-refs-select {
  720 + width:200px;
  721 +}
... ...
app/controllers/application_controller.rb
... ... @@ -57,19 +57,13 @@ class ApplicationController &lt; ActionController::Base
57 57 end
58 58  
59 59 def load_refs
60   - @branch = unless params[:branch].blank?
61   - params[:branch]
62   - else
63   - nil
64   - end
65   -
66   - @tag = unless params[:tag].blank?
67   - params[:tag]
68   - else
69   - nil
70   - end
71   -
72   - @ref = @branch || @tag || "master"
  60 + unless params[:ref].blank?
  61 + @ref = params[:ref]
  62 + else
  63 + @branch = params[:branch].blank? ? nil : params[:branch]
  64 + @tag = params[:tag].blank? ? nil : params[:tag]
  65 + @ref = @branch || @tag || "master"
  66 + end
73 67 end
74 68  
75 69 def render_404
... ...
app/helpers/application_helper.rb
... ... @@ -32,6 +32,15 @@ module ApplicationHelper
32 32 "Never"
33 33 end
34 34  
  35 + def grouped_options_refs
  36 + options = [
  37 + ["Branch", @repo.heads.map(&:name) ],
  38 + [ "Tag", @project.tags ]
  39 + ]
  40 +
  41 + grouped_options_for_select(options, @ref)
  42 + end
  43 +
35 44 def markdown(text)
36 45 RDiscount.new(text, :autolink, :no_pseudo_protocols, :safelink, :smart, :filter_html).to_html.html_safe
37 46 end
... ...
app/views/commits/index.html.haml
1 1 - content_for(:body_class, "project-page commits-page")
2 2  
3   -.left
4   - = form_tag project_commits_path(@project), :method => :get do
5   - = select_tag "branch", options_for_select(@repo.heads.map(&:name), @branch), :onchange => "this.form.submit();", :class => "", :prompt => "Branches"
6   -.left
7   - = form_tag project_commits_path(@project), :method => :get do
8   - = select_tag "tag", options_for_select(@project.tags, @tag), :onchange => "this.form.submit();", :class => "", :prompt => "Tags"
9   -.clear
10   -
11   -%br
12   -
13   -
14 3 -#%a.right.button{:href => "#"} Download
15 4 -#-if can? current_user, :admin_project, @project
16 5 %a.right.button.blue{:href => "#"} EDIT
17 6 %h2.icon
18 7 %span
19   - %a.project-name{:href => "#"}
20   - %i.arrow>
21   - Project
22   - &nbsp;
23 8 %d
24   - %a{:href => "#"}
25   - = @ref
26   - - if params[:path]
27   - &nbsp;
28   - %d
  9 + = link_to project_commits_path(@project) do
  10 + = @project.name
  11 + - if params[:path]
  12 + \/
29 13 %a{:href => "#"}= params[:path].split("/").join(" / ")
30 14  
  15 +.right= render "projects/refs"
31 16  
32 17 %div{:id => dom_id(@project)}
33 18 = render "commits"
... ...
app/views/projects/_refs.html.haml 0 → 100644
... ... @@ -0,0 +1,8 @@
  1 += form_tag project_commits_path(@project), :method => :get, :class => "project-refs-form" do
  2 + = select_tag "ref", grouped_options_refs, :onchange => "this.form.submit();", :class => "project-refs-select"
  3 +
  4 +
  5 +:javascript
  6 + $(function(){
  7 + $('.project-refs-select').chosen();
  8 + })
... ...
app/views/projects/_tree.html.haml
1   -.left
2   - = form_tag tree_project_path(@project), :method => :get do
3   - = select_tag "branch", options_for_select(@repo.heads.map(&:name), @branch), :onchange => "this.form.submit();", :class => "", :prompt => "Branches"
4   -.left
5   - = form_tag tree_project_path(@project), :method => :get do
6   - = select_tag "tag", options_for_select(@project.tags, @tag), :onchange => "this.form.submit();", :class => "", :prompt => "Tags"
7   -.clear
8   -
9   -%br
10 1  
11 2 -#%a.right.button{:href => "#"} Download
12 3 -#-if can? current_user, :admin_project, @project
... ... @@ -14,14 +5,9 @@
14 5 #tree-breadcrumbs
15 6 %h2.icon
16 7 %span
17   - = link_to tree_project_path(@project, :path => nil, :commit_id => @commit.try(:id)), :remote => true, :class => 'project-name' do
18   - %i.arrow>
19   - = @project.name
20   - &nbsp;
21 8 %d
22   - %a{:href => "#"}
23   - = @ref
24   -
  9 + = link_to tree_project_path(@project, :path => nil, :commit_id => @commit.try(:id)), :remote => true do
  10 + = @project.name
25 11 - if params[:path]
26 12 - part_path = ""
27 13 - params[:path].split("\/").each do |part|
... ... @@ -30,7 +16,8 @@
30 16 - part_path = part
31 17 \/
32 18 = link_to truncate(part, :length => 40), tree_file_project_path(@project, :path => part_path, :commit_id => @commit.try(:id), :branch => @branch, :tag => @tag), :remote => :true
33   -
  19 + &nbsp;
  20 + .right= render "projects/refs"
34 21 .clear
35 22  
36 23 #tree-content-holder
... ...