Browse Source

Clean old code for multiselect (replaced with select2 plugin).

Laurent Destailleur 10 years ago
parent
commit
d4ad7236e5
73 changed files with 2475 additions and 841 deletions
  1. 1 1
      COPYRIGHT
  2. 27 37
      htdocs/core/class/html.form.class.php
  3. 0 21
      htdocs/includes/jquery/plugins/multiple-select/LICENSE
  4. 0 96
      htdocs/includes/jquery/plugins/multiple-select/README.md
  5. 0 466
      htdocs/includes/jquery/plugins/multiple-select/jquery.multiple.select.js
  6. 0 183
      htdocs/includes/jquery/plugins/multiple-select/multiple-select.css
  7. 0 28
      htdocs/includes/jquery/plugins/multiple-select/multiple-select.jquery.json
  8. BIN
      htdocs/includes/jquery/plugins/multiple-select/multiple-select.png
  9. 2 0
      htdocs/includes/jquery/plugins/select2/.gitignore
  10. 107 0
      htdocs/includes/jquery/plugins/select2/CONTRIBUTING.md
  11. 18 0
      htdocs/includes/jquery/plugins/select2/LICENSE
  12. 114 0
      htdocs/includes/jquery/plugins/select2/README.md
  13. 8 0
      htdocs/includes/jquery/plugins/select2/bower.json
  14. 66 0
      htdocs/includes/jquery/plugins/select2/component.json
  15. 29 0
      htdocs/includes/jquery/plugins/select2/composer.json
  16. 20 0
      htdocs/includes/jquery/plugins/select2/package.json
  17. 79 0
      htdocs/includes/jquery/plugins/select2/release.sh
  18. 87 0
      htdocs/includes/jquery/plugins/select2/select2-bootstrap.css
  19. BIN
      htdocs/includes/jquery/plugins/select2/select2-spinner.gif
  20. 704 0
      htdocs/includes/jquery/plugins/select2/select2.css
  21. 36 0
      htdocs/includes/jquery/plugins/select2/select2.jquery.json
  22. 100 0
      htdocs/includes/jquery/plugins/select2/select2.js
  23. 20 0
      htdocs/includes/jquery/plugins/select2/select2.min.js
  24. BIN
      htdocs/includes/jquery/plugins/select2/select2.png
  25. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_ar.js
  26. 20 0
      htdocs/includes/jquery/plugins/select2/select2_locale_az.js
  27. 20 0
      htdocs/includes/jquery/plugins/select2/select2_locale_bg.js
  28. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_ca.js
  29. 51 0
      htdocs/includes/jquery/plugins/select2/select2_locale_cs.js
  30. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_da.js
  31. 18 0
      htdocs/includes/jquery/plugins/select2/select2_locale_de.js
  32. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_el.js
  33. 20 0
      htdocs/includes/jquery/plugins/select2/select2_locale_en.js.template
  34. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_es.js
  35. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_et.js
  36. 45 0
      htdocs/includes/jquery/plugins/select2/select2_locale_eu.js
  37. 21 0
      htdocs/includes/jquery/plugins/select2/select2_locale_fa.js
  38. 30 0
      htdocs/includes/jquery/plugins/select2/select2_locale_fi.js
  39. 18 0
      htdocs/includes/jquery/plugins/select2/select2_locale_fr.js
  40. 45 0
      htdocs/includes/jquery/plugins/select2/select2_locale_gl.js
  41. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_he.js
  42. 24 0
      htdocs/includes/jquery/plugins/select2/select2_locale_hr.js
  43. 17 0
      htdocs/includes/jquery/plugins/select2/select2_locale_hu.js
  44. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_id.js
  45. 17 0
      htdocs/includes/jquery/plugins/select2/select2_locale_is.js
  46. 17 0
      htdocs/includes/jquery/plugins/select2/select2_locale_it.js
  47. 17 0
      htdocs/includes/jquery/plugins/select2/select2_locale_ja.js
  48. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_ka.js
  49. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_ko.js
  50. 26 0
      htdocs/includes/jquery/plugins/select2/select2_locale_lt.js
  51. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_lv.js
  52. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_mk.js
  53. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_ms.js
  54. 22 0
      htdocs/includes/jquery/plugins/select2/select2_locale_nb.js
  55. 17 0
      htdocs/includes/jquery/plugins/select2/select2_locale_nl.js
  56. 54 0
      htdocs/includes/jquery/plugins/select2/select2_locale_pl.js
  57. 18 0
      htdocs/includes/jquery/plugins/select2/select2_locale_pt-BR.js
  58. 17 0
      htdocs/includes/jquery/plugins/select2/select2_locale_pt-PT.js
  59. 17 0
      htdocs/includes/jquery/plugins/select2/select2_locale_ro.js
  60. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_rs.js
  61. 23 0
      htdocs/includes/jquery/plugins/select2/select2_locale_ru.js
  62. 50 0
      htdocs/includes/jquery/plugins/select2/select2_locale_sk.js
  63. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_sv.js
  64. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_th.js
  65. 19 0
      htdocs/includes/jquery/plugins/select2/select2_locale_tr.js
  66. 16 0
      htdocs/includes/jquery/plugins/select2/select2_locale_ug-CN.js
  67. 25 0
      htdocs/includes/jquery/plugins/select2/select2_locale_uk.js
  68. 20 0
      htdocs/includes/jquery/plugins/select2/select2_locale_vi.js
  69. 16 0
      htdocs/includes/jquery/plugins/select2/select2_locale_zh-CN.js
  70. 16 0
      htdocs/includes/jquery/plugins/select2/select2_locale_zh-TW.js
  71. BIN
      htdocs/includes/jquery/plugins/select2/select2x2.png
  72. 8 8
      htdocs/main.inc.php
  73. 9 1
      htdocs/public/test/test_forms.php

+ 1 - 1
COPYRIGHT

@@ -26,7 +26,7 @@ TCPDF                  6.0.093       LGPL-3+                     Yes
 JS libraries:
 jQuery                 1.8.2         MIT License                 Yes             JS library
 jQuery UI              1.9.1         GPL and MIT License         Yes             JS library plugin UI
-jQuery multiple-select 1.1.0        MIT License                 Yes             JS library plugin for sexier multiselect
+jQuery select2         3.5.2         GPL and Apache License      Yes             JS library plugin for sexier multiselect
 jQuery blockUI         2.43          GPL and MIT License         Yes             JS library plugin blockUI (to use ajax popups)
 jQuery Colorpicker     1.1           MIT License                 Yes             JS library for color picker for a defined list of colors
 jQuery DataTables      1.9.4         BSD                         Yes             JS library for tables output

+ 27 - 37
htdocs/core/class/html.form.class.php

@@ -4102,7 +4102,22 @@ class Form
 
         if ($value_as_key) $array=array_combine($array, $array);
 
-        $out='<select id="'.$htmlname.'" '.($disabled?'disabled="disabled" ':'').'class="flat'.($morecss?' '.$morecss:'').'" name="'.$htmlname.'" '.($moreparam?$moreparam:'').'>';
+        $out='';
+        
+        // Add code for jquery to use multiselect
+        if (empty($conf->dol_use_jmobile) && (! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined('REQUIRE_JQUERY_MULTISELECT')))
+        {
+        	$tmpplugin=empty($conf->global->MAIN_USE_JQUERY_MULTISELECT)?constant('REQUIRE_JQUERY_MULTISELECT'):$conf->global->MAIN_USE_JQUERY_MULTISELECT;
+        	$out='<!-- JS CODE TO ENABLE '.$tmpplugin.' for id '.$htmlname.' -->
+        			<script type="text/javascript">
+        				$(document).ready(function () {
+        					$(\'#'.$htmlname.'\').'.$tmpplugin.'({
+        				});
+        			});
+        		   </script>';
+        }
+        
+        $out.='<select id="'.$htmlname.'" '.($disabled?'disabled="disabled" ':'').'class="flat'.($morecss?' '.$morecss:'').'" name="'.$htmlname.'" '.($moreparam?$moreparam:'').'>';
 
         if ($show_empty)
         {
@@ -4166,47 +4181,22 @@ class Form
     	global $conf, $langs;
 
     	// Add code for jquery to use multiselect
-    	// Note: Plugin "multiselect" is no more provided by Dolibarr. You must include it and load it into your module to use it.
-    	if ((! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) && ($conf->global->MAIN_USE_JQUERY_MULTISELECT == 'multiselect'))
-    		|| (defined('REQUIRE_JQUERY_MULTISELECT') && constant('REQUIRE_JQUERY_MULTISELECT') == 'multiselect'))
-    	{
-	    	print '<!-- JS CODE FOR multiselect -->
-				<script type="text/javascript">
-				$(document).ready(function () {
-					$.extend($.ui.multiselect.locale, {
-						addAll:\''.$langs->transnoentities("AddAll").'\',
-						removeAll:\''.$langs->transnoentities("RemoveAll").'\',
-						itemsCount:\''.$langs->transnoentities("ItemsCount").'\'
-					});
-					$(function(){
-						$("#'.$htmlname.'").multiselect({
-							searchable: false,
-							width: '.($width?$width:300).',
-							height: 120
-						});
-					});
-				});
-				</script>';
-    	}
-
-        // Add code for jquery to use multiple-select
-    	if ((! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) && ($conf->global->MAIN_USE_JQUERY_MULTISELECT == 'multiple-select'))
-    		|| (defined('REQUIRE_JQUERY_MULTISELECT') && constant('REQUIRE_JQUERY_MULTISELECT') == 'multiple-select'))
+    	if (! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined('REQUIRE_JQUERY_MULTISELECT'))
     	{
-	    	print '<!-- JS CODE FOR multiple-select -->
-			<script src="'.DOL_URL_ROOT.'/includes/jquery/plugins/multiple-select/jquery.multiple.select.js"></script>
-	    	<script type="text/javascript">
-				$(document).ready(function () {
-        			$(\'#'.$htmlname.'\').multipleSelect({
-        				filter: true
-        				});
-        		});
-			</script>';
+    		$tmpplugin=empty($conf->global->MAIN_USE_JQUERY_MULTISELECT)?constant('REQUIRE_JQUERY_MULTISELECT'):$conf->global->MAIN_USE_JQUERY_MULTISELECT;
+   			print '<!-- JS CODE TO ENABLE '.$tmpplugin.' for id '.$htmlname.' -->
+    			<script type="text/javascript">
+	    			$(document).ready(function () {
+    					$(\'#'.$htmlname.'\').'.$tmpplugin.'({
+    					});
+    				});
+    			</script>';
     	}
 
     	// Try also magic suggest
 
-    	$out = '<select id="'.$htmlname.'" class="multiselect" multiple="multiple" name="'.$htmlname.'[]"'.$option.($width?' style="width: '.$width.'px"':'').'>'."\n";
+    	// Add data-role="none" to diable jmobile decoration
+    	$out = '<select data-role="none" id="'.$htmlname.'" class="multiselect" multiple="multiple" name="'.$htmlname.'[]"'.$option.($width?' style="width: '.$width.'px"':'').'>'."\n";
     	if (is_array($array) && ! empty($array))
     	{
     		if ($value_as_key) $array=array_combine($array, $array);

+ 0 - 21
htdocs/includes/jquery/plugins/multiple-select/LICENSE

@@ -1,21 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2012-2014 Zhixin Wen <wenzhixin2010@gmail.com>
-
-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.

+ 0 - 96
htdocs/includes/jquery/plugins/multiple-select/README.md

@@ -1,96 +0,0 @@
-# Multiple Select
-
-Multiple select is a jQuery plugin to select multiple elements with checkboxes :).
-
-To get started checkout examples and documentation at http://wenzhixin.net.cn/p/multiple-select
-
-## Contributors
-
-Multiple select is due to the excellent work of the following contributors:
-
-<table>
-<tbody>
-<tr><th align="left">文翼</th><td><a href="https://github.com/wenzhixin">GitHub/wenzhixin</a></td></tr>
-<tr><th align="left">Gaurav Jassal</th><td><a href="https://github.com/creativeaura">GitHub/creativeaura</a></td><</tr>
-<tr><th align="left">guli</th><td><a href="https://github.com/guli">GitHub/guli</a></td></tr>
-<tr><th align="left">jwheadon</th><td><a href="https://github.com/jwheadon">GitHub/jwheadon</a></td></tr>
-<tr><th align="left">yx</th><td><a href="https://github.com/qqfish">GitHub/qqfish</a></td></tr>
-<tr><th align="left">Tobias Macey</th><td><a href="https://github.com/blarghmatey">GitHub/blarghmatey</a></td></tr>
-<tr><th align="left">Jona Goldman</th><td><a href="https://github.com/jonagoldman">GitHub/jonagoldman</a></td></tr>
-<tr><th align="left">Alex Jeffrey</th><td><a href="https://github.com/ajeffrey">GitHub/ajeffrey</a></td></tr>
-</tbody>
-</table>
-
-## Changelog
-
-### 1.1.0
-
-* Fix #63: Add ```keepOpen``` option.
-* Fix #62: Fix ```isOpen``` and ```filter``` options are both true bug.
-* Fix #57: Fire onCheckAll event when literally select.
-* Add data attributes for support.
-* Fix #55: Add ```name``` option.
-
-### 1.0.9
-
-* Fix #42: Add ```styler``` option to custom item style.
-* Fix firefox click bug.
-* Add ```allSelected```, ```minumimCountSelected``` and ```countSelected``` options.
-* Fix #35: Add ```onFocus``` and ```onBlur``` events.
-* Fix #25: Add ```focus``` and ```blur``` methods.
-* Fix #31: Trigger the onCheckAll & onUncheckAll events when use filter to select all.
-
-### 1.0.8
-
-* Update the license to The MIT License.
-* Fix #47: Add ```No matches found``` message when there are no results found.
-* Fix #43: Add ```position``` option.
-
-### 1.0.7
-
-* Fix #44: The filters not working bugs.
-
-### 1.0.6
-
-* Fix #21: Add ```single``` option.
-* Add ```override``` option.
-* Add ```container``` option.
-* Fix #29: Update the optgroups select text.
-* Fix #30: Image is not shown in Firefox 25.0.1.
-* Fix #22: fix group filter problem.
-
-### 1.0.5
-
-* Update the button text witdh.
-* Add keyboard support.
-
-### 1.0.4
-
-* Fix #12: Add ```width``` option.
-* Fix #11: Add callback events.
-* Add ```maxHeight``` option.
-
-### 1.0.3
-
-* Fix #4: Add ```filter``` option.
-* Support mobile devices.
-* Fix #6: Add ```refresh``` method.
-
-### 1.0.2
-
-* Fix #7: Add ```selected``` and ```disabled``` options.
-* Fix #5: Add ```checkAll``` and ```uncheckAll``` methods.
-
-### 1.0.1
-
-* Fix #3: Add optgroups support.
-* Add ```placeholder``` option.
-* Fix #2: use prop method instead of attr.
-
-### 1.0.0
-
-* Initial release
-
-## LICENSE
-
-[The MIT License](https://github.com/wenzhixin/multiple-select/blob/master/LICENSE)

+ 0 - 466
htdocs/includes/jquery/plugins/multiple-select/jquery.multiple.select.js

@@ -1,466 +0,0 @@
-/**
- * @author zhixin wen <wenzhixin2010@gmail.com>
- * @version 1.1.0
- * 
- * http://wenzhixin.net.cn/p/multiple-select/
- */
-
-(function($) {
-
-    'use strict';
-
-    function MultipleSelect($el, options) {
-        var that = this,
-            name = $el.attr('name') || options.name || '',
-            elWidth = $el.width();
-
-        this.$el = $el.hide();
-        this.options = options;
-
-        this.$parent = $('<div class="ms-parent"></div>');
-        this.$choice = $('<button type="button" class="ms-choice"><span class="placeholder">' +
-            options.placeholder + '</span><div></div></button>');
-        this.$drop = $('<div class="ms-drop ' + options.position + '"></div>');
-        this.$el.after(this.$parent);
-        this.$parent.append(this.$choice);
-        this.$parent.append(this.$drop);
-
-        if (this.$el.prop('disabled')) {
-            this.$choice.addClass('disabled');
-        }
-        this.$choice.css('width', elWidth + 'px');
-        this.$drop.css({
-            width: (options.width || elWidth) + 'px'
-        });
-
-        if (!this.options.keepOpen) {
-            $('body').click(function(e) {
-                if ($(e.target)[0] === that.$choice[0] ||
-                    $(e.target).parents('.ms-choice')[0] === that.$choice[0]) {
-                    return;
-                }
-                if (($(e.target)[0] === that.$drop[0] ||
-                    $(e.target).parents('.ms-drop')[0] !== that.$drop[0]) &&
-                    that.options.isOpen) {
-                    that.close();
-                }
-            });
-        }
-
-        this.selectAllName = 'name="selectAll' + name + '"';
-        this.selectGroupName = 'name="selectGroup' + name + '"';
-        this.selectItemName = 'name="selectItem' + name + '"';
-    }
-
-    MultipleSelect.prototype = {
-        constructor : MultipleSelect,
-
-        init: function() {
-            var that = this,
-                html = [];
-            if (this.options.filter) {
-                html.push(
-                    '<div class="ms-search">',
-                        '<input type="text" autocomplete="off" autocorrect="off" autocapitilize="off" spellcheck="false">',
-                    '</div>'
-                );
-            }
-            html.push('<ul>');
-            if (this.options.selectAll && !this.options.single) {
-                html.push(
-                    '<li>',
-                        '<label>',
-                            '<input type="checkbox" ' + this.selectAllName + ' /> ',
-                            '[' + this.options.selectAllText + ']',
-                        '</label>',
-                    '</li>'
-                );
-            }
-            $.each(this.$el.children(), function(i, elm) {
-                html.push(that.optionToHtml(i, elm));
-            });
-            html.push('<li class="ms-no-results">No matches found</li>');
-            html.push('</ul>');
-            this.$drop.html(html.join(''));
-            this.$drop.find('ul').css('max-height', this.options.maxHeight + 'px');
-            this.$drop.find('.multiple').css('width', this.options.multipleWidth + 'px');
-
-            this.$searchInput = this.$drop.find('.ms-search input');
-            this.$selectAll = this.$drop.find('input[' + this.selectAllName + ']');
-            this.$selectGroups = this.$drop.find('input[' + this.selectGroupName + ']');
-            this.$selectItems = this.$drop.find('input[' + this.selectItemName + ']:enabled');
-            this.$disableItems = this.$drop.find('input[' + this.selectItemName + ']:disabled');
-            this.$noResults = this.$drop.find('.ms-no-results');
-            this.events();
-            this.update();
-
-            if (this.options.isOpen) {
-                this.open();
-            }
-        },
-
-        optionToHtml: function(i, elm, group, groupDisabled) {
-            var that = this,
-                $elm = $(elm),
-                html = [],
-                multiple = this.options.multiple,
-                disabled,
-                type = this.options.single ? 'radio' : 'checkbox';
-
-            if ($elm.is('option')) {
-                var value = $elm.val(),
-                    text = $elm.text(),
-                    selected = $elm.prop('selected'),
-                    style = this.options.styler(value) ? ' style="' + this.options.styler(value) + '"' : '';
-
-                disabled = groupDisabled || $elm.prop('disabled');
-                html.push(
-                    '<li' + (multiple ? ' class="multiple"' : '') + style + '>',
-                        '<label' + (disabled ? ' class="disabled"' : '') + '>',
-                            '<input type="' + type + '" ' + this.selectItemName + ' value="' + value + '"' +
-                                (selected ? ' checked="checked"' : '') +
-                                (disabled ? ' disabled="disabled"' : '') +
-                                (group ? ' data-group="' + group + '"' : '') +
-                                '/> ',
-                            text,
-                        '</label>',
-                    '</li>'
-                );
-            } else if (!group && $elm.is('optgroup')) {
-                var _group = 'group_' + i,
-                    label = $elm.attr('label');
-
-                disabled = $elm.prop('disabled');
-                html.push(
-                    '<li class="group">',
-                        '<label class="optgroup' + (disabled ? ' disabled' : '') + '" data-group="' + _group + '">',
-                            '<input type="checkbox" ' + this.selectGroupName +
-                                (disabled ? ' disabled="disabled"' : '') + ' /> ',
-                            label,
-                        '</label>',
-                    '</li>');
-                $.each($elm.children(), function(i, elm) {
-                    html.push(that.optionToHtml(i, elm, _group, disabled));
-                });
-            }
-            return html.join('');
-        },
-
-        events: function() {
-            var that = this;
-            this.$choice.off('click').on('click', function(e) {
-                e.preventDefault();
-                that[that.options.isOpen ? 'close' : 'open']();
-            })
-                .off('focus').on('focus', this.options.onFocus)
-                .off('blur').on('blur', this.options.onBlur);
-
-            this.$parent.off('keydown').on('keydown', function(e) {
-                switch (e.which) {
-                    case 27: // esc key
-                        that.close();
-                        that.$choice.focus();
-                        break;
-                }
-            });
-            this.$searchInput.off('keyup').on('keyup', function() {
-                that.filter();
-            });
-            this.$selectAll.off('click').on('click', function() {
-                var checked = $(this).prop('checked'),
-                    $items = that.$selectItems.filter(':visible');
-                if ($items.length === that.$selectItems.length) {
-                    that[checked ? 'checkAll' : 'uncheckAll']();
-                } else { // when the filter option is true
-                    that.$selectGroups.prop('checked', checked);
-                    $items.prop('checked', checked);
-                    that.options[checked ? 'onCheckAll' : 'onUncheckAll']();
-                    that.update();
-                }
-            });
-            this.$selectGroups.off('click').on('click', function() {
-                var group = $(this).parent().attr('data-group'),
-                    $items = that.$selectItems.filter(':visible'),
-                    $children = $items.filter('[data-group="' + group + '"]'),
-                    checked = $children.length !== $children.filter(':checked').length;
-                $children.prop('checked', checked);
-                that.updateSelectAll();
-                that.update();
-                that.options.onOptgroupClick({
-                    label: $(this).parent().text(),
-                    checked: checked,
-                    children: $children.get()
-                });
-            });
-            this.$selectItems.off('click').on('click', function() {
-                that.updateSelectAll();
-                that.update();
-                that.updateOptGroupSelect();
-                that.options.onClick({
-                    label: $(this).parent().text(),
-                    value: $(this).val(),
-                    checked: $(this).prop('checked')
-                });
-            });
-        },
-
-        open: function() {
-            if (this.$choice.hasClass('disabled')) {
-                return;
-            }
-            this.options.isOpen = true;
-            this.$choice.find('>div').addClass('open');
-            this.$drop.show();
-            if (this.options.container) {
-                var offset = this.$drop.offset();
-                this.$drop.appendTo($(this.options.container));
-                this.$drop.offset({ top: offset.top, left: offset.left });
-            }
-            if (this.options.filter) {
-                this.$searchInput.val('');
-                this.filter();
-            }
-            this.options.onOpen();
-        },
-
-        close: function() {
-            this.options.isOpen = false;
-            this.$choice.find('>div').removeClass('open');
-            this.$drop.hide();
-            if (this.options.container) {
-                this.$parent.append(this.$drop);
-                this.$drop.css({
-                    'top': 'auto',
-                    'left': 'auto'
-                })
-            }
-            this.options.onClose();
-        },
-
-        update: function() {
-            var selects = this.getSelects('text'),
-                $span = this.$choice.find('>span');
-            if (selects.length === this.$selectItems.length + this.$disableItems.length && this.options.allSelected) {
-                $span.removeClass('placeholder').html(this.options.allSelected);
-            } else if (selects.length > this.options.minumimCountSelected && this.options.countSelected) {
-                $span.removeClass('placeholder').html(this.options.countSelected
-                    .replace('#', selects.length)
-                    .replace('%', this.$selectItems.length + this.$disableItems.length));
-            } else if (selects.length) {
-                $span.removeClass('placeholder').html(selects.join(', '));
-            } else {
-                $span.addClass('placeholder').html(this.options.placeholder);
-            }
-            // set selects to select
-            this.$el.val(this.getSelects());
-        },
-
-        updateSelectAll: function() {
-            var $items = this.$selectItems.filter(':visible');
-            this.$selectAll.prop('checked', $items.length &&
-                $items.length === $items.filter(':checked').length);
-            if (this.$selectAll.prop('checked')) {
-                this.options.onCheckAll();
-            }
-        },
-
-        updateOptGroupSelect: function() {
-            var $items = this.$selectItems.filter(':visible');
-            $.each(this.$selectGroups, function(i, val) {
-                var group = $(val).parent().attr('data-group'),
-                    $children = $items.filter('[data-group="' + group + '"]');
-                $(val).prop('checked', $children.length &&
-                    $children.length === $children.filter(':checked').length);
-            });
-        },
-
-        //value or text, default: 'value'
-        getSelects: function(type) {
-            var that = this,
-                texts = [],
-                values = [];
-            this.$drop.find('input[' + this.selectItemName + ']:checked').each(function() {
-                texts.push($(this).parent().text());
-                values.push($(this).val());
-            });
-
-            if (type === 'text' && this.$selectGroups.length) {
-                texts = [];
-                this.$selectGroups.each(function() {
-                    var html = [],
-                        text = $.trim($(this).parent().text()),
-                        group = $(this).parent().data('group'),
-                        $children = that.$drop.find('[' + that.selectItemName + '][data-group="' + group + '"]'),
-                        $selected = $children.filter(':checked');
-
-                    if ($selected.length === 0) {
-                        return;
-                    }
-
-                    html.push('[');
-                    html.push(text);
-                    if ($children.length > $selected.length) {
-                        var list = [];
-                        $selected.each(function() {
-                            list.push($(this).parent().text());
-                        });
-                        html.push(': ' + list.join(', '));
-                    }
-                    html.push(']');
-                    texts.push(html.join(''));
-                });
-            }
-            return type === 'text' ? texts : values;
-        },
-
-        setSelects: function(values) {
-            var that = this;
-            this.$selectItems.prop('checked', false);
-            $.each(values, function(i, value) {
-                that.$selectItems.filter('[value="' + value + '"]').prop('checked', true);
-            });
-            this.$selectAll.prop('checked', this.$selectItems.length ===
-                this.$selectItems.filter(':checked').length);
-            this.update();
-        },
-
-        enable: function() {
-            this.$choice.removeClass('disabled');
-        },
-
-        disable: function() {
-            this.$choice.addClass('disabled');
-        },
-
-        checkAll: function() {
-            this.$selectItems.prop('checked', true);
-            this.$selectGroups.prop('checked', true);
-            this.$selectAll.prop('checked', true);
-            this.update();
-            this.options.onCheckAll();
-        },
-
-        uncheckAll: function() {
-            this.$selectItems.prop('checked', false);
-            this.$selectGroups.prop('checked', false);
-            this.$selectAll.prop('checked', false);
-            this.update();
-            this.options.onUncheckAll();
-        },
-
-        focus: function() {
-            this.$choice.focus();
-            this.options.onFocus();
-        },
-
-        blur: function() {
-            this.$choice.blur();
-            this.options.onBlur();
-        },
-
-        refresh: function() {
-            this.init();
-        },
-
-        filter: function() {
-            var that = this,
-                text = $.trim(this.$searchInput.val()).toLowerCase();
-            if (text.length === 0) {
-                this.$selectItems.parent().show();
-                this.$disableItems.parent().show();
-                this.$selectGroups.parent().show();
-            } else {
-                this.$selectItems.each(function() {
-                    var $parent = $(this).parent();
-                    $parent[$parent.text().toLowerCase().indexOf(text) < 0 ? 'hide' : 'show']();
-                });
-                this.$disableItems.parent().hide();
-                this.$selectGroups.each(function() {
-                    var $parent = $(this).parent();
-                    var group = $parent.attr('data-group'),
-                        $items = that.$selectItems.filter(':visible');
-                    $parent[$items.filter('[data-group="' + group + '"]').length === 0 ? 'hide' : 'show']();
-                });
-
-                //Check if no matches found
-                if (this.$selectItems.filter(':visible').length) {
-                    this.$selectAll.parent().show();
-                    this.$noResults.hide();
-                } else {
-                    this.$selectAll.parent().hide();
-                    this.$noResults.show();
-                }
-            }
-            this.updateOptGroupSelect();
-            this.updateSelectAll();
-        }
-    };
-
-    $.fn.multipleSelect = function() {
-        var option = arguments[0],
-            args = arguments,
-
-            value,
-            allowedMethods = [
-                'getSelects', 'setSelects',
-                'enable', 'disable',
-                'checkAll', 'uncheckAll',
-                'focus', 'blur',
-                'refresh'
-            ];
-
-        this.each(function() {
-            var $this = $(this),
-                data = $this.data('multipleSelect'),
-                options = $.extend({}, $.fn.multipleSelect.defaults,
-                    $this.data(), typeof option === 'object' && option);
-
-            if (!data) {
-                data = new MultipleSelect($this, options);
-                $this.data('multipleSelect', data);
-            }
-
-            if (typeof option === 'string') {
-                if ($.inArray(option, allowedMethods) < 0) {
-                    throw "Unknown method: " + option;
-                }
-                value = data[option](args[1]);
-            } else {
-                data.init();
-            }
-        });
-
-        return value ? value : this;
-    };
-
-    $.fn.multipleSelect.defaults = {
-        name: '',
-        isOpen: false,
-        placeholder: '',
-        selectAll: true,
-        selectAllText: 'Select all',
-        allSelected: 'All selected',
-        minumimCountSelected: 3,
-        countSelected: '# of % selected',
-        multiple: false,
-        multipleWidth: 80,
-        single: false,
-        filter: false,
-        width: undefined,
-        maxHeight: 250,
-        container: null,
-        position: 'bottom',
-        keepOpen: false,
-
-        styler: function() {return false;},
-
-        onOpen: function() {return false;},
-        onClose: function() {return false;},
-        onCheckAll: function() {return false;},
-        onUncheckAll: function() {return false;},
-        onFocus: function() {return false;},
-        onBlur: function() {return false;},
-        onOptgroupClick: function() {return false;},
-        onClick: function() {return false;}
-    };
-})(jQuery);

+ 0 - 183
htdocs/includes/jquery/plugins/multiple-select/multiple-select.css

@@ -1,183 +0,0 @@
-/**
- * @author zhixin wen <wenzhixin2010@gmail.com>
- */
-
-.ms-parent {
-    display: inline-block;
-    position: relative;
-    vertical-align: middle;
-}
-
-.ms-choice {
-    display: block;
-    height: 26px;
-    padding: 0;
-    overflow: hidden;
-    cursor: pointer;
-    border: 1px solid #aaa;
-    text-align: left;
-    white-space: nowrap;
-    line-height: 26px;
-    color: #444;
-    text-decoration: none;
-    -webkit-border-radius: 4px;
-    -moz-border-radius: 4px;
-    border-radius: 4px;
-    background-color: #fff;
-}
-
-.ms-choice.disabled {
-    background-color: #f4f4f4;
-    background-image: none;
-    border: 1px solid #ddd;
-    cursor: default;
-}
-
-.ms-choice > span {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 20px;
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    display: block;
-    padding-left: 8px;
-}
-
-.ms-choice > span.placeholder {
-    color: #999;
-}
-
-.ms-choice > div {
-    position: absolute;
-    top: 0;
-    right: 0;
-    width: 20px;
-    height: 25px;
-    background: url('multiple-select.png') right top no-repeat;
-}
-
-.ms-choice > div.open {
-    background: url('multiple-select.png') left top no-repeat;
-}
-
-.ms-drop {
-    overflow: hidden;
-    display: none;
-    margin-top: -1px;
-    padding: 0;
-    position: absolute;
-    z-index: 1000;
-    background: #fff;
-    color: #000;
-    border: 1px solid #aaa;
-    -webkit-border-radius: 4px;
-    -moz-border-radius: 4px;
-    border-radius: 4px;
-}
-
-.ms-drop.bottom {
-    top: 100%;
-    -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-    -moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-    box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-}
-
-.ms-drop.top {
-    bottom: 100%;
-    -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-    -moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-    box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-}
-
-.ms-search {
-    display: inline-block;
-    margin: 0;
-    min-height: 26px;
-    padding: 4px;
-    position: relative;
-    white-space: nowrap;
-    width: 100%;
-    z-index: 10000;
-}
-
-.ms-search input {
-    width: 100%;
-    height: auto !important;
-    min-height: 24px;
-    padding: 0 20px 0 5px;
-    margin: 0;
-    outline: 0;
-    font-family: sans-serif;
-    font-size: 1em;
-    border: 1px solid #aaa;
-    -webkit-border-radius: 0;
-    -moz-border-radius: 0;
-    border-radius: 0;
-    -webkit-box-shadow: none;
-    -moz-box-shadow: none;
-    box-shadow: none;
-    background: #fff url('multiple-select.png') no-repeat 100% -22px;
-    background: url('multiple-select.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
-    background: url('multiple-select.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
-    background: url('multiple-select.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
-    background: url('multiple-select.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
-    background: url('multiple-select.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
-    background: url('multiple-select.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
-}
-
-.ms-search, .ms-search input {
-    -webkit-box-sizing: border-box;
-    -khtml-box-sizing: border-box;
-    -moz-box-sizing: border-box;
-    -ms-box-sizing: border-box;
-    box-sizing: border-box;
-}
-
-.ms-drop ul {
-    overflow: auto;
-    margin: 0;
-    padding: 5px 8px;
-}
-
-.ms-drop ul > li {
-    list-style: none;
-    display: list-item;
-    background-image: none;
-    position: static;
-}
-
-.ms-drop ul > li .disabled {
-    opacity: .35;
-    filter: Alpha(Opacity=35);
-}
-
-.ms-drop ul > li.multiple {
-    display: block;
-    float: left;
-}
-
-.ms-drop ul > li.group {
-    clear: both;
-}
-
-.ms-drop ul > li.multiple label {
-    width: 100%;
-    display: block;
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-}
-
-.ms-drop ul > li label.optgroup {
-    font-weight: bold;
-}
-
-.ms-drop input[type="checkbox"] {
-    vertical-align: middle;
-}
-
-.ms-drop .ms-no-results {
-    display: none;
-}

+ 0 - 28
htdocs/includes/jquery/plugins/multiple-select/multiple-select.jquery.json

@@ -1,28 +0,0 @@
-{
-    "name": "multiple-select",
-    "version": "1.1.0",
-    "title": "Multiple Select",
-    "description": "Multiple select is a jQuery plugin to select multiple elements with checkboxes :).",
-    "author": {
-        "name": "zhixin wen",
-        "email": "wenzhixin2010@gmail.com",
-        "url": "http://wenzhixin.net.cn/"
-    },
-    "licenses": [
-        {
-            "type": "MIT License",
-            "url": "http://opensource.org/licenses/MIT"
-        }
-    ],
-    "dependencies": {
-        "jquery": ">=1.7"
-    },
-    "keywords": ["multiple.select", "select.list", "multiple.choose", "checkbox"],
-    "homepage": "http://wenzhixin.net.cn/p/multiple-select/",
-    "demo": "http://wenzhixin.net.cn/p/multiple-select/#examples",
-    "bugs": {
-        "url": "https://github.com/wenzhixin/multiple-select/issues"
-    },
-    "docs": "http://wenzhixin.net.cn/p/multiple-select/#documentation",
-    "download": "https://github.com/wenzhixin/multiple-select/archive/master.zip"
-}

BIN
htdocs/includes/jquery/plugins/multiple-select/multiple-select.png


+ 2 - 0
htdocs/includes/jquery/plugins/select2/.gitignore

@@ -0,0 +1,2 @@
+.idea
+

+ 107 - 0
htdocs/includes/jquery/plugins/select2/CONTRIBUTING.md

@@ -0,0 +1,107 @@
+Contributing to Select2
+=======================
+Looking to contribute something to Select2? **Here's how you can help.**
+
+Please take a moment to review this document in order to make the contribution
+process easy and effective for everyone involved.
+
+Following these guidelines helps to communicate that you respect the time of
+the developers managing and developing this open source project. In return,
+they should reciprocate that respect in addressing your issue or assessing
+patches and features.
+
+Using the issue tracker
+-----------------------
+When [reporting bugs][reporting-bugs] or
+[requesting features][requesting-features], the
+[issue tracker on GitHub][issue-tracker] is the recommended channel to use.
+
+The issue tracker **is not** a place for support requests. The
+[mailing list][mailing-list] or [IRC channel][irc-channel] are better places to
+get help.
+
+Reporting bugs with Select2
+---------------------------
+We really appreciate clear bug reports that _consistently_ show an issue
+_within Select2_.
+
+The ideal bug report follows these guidelines:
+
+1. **Use the [GitHub issue search][issue-search]**  &mdash; Check if the issue
+   has already been reported.
+2. **Check if the issue has been fixed**  &mdash; Try to reproduce the problem
+   using the code in the `master` branch.
+3. **Isolate the problem**  &mdash; Try to create an
+   [isolated test case][isolated-case] that consistently reproduces the problem.
+
+Please try to be as detailed as possible in your bug report, especially if an
+isolated test case cannot be made. Some useful questions to include the answer
+to are:
+
+- What steps can be used to reproduce the issue?
+- What is the bug and what is the expected outcome?
+- What browser(s) and Operating System have you tested with?
+- Does the bug happen consistently across all tested browsers?
+- What version of jQuery are you using? And what version of Select2?
+- Are you using Select2 with other plugins?
+
+All of these questions will help people fix and identify any potential bugs.
+
+Requesting features in Select2
+------------------------------
+Select2 is a large library that carries with it a lot of functionality. Because
+of this, many feature requests will not be implemented in the core library.
+
+Before starting work on a major feature for Select2, **contact the
+[community][community] first** or you may risk spending a considerable amount of
+time on something which the project developers are not interested in bringing
+into the project.
+
+### Select2 4.0
+
+Many feature requests will be closed off until 4.0, where Select2 plans to adopt
+a more flexible API.  If you are interested in helping with the development of
+the next major Select2 release, please send a message to the
+[mailing list][mailing-list] or [irc channel][irc-channel] for more information.
+
+Triaging issues and pull requests
+---------------------------------
+Anyone can help the project maintainers triage issues and review pull requests.
+
+### Handling new issues
+
+Select2 regularly receives new issues which need to be tested and organized.
+
+When a new issue that comes in that is similar to another existing issue, it
+should be checked to make sure it is not a duplicate.  Duplicates issues should
+be marked by replying to the issue with "Duplicate of #[issue number]" where
+`[issue number]` is the url or issue number for the existing issue.  This will
+allow the project maintainers to quickly close off additional issues and keep
+the discussion focused within a single issue.
+
+If you can test issues that are reported to Select2 that contain test cases and
+confirm under what conditions bugs happen, that will allow others to identify
+what causes a bug quicker.
+
+### Reviewing pull requests
+
+It is very common for pull requests to be opened for issues that contain a clear
+solution to the problem.  These pull requests should be rigorously reviewed by
+the community before being accepted.  If you are not sure about a piece of
+submitted code, or know of a better way to do something, do not hesitate to make
+a comment on the pull request.
+
+It should also be made clear that **all code contributed to Select** must be
+licensable under the [Apache 2 or GPL 2 licenses][licensing].  Code that cannot
+be released under either of these licenses **cannot be accepted** into the
+project.
+
+[community]: https://github.com/ivaynberg/select2#community
+[reporting-bugs]: #reporting-bugs-with-select2
+[requesting-features]: #requesting-features-in-select2
+[issue-tracker]: https://github.com/ivaynberg/select2/issues
+[mailing-list]: https://github.com/ivaynberg/select2#mailing-list
+[irc-channel]: https://github.com/ivaynberg/select2#irc-channel
+[issue-search]: https://github.com/ivaynberg/select2/search?q=&type=Issues
+[isolated-case]: http://css-tricks.com/6263-reduced-test-cases/
+[licensing]: https://github.com/ivaynberg/select2#copyright-and-license

+ 18 - 0
htdocs/includes/jquery/plugins/select2/LICENSE

@@ -0,0 +1,18 @@
+Copyright 2014 Igor Vaynberg
+
+Version: @@ver@@ Timestamp: @@timestamp@@
+
+This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
+General Public License version 2 (the "GPL License"). You may choose either license to govern your
+use of this software only upon the condition that you accept all of the terms of either the Apache
+License or the GPL License.
+
+You may obtain a copy of the Apache License and the GPL License at:
+
+http://www.apache.org/licenses/LICENSE-2.0
+http://www.gnu.org/licenses/gpl-2.0.html
+
+Unless required by applicable law or agreed to in writing, software distributed under the Apache License
+or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+either express or implied. See the Apache License and the GPL License for the specific language governing
+permissions and limitations under the Apache License and the GPL License.

+ 114 - 0
htdocs/includes/jquery/plugins/select2/README.md

@@ -0,0 +1,114 @@
+Select2
+=======
+
+Select2 is a jQuery-based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.
+
+To get started, checkout examples and documentation at http://ivaynberg.github.com/select2
+
+Use cases
+---------
+
+* Enhancing native selects with search.
+* Enhancing native selects with a better multi-select interface.
+* Loading data from JavaScript: easily load items via ajax and have them searchable.
+* Nesting optgroups: native selects only support one level of nested. Select2 does not have this restriction.
+* Tagging: ability to add new items on the fly.
+* Working with large, remote datasets: ability to partially load a dataset based on the search term.
+* Paging of large datasets: easy support for loading more pages when the results are scrolled to the end.
+* Templating: support for custom rendering of results and selections.
+
+Browser compatibility
+---------------------
+* IE 8+
+* Chrome 8+
+* Firefox 10+
+* Safari 3+
+* Opera 10.6+
+
+Usage
+-----
+You can source Select2 directly from a CDN like [JSDliver](http://www.jsdelivr.com/#!select2) or [CDNJS](http://www.cdnjs.com/libraries/select2), [download it from this GitHub repo](https://github.com/ivaynberg/select2/tags), or use one of the integrations below.
+
+Integrations
+------------
+
+* [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / [Apache Wicket](http://wicket.apache.org))
+* [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails)
+* [AngularUI](http://angular-ui.github.io/#ui-select) ([AngularJS](https://angularjs.org/))
+* [Django](https://github.com/applegrew/django-select2)
+* [Symfony](https://github.com/19Gerhard85/sfSelect2WidgetsPlugin)
+* [Symfony2](https://github.com/avocode/FormExtensions)
+* [Bootstrap 2](https://github.com/t0m/select2-bootstrap-css) and [Bootstrap 3](https://github.com/t0m/select2-bootstrap-css/tree/bootstrap3) (CSS skins)
+* [Meteor](https://github.com/nate-strauser/meteor-select2) (modern reactive JavaScript framework; + [Bootstrap 3 skin](https://github.com/esperadomedia/meteor-select2-bootstrap3-css/))
+* [Meteor](https://jquery-select2.meteor.com)
+* [Yii 2.x](http://demos.krajee.com/widgets#select2)
+* [Yii 1.x](https://github.com/tonybolzan/yii-select2)
+* [AtmosphereJS](https://atmospherejs.com/package/jquery-select2)
+
+### Example Integrations
+
+* [Knockout.js](https://github.com/ivaynberg/select2/wiki/Knockout.js-Integration)
+* [Socket.IO](https://github.com/ivaynberg/select2/wiki/Socket.IO-Integration)
+* [PHP](https://github.com/ivaynberg/select2/wiki/PHP-Example)
+* [.Net MVC] (https://github.com/ivaynberg/select2/wiki/.Net-MVC-Example)
+
+Internationalization (i18n)
+---------------------------
+
+Select2 supports multiple languages by simply including the right language JS
+file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.) after `select2.js`.
+
+Missing a language? Just copy `select2_locale_en.js.template`, translate
+it, and make a pull request back to Select2 here on GitHub.
+
+Documentation
+-------------
+
+The documentation for Select2 is available [through GitHub Pages](https://ivaynberg.github.io/select2/) and is located within this repository in the [`gh-pages` branch](https://github.com/ivaynberg/select2/tree/gh-pages).
+
+Community
+---------
+
+### Bug tracker
+
+Have a bug? Please create an issue here on GitHub!
+
+https://github.com/ivaynberg/select2/issues
+
+### Mailing list
+
+Have a question? Ask on our mailing list!
+
+select2@googlegroups.com
+
+https://groups.google.com/d/forum/select2
+
+### IRC channel
+
+Need help implementing Select2 in your project? Ask in our IRC channel!
+
+**Network:** [Freenode](https://freenode.net/) (`chat.freenode.net`)
+
+**Channel:** `#select2`
+
+**Web access:** https://webchat.freenode.net/?channels=select2
+
+Copyright and license
+---------------------
+
+Copyright 2012 Igor Vaynberg
+
+This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
+General Public License version 2 (the "GPL License"). You may choose either license to govern your
+use of this software only upon the condition that you accept all of the terms of either the Apache
+License or the GPL License.
+
+You may obtain a copy of the Apache License and the GPL License in the LICENSE file, or at:
+
+http://www.apache.org/licenses/LICENSE-2.0
+http://www.gnu.org/licenses/gpl-2.0.html
+
+Unless required by applicable law or agreed to in writing, software distributed under the Apache License
+or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+either express or implied. See the Apache License and the GPL License for the specific language governing
+permissions and limitations under the Apache License and the GPL License.

+ 8 - 0
htdocs/includes/jquery/plugins/select2/bower.json

@@ -0,0 +1,8 @@
+{
+    "name": "select2",
+    "version": "3.5.2",
+    "main": ["select2.js", "select2.css", "select2.png", "select2x2.png", "select2-spinner.gif"],
+    "dependencies": {
+        "jquery": ">= 1.7.1"
+    }
+}

+ 66 - 0
htdocs/includes/jquery/plugins/select2/component.json

@@ -0,0 +1,66 @@
+{
+  "name": "select2",
+  "repo": "ivaynberg/select2",
+  "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
+  "version": "3.5.2",
+  "demo": "http://ivaynberg.github.io/select2/",
+  "keywords": [
+    "jquery"
+  ],
+  "main": "select2.js",
+  "styles": [
+    "select2.css",
+    "select2-bootstrap.css"
+  ],
+  "scripts": [
+    "select2.js",
+    "select2_locale_ar.js",
+    "select2_locale_bg.js",
+    "select2_locale_ca.js",
+    "select2_locale_cs.js",
+    "select2_locale_da.js",
+    "select2_locale_de.js",
+    "select2_locale_el.js",
+    "select2_locale_es.js",
+    "select2_locale_et.js",
+    "select2_locale_eu.js",
+    "select2_locale_fa.js",
+    "select2_locale_fi.js",
+    "select2_locale_fr.js",
+    "select2_locale_gl.js",
+    "select2_locale_he.js",
+    "select2_locale_hr.js",
+    "select2_locale_hu.js",
+    "select2_locale_id.js",
+    "select2_locale_is.js",
+    "select2_locale_it.js",
+    "select2_locale_ja.js",
+    "select2_locale_ka.js",
+    "select2_locale_ko.js",
+    "select2_locale_lt.js",
+    "select2_locale_lv.js",
+    "select2_locale_mk.js",
+    "select2_locale_ms.js",
+    "select2_locale_nl.js",
+    "select2_locale_no.js",
+    "select2_locale_pl.js",
+    "select2_locale_pt-BR.js",
+    "select2_locale_pt-PT.js",
+    "select2_locale_ro.js",
+    "select2_locale_ru.js",
+    "select2_locale_sk.js",
+    "select2_locale_sv.js",
+    "select2_locale_th.js",
+    "select2_locale_tr.js",
+    "select2_locale_uk.js",
+    "select2_locale_vi.js",
+    "select2_locale_zh-CN.js",
+    "select2_locale_zh-TW.js"
+  ],
+  "images": [
+    "select2-spinner.gif",
+    "select2.png",
+    "select2x2.png"
+  ],
+  "license": "MIT"
+}

+ 29 - 0
htdocs/includes/jquery/plugins/select2/composer.json

@@ -0,0 +1,29 @@
+{
+  "name":
+  "ivaynberg/select2",
+  "description": "Select2 is a jQuery based replacement for select boxes.",
+  "version": "3.5.2",
+  "type": "component",
+  "homepage": "http://ivaynberg.github.io/select2/",
+  "license": "Apache-2.0",
+  "require": {
+    "robloach/component-installer": "*",
+    "components/jquery": ">=1.7.1"
+  },
+  "extra": {
+    "component": {
+      "scripts": [
+        "select2.js"
+      ],
+      "files": [
+        "select2.js",
+        "select2_locale_*.js",
+        "select2.css",
+        "select2-bootstrap.css",
+        "select2-spinner.gif",
+        "select2.png",
+        "select2x2.png"
+      ]
+    }
+  }
+}

+ 20 - 0
htdocs/includes/jquery/plugins/select2/package.json

@@ -0,0 +1,20 @@
+{
+  "name" : "Select2",
+  "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
+  "homepage": "http://ivaynberg.github.io/select2",
+  "author": "Igor Vaynberg",
+  "repository": {"type": "git", "url": "git://github.com/ivaynberg/select2.git"},
+  "main": "select2.js",
+  "version": "3.5.2",
+  "jspm": {
+    "main": "select2",
+    "files": ["select2.js", "select2.png", "select2.css", "select2-spinner.gif"],
+    "shim": {
+        "select2": {
+            "imports": ["jquery", "./select2.css!"],
+            "exports": "$"
+        }
+    },
+    "buildConfig": { "uglify": true }
+  }
+}

+ 79 - 0
htdocs/includes/jquery/plugins/select2/release.sh

@@ -0,0 +1,79 @@
+#!/bin/bash
+set -e
+
+echo -n "Enter the version for this release: "
+
+read ver
+
+if [ ! $ver ]; then
+	echo "Invalid version."
+	exit
+fi
+
+name="select2"
+js="$name.js"
+mini="$name.min.js"
+css="$name.css"
+release="$name-$ver"
+tag="$ver"
+branch="build-$ver"
+curbranch=`git branch | grep "*" | sed "s/* //"`
+timestamp=$(date)
+tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g"
+remote="origin"
+
+echo "Pulling from origin"
+
+git pull
+
+echo "Updating Version Identifiers"
+
+sed -E -e "s/\"version\": \"([0-9\.]+)\",/\"version\": \"$ver\",/g" -i -- bower.json select2.jquery.json component.json composer.json package.json
+
+git add bower.json
+git add select2.jquery.json
+git add component.json
+git add composer.json
+git add package.json
+
+git commit -m "modified version identifiers in descriptors for release $ver"
+git push
+
+git branch "$branch"
+git checkout "$branch"
+
+echo "Tokenizing..."
+
+find . -name "$js" | xargs -I{} sed -e "$tokens" -i -- {}
+find . -name "$css" | xargs -I{} sed -e "$tokens" -i -- {}
+
+sed -e "s/latest/$ver/g" -i -- bower.json
+
+git add "$js"
+git add "$css"
+
+echo "Minifying..."
+
+echo "/*" > "$mini"
+cat LICENSE | sed "$tokens" >> "$mini"
+echo "*/" >> "$mini"
+
+curl -s \
+	--data-urlencode "js_code@$js" \
+	http://marijnhaverbeke.nl/uglifyjs \
+	>> "$mini"
+
+git add "$mini"
+
+git commit -m "release $ver"
+
+echo "Tagging..."
+git tag -a "$tag" -m "tagged version $ver"
+git push "$remote" --tags
+
+echo "Cleaning Up..."
+
+git checkout "$curbranch"
+git branch -D "$branch"
+
+echo "Done"

+ 87 - 0
htdocs/includes/jquery/plugins/select2/select2-bootstrap.css

@@ -0,0 +1,87 @@
+.form-control .select2-choice {
+    border: 0;
+    border-radius: 2px;
+}
+
+.form-control .select2-choice .select2-arrow {
+    border-radius: 0 2px 2px 0;   
+}
+
+.form-control.select2-container {
+    height: auto !important;
+    padding: 0;
+}
+
+.form-control.select2-container.select2-dropdown-open {
+    border-color: #5897FB;
+    border-radius: 3px 3px 0 0;
+}
+
+.form-control .select2-container.select2-dropdown-open .select2-choices {
+    border-radius: 3px 3px 0 0;
+}
+
+.form-control.select2-container .select2-choices {
+    border: 0 !important;
+    border-radius: 3px;
+}
+
+.control-group.warning .select2-container .select2-choice,
+.control-group.warning .select2-container .select2-choices,
+.control-group.warning .select2-container-active .select2-choice,
+.control-group.warning .select2-container-active .select2-choices,
+.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.warning .select2-container-multi.select2-container-active .select2-choices {
+    border: 1px solid #C09853 !important;
+}
+
+.control-group.warning .select2-container .select2-choice div {
+    border-left: 1px solid #C09853 !important;
+    background: #FCF8E3 !important;
+}
+
+.control-group.error .select2-container .select2-choice,
+.control-group.error .select2-container .select2-choices,
+.control-group.error .select2-container-active .select2-choice,
+.control-group.error .select2-container-active .select2-choices,
+.control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.error .select2-container-multi.select2-container-active .select2-choices {
+    border: 1px solid #B94A48 !important;
+}
+
+.control-group.error .select2-container .select2-choice div {
+    border-left: 1px solid #B94A48 !important;
+    background: #F2DEDE !important;
+}
+
+.control-group.info .select2-container .select2-choice,
+.control-group.info .select2-container .select2-choices,
+.control-group.info .select2-container-active .select2-choice,
+.control-group.info .select2-container-active .select2-choices,
+.control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.info .select2-container-multi.select2-container-active .select2-choices {
+    border: 1px solid #3A87AD !important;
+}
+
+.control-group.info .select2-container .select2-choice div {
+    border-left: 1px solid #3A87AD !important;
+    background: #D9EDF7 !important;
+}
+
+.control-group.success .select2-container .select2-choice,
+.control-group.success .select2-container .select2-choices,
+.control-group.success .select2-container-active .select2-choice,
+.control-group.success .select2-container-active .select2-choices,
+.control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.success .select2-container-multi.select2-container-active .select2-choices {
+    border: 1px solid #468847 !important;
+}
+
+.control-group.success .select2-container .select2-choice div {
+    border-left: 1px solid #468847 !important;
+    background: #DFF0D8 !important;
+}

BIN
htdocs/includes/jquery/plugins/select2/select2-spinner.gif


+ 704 - 0
htdocs/includes/jquery/plugins/select2/select2.css

@@ -0,0 +1,704 @@
+/*
+Version: 3.5.2 Timestamp: Sat Nov  1 14:43:36 EDT 2014
+*/
+.select2-container {
+    margin: 0;
+    position: relative;
+    display: inline-block;
+    /* inline-block for ie7 */
+    zoom: 1;
+    *display: inline;
+    vertical-align: middle;
+}
+
+.select2-container,
+.select2-drop,
+.select2-search,
+.select2-search input {
+  /*
+    Force border-box so that % widths fit the parent
+    container without overlap because of margin/padding.
+    More Info : http://www.quirksmode.org/css/box.html
+  */
+  -webkit-box-sizing: border-box; /* webkit */
+     -moz-box-sizing: border-box; /* firefox */
+          box-sizing: border-box; /* css3 */
+}
+
+.select2-container .select2-choice {
+    display: block;
+    height: 26px;
+    padding: 0 0 0 8px;
+    overflow: hidden;
+    position: relative;
+
+    border: 1px solid #aaa;
+    white-space: nowrap;
+    line-height: 26px;
+    color: #444;
+    text-decoration: none;
+
+    border-radius: 4px;
+
+    background-clip: padding-box;
+
+    -webkit-touch-callout: none;
+      -webkit-user-select: none;
+         -moz-user-select: none;
+          -ms-user-select: none;
+              user-select: none;
+
+    background-color: #fff;
+    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
+    background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
+    background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
+    background-image: linear-gradient(to top, #eee 0%, #fff 50%);
+}
+
+html[dir="rtl"] .select2-container .select2-choice {
+    padding: 0 8px 0 0;
+}
+
+.select2-container.select2-drop-above .select2-choice {
+    border-bottom-color: #aaa;
+
+    border-radius: 0 0 4px 4px;
+
+    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
+    background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
+    background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
+    background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
+}
+
+.select2-container.select2-allowclear .select2-choice .select2-chosen {
+    margin-right: 42px;
+}
+
+.select2-container .select2-choice > .select2-chosen {
+    margin-right: 26px;
+    display: block;
+    overflow: hidden;
+
+    white-space: nowrap;
+
+    text-overflow: ellipsis;
+    float: none;
+    width: auto;
+}
+
+html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
+    margin-left: 26px;
+    margin-right: 0;
+}
+
+.select2-container .select2-choice abbr {
+    display: none;
+    width: 12px;
+    height: 12px;
+    position: absolute;
+    right: 24px;
+    top: 8px;
+
+    font-size: 1px;
+    text-decoration: none;
+
+    border: 0;
+    background: url('select2.png') right top no-repeat;
+    cursor: pointer;
+    outline: 0;
+}
+
+.select2-container.select2-allowclear .select2-choice abbr {
+    display: inline-block;
+}
+
+.select2-container .select2-choice abbr:hover {
+    background-position: right -11px;
+    cursor: pointer;
+}
+
+.select2-drop-mask {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    position: fixed;
+    left: 0;
+    top: 0;
+    min-height: 100%;
+    min-width: 100%;
+    height: auto;
+    width: auto;
+    opacity: 0;
+    z-index: 9998;
+    /* styles required for IE to work */
+    background-color: #fff;
+    filter: alpha(opacity=0);
+}
+
+.select2-drop {
+    width: 100%;
+    margin-top: -1px;
+    position: absolute;
+    z-index: 9999;
+    top: 100%;
+
+    background: #fff;
+    color: #000;
+    border: 1px solid #aaa;
+    border-top: 0;
+
+    border-radius: 0 0 4px 4px;
+
+    -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
+            box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
+}
+
+.select2-drop.select2-drop-above {
+    margin-top: 1px;
+    border-top: 1px solid #aaa;
+    border-bottom: 0;
+
+    border-radius: 4px 4px 0 0;
+
+    -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
+            box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
+}
+
+.select2-drop-active {
+    border: 1px solid #5897fb;
+    border-top: none;
+}
+
+.select2-drop.select2-drop-above.select2-drop-active {
+    border-top: 1px solid #5897fb;
+}
+
+.select2-drop-auto-width {
+    border-top: 1px solid #aaa;
+    width: auto;
+}
+
+.select2-drop-auto-width .select2-search {
+    padding-top: 4px;
+}
+
+.select2-container .select2-choice .select2-arrow {
+    display: inline-block;
+    width: 18px;
+    height: 100%;
+    position: absolute;
+    right: 0;
+    top: 0;
+
+    border-left: 1px solid #aaa;
+    border-radius: 0 4px 4px 0;
+
+    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%);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
+    background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
+}
+
+html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
+    left: 0;
+    right: auto;
+
+    border-left: none;
+    border-right: 1px solid #aaa;
+    border-radius: 4px 0 0 4px;
+}
+
+.select2-container .select2-choice .select2-arrow b {
+    display: block;
+    width: 100%;
+    height: 100%;
+    background: url('select2.png') no-repeat 0 1px;
+}
+
+html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
+    background-position: 2px 1px;
+}
+
+.select2-search {
+    display: inline-block;
+    width: 100%;
+    min-height: 26px;
+    margin: 0;
+    padding-left: 4px;
+    padding-right: 4px;
+
+    position: relative;
+    z-index: 10000;
+
+    white-space: nowrap;
+}
+
+.select2-search input {
+    width: 100%;
+    height: auto !important;
+    min-height: 26px;
+    padding: 4px 20px 4px 5px;
+    margin: 0;
+
+    outline: 0;
+    font-family: sans-serif;
+    font-size: 1em;
+
+    border: 1px solid #aaa;
+    border-radius: 0;
+
+    -webkit-box-shadow: none;
+            box-shadow: none;
+
+    background: #fff url('select2.png') no-repeat 100% -22px;
+    background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
+    background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
+    background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
+    background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
+}
+
+html[dir="rtl"] .select2-search input {
+    padding: 4px 5px 4px 20px;
+
+    background: #fff url('select2.png') no-repeat -37px -22px;
+    background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
+    background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
+    background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
+    background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
+}
+
+.select2-drop.select2-drop-above .select2-search input {
+    margin-top: 4px;
+}
+
+.select2-search input.select2-active {
+    background: #fff url('select2-spinner.gif') no-repeat 100%;
+    background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
+    background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
+    background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
+    background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
+}
+
+.select2-container-active .select2-choice,
+.select2-container-active .select2-choices {
+    border: 1px solid #5897fb;
+    outline: none;
+
+    -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+            box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+}
+
+.select2-dropdown-open .select2-choice {
+    border-bottom-color: transparent;
+    -webkit-box-shadow: 0 1px 0 #fff inset;
+            box-shadow: 0 1px 0 #fff inset;
+
+    border-bottom-left-radius: 0;
+    border-bottom-right-radius: 0;
+
+    background-color: #eee;
+    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
+    background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
+    background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
+    background-image: linear-gradient(to top, #fff 0%, #eee 50%);
+}
+
+.select2-dropdown-open.select2-drop-above .select2-choice,
+.select2-dropdown-open.select2-drop-above .select2-choices {
+    border: 1px solid #5897fb;
+    border-top-color: transparent;
+
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
+    background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
+    background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
+    background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
+}
+
+.select2-dropdown-open .select2-choice .select2-arrow {
+    background: transparent;
+    border-left: none;
+    filter: none;
+}
+html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
+    border-right: none;
+}
+
+.select2-dropdown-open .select2-choice .select2-arrow b {
+    background-position: -18px 1px;
+}
+
+html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
+    background-position: -16px 1px;
+}
+
+.select2-hidden-accessible {
+    border: 0;
+    clip: rect(0 0 0 0);
+    height: 1px;
+    margin: -1px;
+    overflow: hidden;
+    padding: 0;
+    position: absolute;
+    width: 1px;
+}
+
+/* results */
+.select2-results {
+    max-height: 200px;
+    padding: 0 0 0 4px;
+    margin: 4px 4px 4px 0;
+    position: relative;
+    overflow-x: hidden;
+    overflow-y: auto;
+    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+html[dir="rtl"] .select2-results {
+    padding: 0 4px 0 0;
+    margin: 4px 0 4px 4px;
+}
+
+.select2-results ul.select2-result-sub {
+    margin: 0;
+    padding-left: 0;
+}
+
+.select2-results li {
+    list-style: none;
+    display: list-item;
+    background-image: none;
+}
+
+.select2-results li.select2-result-with-children > .select2-result-label {
+    font-weight: bold;
+}
+
+.select2-results .select2-result-label {
+    padding: 3px 7px 4px;
+    margin: 0;
+    cursor: pointer;
+
+    min-height: 1em;
+
+    -webkit-touch-callout: none;
+      -webkit-user-select: none;
+         -moz-user-select: none;
+          -ms-user-select: none;
+              user-select: none;
+}
+
+.select2-results-dept-1 .select2-result-label { padding-left: 20px }
+.select2-results-dept-2 .select2-result-label { padding-left: 40px }
+.select2-results-dept-3 .select2-result-label { padding-left: 60px }
+.select2-results-dept-4 .select2-result-label { padding-left: 80px }
+.select2-results-dept-5 .select2-result-label { padding-left: 100px }
+.select2-results-dept-6 .select2-result-label { padding-left: 110px }
+.select2-results-dept-7 .select2-result-label { padding-left: 120px }
+
+.select2-results .select2-highlighted {
+    background: #3875d7;
+    color: #fff;
+}
+
+.select2-results li em {
+    background: #feffde;
+    font-style: normal;
+}
+
+.select2-results .select2-highlighted em {
+    background: transparent;
+}
+
+.select2-results .select2-highlighted ul {
+    background: #fff;
+    color: #000;
+}
+
+.select2-results .select2-no-results,
+.select2-results .select2-searching,
+.select2-results .select2-ajax-error,
+.select2-results .select2-selection-limit {
+    background: #f4f4f4;
+    display: list-item;
+    padding-left: 5px;
+}
+
+/*
+disabled look for disabled choices in the results dropdown
+*/
+.select2-results .select2-disabled.select2-highlighted {
+    color: #666;
+    background: #f4f4f4;
+    display: list-item;
+    cursor: default;
+}
+.select2-results .select2-disabled {
+  background: #f4f4f4;
+  display: list-item;
+  cursor: default;
+}
+
+.select2-results .select2-selected {
+    display: none;
+}
+
+.select2-more-results.select2-active {
+    background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
+}
+
+.select2-results .select2-ajax-error {
+    background: rgba(255, 50, 50, .2);
+}
+
+.select2-more-results {
+    background: #f4f4f4;
+    display: list-item;
+}
+
+/* disabled styles */
+
+.select2-container.select2-container-disabled .select2-choice {
+    background-color: #f4f4f4;
+    background-image: none;
+    border: 1px solid #ddd;
+    cursor: default;
+}
+
+.select2-container.select2-container-disabled .select2-choice .select2-arrow {
+    background-color: #f4f4f4;
+    background-image: none;
+    border-left: 0;
+}
+
+.select2-container.select2-container-disabled .select2-choice abbr {
+    display: none;
+}
+
+
+/* multiselect */
+
+.select2-container-multi .select2-choices {
+    height: auto !important;
+    height: 1%;
+    margin: 0;
+    padding: 0 5px 0 0;
+    position: relative;
+
+    border: 1px solid #aaa;
+    cursor: text;
+    overflow: hidden;
+
+    background-color: #fff;
+    background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
+    background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
+    background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
+    background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
+}
+
+html[dir="rtl"] .select2-container-multi .select2-choices {
+    padding: 0 0 0 5px;
+}
+
+.select2-locked {
+  padding: 3px 5px 3px 5px !important;
+}
+
+.select2-container-multi .select2-choices {
+    min-height: 26px;
+}
+
+.select2-container-multi.select2-container-active .select2-choices {
+    border: 1px solid #5897fb;
+    outline: none;
+
+    -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+            box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+}
+.select2-container-multi .select2-choices li {
+    float: left;
+    list-style: none;
+}
+html[dir="rtl"] .select2-container-multi .select2-choices li
+{
+    float: right;
+}
+.select2-container-multi .select2-choices .select2-search-field {
+    margin: 0;
+    padding: 0;
+    white-space: nowrap;
+}
+
+.select2-container-multi .select2-choices .select2-search-field input {
+    padding: 5px;
+    margin: 1px 0;
+
+    font-family: sans-serif;
+    font-size: 100%;
+    color: #666;
+    outline: 0;
+    border: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+    background: transparent !important;
+}
+
+.select2-container-multi .select2-choices .select2-search-field input.select2-active {
+    background: #fff url('select2-spinner.gif') no-repeat 100% !important;
+}
+
+.select2-default {
+    color: #999 !important;
+}
+
+.select2-container-multi .select2-choices .select2-search-choice {
+    padding: 3px 5px 3px 18px;
+    margin: 3px 0 3px 5px;
+    position: relative;
+
+    line-height: 13px;
+    color: #333;
+    cursor: default;
+    border: 1px solid #aaaaaa;
+
+    border-radius: 3px;
+
+    -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
+            box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
+
+    background-clip: padding-box;
+
+    -webkit-touch-callout: none;
+      -webkit-user-select: none;
+         -moz-user-select: none;
+          -ms-user-select: none;
+              user-select: none;
+
+    background-color: #e4e4e4;
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
+    background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
+    background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
+    background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
+    background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
+}
+html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
+{
+    margin: 3px 5px 3px 0;
+    padding: 3px 18px 3px 5px;
+}
+.select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
+    cursor: default;
+}
+.select2-container-multi .select2-choices .select2-search-choice-focus {
+    background: #d4d4d4;
+}
+
+.select2-search-choice-close {
+    display: block;
+    width: 12px;
+    height: 13px;
+    position: absolute;
+    right: 3px;
+    top: 4px;
+
+    font-size: 1px;
+    outline: none;
+    background: url('select2.png') right top no-repeat;
+}
+html[dir="rtl"] .select2-search-choice-close {
+    right: auto;
+    left: 3px;
+}
+
+.select2-container-multi .select2-search-choice-close {
+    left: 3px;
+}
+
+html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
+    left: auto;
+    right: 2px;
+}
+
+.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
+  background-position: right -11px;
+}
+.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
+    background-position: right -11px;
+}
+
+/* disabled styles */
+.select2-container-multi.select2-container-disabled .select2-choices {
+    background-color: #f4f4f4;
+    background-image: none;
+    border: 1px solid #ddd;
+    cursor: default;
+}
+
+.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
+    padding: 3px 5px 3px 5px;
+    border: 1px solid #ddd;
+    background-image: none;
+    background-color: #f4f4f4;
+}
+
+.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close {    display: none;
+    background: none;
+}
+/* end multiselect */
+
+
+.select2-result-selectable .select2-match,
+.select2-result-unselectable .select2-match {
+    text-decoration: underline;
+}
+
+.select2-offscreen, .select2-offscreen:focus {
+    clip: rect(0 0 0 0) !important;
+    width: 1px !important;
+    height: 1px !important;
+    border: 0 !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: hidden !important;
+    position: absolute !important;
+    outline: 0 !important;
+    left: 0px !important;
+    top: 0px !important;
+}
+
+.select2-display-none {
+    display: none;
+}
+
+.select2-measure-scrollbar {
+    position: absolute;
+    top: -10000px;
+    left: -10000px;
+    width: 100px;
+    height: 100px;
+    overflow: scroll;
+}
+
+/* Retina-ize icons */
+
+@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx)  {
+    .select2-search input,
+    .select2-search-choice-close,
+    .select2-container .select2-choice abbr,
+    .select2-container .select2-choice .select2-arrow b {
+        background-image: url('select2x2.png') !important;
+        background-repeat: no-repeat !important;
+        background-size: 60px 40px !important;
+    }
+
+    .select2-search input {
+        background-position: 100% -21px !important;
+    }
+}

+ 36 - 0
htdocs/includes/jquery/plugins/select2/select2.jquery.json

@@ -0,0 +1,36 @@
+{
+    "name": "select2",
+    "title": "Select2",
+    "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
+    "keywords": [
+        "select",
+        "autocomplete",
+        "typeahead",
+        "dropdown",
+        "multiselect",
+        "tag",
+        "tagging"
+    ],
+    "version": "3.5.2",
+    "author": {
+        "name": "Igor Vaynberg",
+        "url": "https://github.com/ivaynberg"
+    },
+    "licenses": [
+        {
+            "type": "Apache",
+            "url": "http://www.apache.org/licenses/LICENSE-2.0"
+        },
+        {
+            "type": "GPL v2",
+            "url": "http://www.gnu.org/licenses/gpl-2.0.html"
+        }
+    ],
+    "bugs": "https://github.com/ivaynberg/select2/issues",
+    "homepage": "http://ivaynberg.github.com/select2",
+    "docs": "http://ivaynberg.github.com/select2/",
+    "download": "https://github.com/ivaynberg/select2/tags",
+    "dependencies": {
+        "jquery": ">=1.7.1"
+    }
+}

File diff suppressed because it is too large
+ 100 - 0
htdocs/includes/jquery/plugins/select2/select2.js


File diff suppressed because it is too large
+ 20 - 0
htdocs/includes/jquery/plugins/select2/select2.min.js


BIN
htdocs/includes/jquery/plugins/select2/select2.png


+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_ar.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Arabic translation.
+ *
+ * Author: Adel KEDJOUR <adel@kedjour.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['ar'] = {
+        formatNoMatches: function () { return "لم يتم العثور على مطابقات"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; if (n == 1){ return "الرجاء إدخال حرف واحد على الأكثر"; } return n == 2 ? "الرجاء إدخال حرفين على الأكثر" : "الرجاء إدخال " + n + " على الأكثر"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; if (n == 1){ return "الرجاء إدخال حرف واحد على الأقل"; } return n == 2 ? "الرجاء إدخال حرفين على الأقل" : "الرجاء إدخال " + n + " على الأقل "; },
+        formatSelectionTooBig: function (limit) { if (limit == 1){ return "يمكنك أن تختار إختيار واحد فقط"; } return limit == 2 ? "يمكنك أن تختار إختيارين فقط" : "يمكنك أن تختار " + limit + " إختيارات فقط"; },
+        formatLoadMore: function (pageNumber) { return "تحميل المزيد من النتائج…"; },
+        formatSearching: function () { return "البحث…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['ar']);
+})(jQuery);

+ 20 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_az.js

@@ -0,0 +1,20 @@
+/**
+ * Select2 Azerbaijani translation.
+ *
+ * Author: Farhad Safarov <farhad.safarov@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+     $.fn.select2.locales['az'] = {
+        formatMatches: function (matches) { return matches + " nəticə mövcuddur, hərəkət etdirmək üçün yuxarı və aşağı düymələrindən istifadə edin."; },
+        formatNoMatches: function () { return "Nəticə tapılmadı"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return n + " simvol daxil edin"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return n + " simvol silin"; },
+        formatSelectionTooBig: function (limit) { return "Sadəcə " + limit + " element seçə bilərsiniz"; },
+        formatLoadMore: function (pageNumber) { return "Daha çox nəticə yüklənir…"; },
+        formatSearching: function () { return "Axtarılır…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['az']);
+})(jQuery);

+ 20 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_bg.js

@@ -0,0 +1,20 @@
+/**
+ * Select2 Bulgarian translation.
+ * 
+ * @author  Lubomir Vikev <lubomirvikev@gmail.com>
+ * @author  Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['bg'] = {
+        formatNoMatches: function () { return "Няма намерени съвпадения"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Моля въведете още " + n + " символ" + (n > 1 ? "а" : ""); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Моля въведете с " + n + " по-малко символ" + (n > 1 ? "а" : ""); },
+        formatSelectionTooBig: function (limit) { return "Можете да направите до " + limit + (limit > 1 ? " избора" : " избор"); },
+        formatLoadMore: function (pageNumber) { return "Зареждат се още…"; },
+        formatSearching: function () { return "Търсене…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['bg']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_ca.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Catalan translation.
+ * 
+ * Author: David Planella <david.planella@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['ca'] = {
+        formatNoMatches: function () { return "No s'ha trobat cap coincidència"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduïu " + n + " caràcter" + (n == 1 ? "" : "s") + " més"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Introduïu " + n + " caràcter" + (n == 1? "" : "s") + "menys"; },
+        formatSelectionTooBig: function (limit) { return "Només podeu seleccionar " + limit + " element" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "S'estan carregant més resultats…"; },
+        formatSearching: function () { return "S'està cercant…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['ca']);
+})(jQuery);

+ 51 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_cs.js

@@ -0,0 +1,51 @@
+/**
+ * Select2 Czech translation.
+ * 
+ * Author: Michal Marek <ahoj@michal-marek.cz>
+ * Author - sklonovani: David Vallner <david@vallner.net>
+ */
+(function ($) {
+    "use strict";
+    // use text for the numbers 2 through 4
+    var smallNumbers = {
+        2: function(masc) { return (masc ? "dva" : "dvě"); },
+        3: function() { return "tři"; },
+        4: function() { return "čtyři"; }
+    }
+    $.fn.select2.locales['cs'] = {
+        formatNoMatches: function () { return "Nenalezeny žádné položky"; },
+        formatInputTooShort: function (input, min) {
+            var n = min - input.length;
+            if (n == 1) {
+                return "Prosím zadejte ještě jeden znak";
+            } else if (n <= 4) {
+                return "Prosím zadejte ještě další "+smallNumbers[n](true)+" znaky";
+            } else {
+                return "Prosím zadejte ještě dalších "+n+" znaků";
+            }
+        },
+        formatInputTooLong: function (input, max) {
+            var n = input.length - max;
+            if (n == 1) {
+                return "Prosím zadejte o jeden znak méně";
+            } else if (n <= 4) {
+                return "Prosím zadejte o "+smallNumbers[n](true)+" znaky méně";
+            } else {
+                return "Prosím zadejte o "+n+" znaků méně";
+            }
+        },
+        formatSelectionTooBig: function (limit) {
+            if (limit == 1) {
+                return "Můžete zvolit jen jednu položku";
+            } else if (limit <= 4) {
+                return "Můžete zvolit maximálně "+smallNumbers[limit](false)+" položky";
+            } else {
+                return "Můžete zvolit maximálně "+limit+" položek";
+            }
+        },
+        formatLoadMore: function (pageNumber) { return "Načítají se další výsledky…"; },
+        formatSearching: function () { return "Vyhledávání…"; }
+    };
+
+	$.extend($.fn.select2.defaults, $.fn.select2.locales['cs']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_da.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Danish translation.
+ *
+ * Author: Anders Jenbo <anders@jenbo.dk>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['da'] = {
+        formatNoMatches: function () { return "Ingen resultater fundet"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Angiv venligst " + n + " tegn mere"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Angiv venligst " + n + " tegn mindre"; },
+        formatSelectionTooBig: function (limit) { return "Du kan kun vælge " + limit + " emne" + (limit === 1 ? "" : "r"); },
+        formatLoadMore: function (pageNumber) { return "Indlæser flere resultater…"; },
+        formatSearching: function () { return "Søger…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['da']);
+})(jQuery);

+ 18 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_de.js

@@ -0,0 +1,18 @@
+/**
+ * Select2 German translation
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['de'] = {
+        formatNoMatches: function () { return "Keine Übereinstimmungen gefunden"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Bitte " + n + " Zeichen mehr eingeben"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Bitte " + n + " Zeichen weniger eingeben"; },
+        formatSelectionTooBig: function (limit) { return "Sie können nur " + limit + " Eintr" + (limit === 1 ? "ag" : "äge") + " auswählen"; },
+        formatLoadMore: function (pageNumber) { return "Lade mehr Ergebnisse…"; },
+        formatSearching: function () { return "Suche…"; },
+        formatMatches: function (matches) { return matches + " Ergebnis " + (matches > 1 ? "se" : "") + " verfügbar, zum Navigieren die Hoch-/Runter-Pfeiltasten verwenden."; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['de']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_el.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Greek translation.
+ * 
+ * @author  Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['el'] = {
+        formatNoMatches: function () { return "Δεν βρέθηκαν αποτελέσματα"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Παρακαλούμε εισάγετε " + n + " περισσότερο" + (n > 1 ? "υς" : "") + " χαρακτήρ" + (n > 1 ? "ες" : "α"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Παρακαλούμε διαγράψτε " + n + " χαρακτήρ" + (n > 1 ? "ες" : "α"); },
+        formatSelectionTooBig: function (limit) { return "Μπορείτε να επιλέξετε μόνο " + limit + " αντικείμεν" + (limit > 1 ? "α" : "ο"); },
+        formatLoadMore: function (pageNumber) { return "Φόρτωση περισσότερων…"; },
+        formatSearching: function () { return "Αναζήτηση…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['el']);
+})(jQuery);

+ 20 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_en.js.template

@@ -0,0 +1,20 @@
+/**
+ * Select2 <Language> translation.
+ *
+ * Author: Your Name <your@email>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['en'] = {
+        formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; },
+        formatNoMatches: function () { return "No matches found"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); },
+        formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "Loading more results…"; },
+        formatSearching: function () { return "Searching…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_es.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Spanish translation
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['es'] = {
+    	formatMatches: function (matches) { if (matches === 1) { return "Un resultado disponible, presione enter para seleccionarlo."; } return matches + " resultados disponibles, use las teclas de dirección para navegar."; },
+        formatNoMatches: function () { return "No se encontraron resultados"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Por favor, introduzca " + n + " car" + (n == 1? "ácter" : "acteres"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Por favor, elimine " + n + " car" + (n == 1? "ácter" : "acteres"); },
+        formatSelectionTooBig: function (limit) { return "Sólo puede seleccionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "Cargando más resultados…"; },
+        formatSearching: function () { return "Buscando…"; },
+        formatAjaxError: function() { return "La carga falló"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['es']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_et.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Estonian translation.
+ *
+ * Author: Kuldar Kalvik <kuldar@kalvik.ee>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['et'] = {
+        formatNoMatches: function () { return "Tulemused puuduvad"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Sisesta " + n + " täht" + (n == 1 ? "" : "e") + " rohkem"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Sisesta " + n + " täht" + (n == 1? "" : "e") + " vähem"; },
+        formatSelectionTooBig: function (limit) { return "Saad vaid " + limit + " tulemus" + (limit == 1 ? "e" : "t") + " valida"; },
+        formatLoadMore: function (pageNumber) { return "Laen tulemusi.."; },
+        formatSearching: function () { return "Otsin.."; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['et']);
+})(jQuery);

+ 45 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_eu.js

@@ -0,0 +1,45 @@
+/**
+ * Select2 Basque translation.
+ *
+ * Author: Julen Ruiz Aizpuru <julenx at gmail dot com>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['eu'] = {
+        formatNoMatches: function () {
+          return "Ez da bat datorrenik aurkitu";
+        },
+        formatInputTooShort: function (input, min) {
+          var n = min - input.length;
+          if (n === 1) {
+            return "Idatzi karaktere bat gehiago";
+          } else {
+            return "Idatzi " + n + " karaktere gehiago";
+          }
+        },
+        formatInputTooLong: function (input, max) {
+          var n = input.length - max;
+          if (n === 1) {
+            return "Idatzi karaktere bat gutxiago";
+          } else {
+            return "Idatzi " + n + " karaktere gutxiago";
+          }
+        },
+        formatSelectionTooBig: function (limit) {
+          if (limit === 1 ) {
+            return "Elementu bakarra hauta dezakezu";
+          } else {
+            return limit + " elementu hauta ditzakezu soilik";
+          }
+        },
+        formatLoadMore: function (pageNumber) {
+          return "Emaitza gehiago kargatzen…";
+        },
+        formatSearching: function () {
+          return "Bilatzen…";
+        }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['eu']);
+})(jQuery);

+ 21 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_fa.js

@@ -0,0 +1,21 @@
+/**
+ * Select2 Persian translation.
+ * 
+ * Author: Ali Choopan <choopan@arsh.co>
+ * Author: Ebrahim Byagowi <ebrahim@gnu.org>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['fa'] = {
+        formatMatches: function (matches) { return matches + " نتیجه موجود است، کلیدهای جهت بالا و پایین را برای گشتن استفاده کنید."; },
+        formatNoMatches: function () { return "نتیجه‌ای یافت نشد."; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "لطفاً " + n + " نویسه بیشتر وارد نمایید"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "لطفاً " + n + " نویسه را حذف کنید."; },
+        formatSelectionTooBig: function (limit) { return "شما فقط می‌توانید " + limit + " مورد را انتخاب کنید"; },
+        formatLoadMore: function (pageNumber) { return "در حال بارگیری موارد بیشتر…"; },
+        formatSearching: function () { return "در حال جستجو…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['fa']);
+})(jQuery);

+ 30 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_fi.js

@@ -0,0 +1,30 @@
+/**
+ * Select2 Finnish translation
+ */
+(function ($) {
+    "use strict";
+    $.fn.select2.locales['fi'] = {
+        formatNoMatches: function () {
+            return "Ei tuloksia";
+        },
+        formatInputTooShort: function (input, min) {
+            var n = min - input.length;
+            return "Ole hyvä ja anna " + n + " merkkiä lisää";
+        },
+        formatInputTooLong: function (input, max) {
+            var n = input.length - max;
+            return "Ole hyvä ja anna " + n + " merkkiä vähemmän";
+        },
+        formatSelectionTooBig: function (limit) {
+            return "Voit valita ainoastaan " + limit + " kpl";
+        },
+        formatLoadMore: function (pageNumber) {
+            return "Ladataan lisää tuloksia…";
+        },
+        formatSearching: function () {
+            return "Etsitään…";
+        }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['fi']);
+})(jQuery);

+ 18 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_fr.js

@@ -0,0 +1,18 @@
+/**
+ * Select2 French translation
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['fr'] = {
+        formatMatches: function (matches) { return matches + " résultats sont disponibles, utilisez les flèches haut et bas pour naviguer."; },
+        formatNoMatches: function () { return "Aucun résultat trouvé"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Saisissez " + n + " caractère" + (n == 1? "" : "s") + " supplémentaire" + (n == 1? "" : "s") ; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Supprimez " + n + " caractère" + (n == 1? "" : "s"); },
+        formatSelectionTooBig: function (limit) { return "Vous pouvez seulement sélectionner " + limit + " élément" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "Chargement de résultats supplémentaires…"; },
+        formatSearching: function () { return "Recherche en cours…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['fr']);
+})(jQuery);

+ 45 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_gl.js

@@ -0,0 +1,45 @@
+/**
+ * Select2 Galician translation
+ * 
+ * Author: Leandro Regueiro <leandro.regueiro@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['gl'] = {
+        formatNoMatches: function () {
+            return "Non se atoparon resultados";
+        },
+        formatInputTooShort: function (input, min) {
+            var n = min - input.length;
+            if (n === 1) {
+                return "Engada un carácter";
+            } else {
+                return "Engada " + n + " caracteres";
+            }
+        },
+        formatInputTooLong: function (input, max) {
+            var n = input.length - max;
+            if (n === 1) {
+                return "Elimine un carácter";
+            } else {
+                return "Elimine " + n + " caracteres";
+            }
+        },
+        formatSelectionTooBig: function (limit) {
+            if (limit === 1 ) {
+                return "Só pode seleccionar un elemento";
+            } else {
+                return "Só pode seleccionar " + limit + " elementos";
+            }
+        },
+        formatLoadMore: function (pageNumber) {
+            return "Cargando máis resultados…";
+        },
+        formatSearching: function () {
+            return "Buscando…";
+        }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['gl']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_he.js

@@ -0,0 +1,19 @@
+/**
+* Select2 Hebrew translation.
+*
+* Author: Yakir Sitbon <http://www.yakirs.net/>
+*/
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['he'] = {
+        formatNoMatches: function () { return "לא נמצאו התאמות"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "נא להזין עוד " + n + " תווים נוספים"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "נא להזין פחות " + n + " תווים"; },
+        formatSelectionTooBig: function (limit) { return "ניתן לבחור " + limit + " פריטים"; },
+        formatLoadMore: function (pageNumber) { return "טוען תוצאות נוספות…"; },
+        formatSearching: function () { return "מחפש…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['he']);
+})(jQuery);

+ 24 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_hr.js

@@ -0,0 +1,24 @@
+/**
+ * Select2 Croatian translation.
+ *
+ * @author  Edi Modrić <edi.modric@gmail.com>
+ * @author  Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['hr'] = {
+        formatNoMatches: function () { return "Nema rezultata"; },
+        formatInputTooShort: function (input, min) { return "Unesite još" + character(min - input.length); },
+        formatInputTooLong: function (input, max) { return "Unesite" + character(input.length - max) + " manje"; },
+        formatSelectionTooBig: function (limit) { return "Maksimalan broj odabranih stavki je " + limit; },
+        formatLoadMore: function (pageNumber) { return "Učitavanje rezultata…"; },
+        formatSearching: function () { return "Pretraga…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['hr']);
+
+    function character (n) {
+        return " " + n + " znak" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "a" : "" : "ova");
+    }
+})(jQuery);

+ 17 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_hu.js

@@ -0,0 +1,17 @@
+/**
+ * Select2 Hungarian translation
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['hu'] = {
+        formatNoMatches: function () { return "Nincs találat."; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Túl rövid. Még " + n + " karakter hiányzik."; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Túl hosszú. " + n + " karakterrel több, mint kellene."; },
+        formatSelectionTooBig: function (limit) { return "Csak " + limit + " elemet lehet kiválasztani."; },
+        formatLoadMore: function (pageNumber) { return "Töltés…"; },
+        formatSearching: function () { return "Keresés…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['hu']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_id.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Indonesian translation.
+ * 
+ * Author: Ibrahim Yusuf <ibrahim7usuf@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['id'] = {
+        formatNoMatches: function () { return "Tidak ada data yang sesuai"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Masukkan " + n + " huruf lagi" + (n == 1 ? "" : "s"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Hapus " + n + " huruf" + (n == 1 ? "" : "s"); },
+        formatSelectionTooBig: function (limit) { return "Anda hanya dapat memilih " + limit + " pilihan" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "Mengambil data…"; },
+        formatSearching: function () { return "Mencari…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['id']);
+})(jQuery);

+ 17 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_is.js

@@ -0,0 +1,17 @@
+/**
+ * Select2 Icelandic translation.
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['is'] = {
+        formatNoMatches: function () { return "Ekkert fannst"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Vinsamlegast skrifið " + n + " staf" + (n > 1 ? "i" : "") + " í viðbót"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Vinsamlegast styttið texta um " + n + " staf" + (n > 1 ? "i" : ""); },
+        formatSelectionTooBig: function (limit) { return "Þú getur aðeins valið " + limit + " atriði"; },
+        formatLoadMore: function (pageNumber) { return "Sæki fleiri niðurstöður…"; },
+        formatSearching: function () { return "Leita…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['is']);
+})(jQuery);

+ 17 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_it.js

@@ -0,0 +1,17 @@
+/**
+ * Select2 Italian translation
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['it'] = {
+        formatNoMatches: function () { return "Nessuna corrispondenza trovata"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Inserisci ancora " + n + " caratter" + (n == 1? "e" : "i"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Inserisci " + n + " caratter" + (n == 1? "e" : "i") + " in meno"; },
+        formatSelectionTooBig: function (limit) { return "Puoi selezionare solo " + limit + " element" + (limit == 1 ? "o" : "i"); },
+        formatLoadMore: function (pageNumber) { return "Caricamento in corso…"; },
+        formatSearching: function () { return "Ricerca…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['it']);
+})(jQuery);

+ 17 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_ja.js

@@ -0,0 +1,17 @@
+/**
+ * Select2 Japanese translation.
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['ja'] = {
+        formatNoMatches: function () { return "該当なし"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "後" + n + "文字入れてください"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "検索文字列が" + n + "文字長すぎます"; },
+        formatSelectionTooBig: function (limit) { return "最多で" + limit + "項目までしか選択できません"; },
+        formatLoadMore: function (pageNumber) { return "読込中・・・"; },
+        formatSearching: function () { return "検索中・・・"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['ja']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_ka.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Georgian (Kartuli) translation.
+ * 
+ * Author: Dimitri Kurashvili dimakura@gmail.com
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['ka'] = {
+        formatNoMatches: function () { return "ვერ მოიძებნა"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "გთხოვთ შეიყვანოთ კიდევ " + n + " სიმბოლო"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "გთხოვთ წაშალოთ " + n + " სიმბოლო"; },
+        formatSelectionTooBig: function (limit) { return "თქვენ შეგიძლიათ მხოლოდ " + limit + " ჩანაწერის მონიშვნა"; },
+        formatLoadMore: function (pageNumber) { return "შედეგის ჩატვირთვა…"; },
+        formatSearching: function () { return "ძებნა…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['ka']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_ko.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Korean translation.
+ * 
+ * @author  Swen Mun <longfinfunnel@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['ko'] = {
+        formatNoMatches: function () { return "결과 없음"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "너무 짧습니다. "+n+"글자 더 입력해주세요."; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "너무 깁니다. "+n+"글자 지워주세요."; },
+        formatSelectionTooBig: function (limit) { return "최대 "+limit+"개까지만 선택하실 수 있습니다."; },
+        formatLoadMore: function (pageNumber) { return "불러오는 중…"; },
+        formatSearching: function () { return "검색 중…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['ko']);
+})(jQuery);

+ 26 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_lt.js

@@ -0,0 +1,26 @@
+/**
+ * Select2 Lithuanian translation.
+ * 
+ * @author  CRONUS Karmalakas <cronus dot karmalakas at gmail dot com>
+ * @author  Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['lt'] = {
+        formatNoMatches: function () { return "Atitikmenų nerasta"; },
+        formatInputTooShort: function (input, min) { return "Įrašykite dar" + character(min - input.length); },
+        formatInputTooLong: function (input, max) { return "Pašalinkite" + character(input.length - max); },
+        formatSelectionTooBig: function (limit) {
+        	return "Jūs galite pasirinkti tik " + limit + " element" + ((limit%100 > 9 && limit%100 < 21) || limit%10 == 0 ? "ų" : limit%10 > 1 ? "us" : "ą");
+        },
+        formatLoadMore: function (pageNumber) { return "Kraunama daugiau rezultatų…"; },
+        formatSearching: function () { return "Ieškoma…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['lt']);
+
+    function character (n) {
+        return " " + n + " simbol" + ((n%100 > 9 && n%100 < 21) || n%10 == 0 ? "ių" : n%10 > 1 ? "ius" : "į");
+    }
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_lv.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Latvian translation.
+ *
+ * @author  Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['lv'] = {
+        formatNoMatches: function () { return "Sakritību nav"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Lūdzu ievadiet vēl " + n + " simbol" + (n == 11 ? "us" : n%10 == 1 ? "u" : "us"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Lūdzu ievadiet par " + n + " simbol" + (n == 11 ? "iem" : n%10 == 1 ? "u" : "iem") + " mazāk"; },
+        formatSelectionTooBig: function (limit) { return "Jūs varat izvēlēties ne vairāk kā " + limit + " element" + (limit == 11 ? "us" : limit%10 == 1 ? "u" : "us"); },
+        formatLoadMore: function (pageNumber) { return "Datu ielāde…"; },
+        formatSearching: function () { return "Meklēšana…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['lv']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_mk.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Macedonian translation.
+ * 
+ * Author: Marko Aleksic <psybaron@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['mk'] = {
+        formatNoMatches: function () { return "Нема пронајдено совпаѓања"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Ве молиме внесете уште " + n + " карактер" + (n == 1 ? "" : "и"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Ве молиме внесете " + n + " помалку карактер" + (n == 1? "" : "и"); },
+        formatSelectionTooBig: function (limit) { return "Можете да изберете само " + limit + " ставк" + (limit == 1 ? "а" : "и"); },
+        formatLoadMore: function (pageNumber) { return "Вчитување резултати…"; },
+        formatSearching: function () { return "Пребарување…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['mk']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_ms.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Malay translation.
+ * 
+ * Author: Kepoweran <kepoweran@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['ms'] = {
+        formatNoMatches: function () { return "Tiada padanan yang ditemui"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Sila masukkan " + n + " aksara lagi"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Sila hapuskan " + n + " aksara"; },
+        formatSelectionTooBig: function (limit) { return "Anda hanya boleh memilih " + limit + " pilihan"; },
+        formatLoadMore: function (pageNumber) { return "Sedang memuatkan keputusan…"; },
+        formatSearching: function () { return "Mencari…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['ms']);
+})(jQuery);

+ 22 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_nb.js

@@ -0,0 +1,22 @@
+/**
+ * Select2 Norwegian Bokmål translation.
+ *
+ * Author: Torgeir Veimo <torgeir.veimo@gmail.com>
+ * Author: Bjørn Johansen <post@bjornjohansen.no>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['nb'] = {
+        formatMatches: function (matches) { if (matches === 1) { return "Ett resultat er tilgjengelig, trykk enter for å velge det."; } return matches + " resultater er tilgjengelig. Bruk piltastene opp og ned for å navigere."; },
+        formatNoMatches: function () { return "Ingen treff"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Vennligst skriv inn " + n + (n>1 ? " flere tegn" : " tegn til"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Vennligst fjern " + n + " tegn"; },
+        formatSelectionTooBig: function (limit) { return "Du kan velge maks " + limit + " elementer"; },
+        formatLoadMore: function (pageNumber) { return "Laster flere resultater …"; },
+        formatSearching: function () { return "Søker …"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['no']);
+})(jQuery);
+

+ 17 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_nl.js

@@ -0,0 +1,17 @@
+/**
+ * Select2 Dutch translation
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['nl'] = {
+        formatNoMatches: function () { return "Geen resultaten gevonden"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Vul nog " + n + " karakter" + (n == 1? "" : "s") + " in"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Haal " + n + " karakter" + (n == 1? "" : "s") + " weg"; },
+        formatSelectionTooBig: function (limit) { return "Maximaal " + limit + " item" + (limit == 1 ? "" : "s") + " toegestaan"; },
+        formatLoadMore: function (pageNumber) { return "Meer resultaten laden…"; },
+        formatSearching: function () { return "Zoeken…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['nl']);
+})(jQuery);

+ 54 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_pl.js

@@ -0,0 +1,54 @@
+/**
+ * Select2 Polish translation.
+ *
+ * @author  Jan Kondratowicz <jan@kondratowicz.pl>
+ * @author  Uriy Efremochkin <efremochkin@uriy.me>
+ * @author  Michał Połtyn <mike@poltyn.com>
+ * @author  Damian Zajkowski <damian.zajkowski@gmail.com>
+ */
+(function($) {
+    "use strict";
+
+    $.fn.select2.locales['pl'] = {
+        formatNoMatches: function() {
+            return "Brak wyników";
+        },
+        formatInputTooShort: function(input, min) {
+            return "Wpisz co najmniej" + character(min - input.length, "znak", "i");
+        },
+        formatInputTooLong: function(input, max) {
+            return "Wpisana fraza jest za długa o" + character(input.length - max, "znak", "i");
+        },
+        formatSelectionTooBig: function(limit) {
+            return "Możesz zaznaczyć najwyżej" + character(limit, "element", "y");
+        },
+        formatLoadMore: function(pageNumber) {
+            return "Ładowanie wyników…";
+        },
+        formatSearching: function() {
+            return "Szukanie…";
+        }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['pl']);
+
+    function character(n, word, pluralSuffix) {
+        //Liczba pojedyncza - brak suffiksu
+        //jeden znak
+        //jeden element
+        var suffix = '';
+        if (n > 1 && n < 5) {
+            //Liczaba mnoga ilość od 2 do 4 - własny suffiks
+            //Dwa znaki, trzy znaki, cztery znaki.
+            //Dwa elementy, trzy elementy, cztery elementy
+            suffix = pluralSuffix;
+        } else if (n == 0 || n >= 5) {
+            //Ilość 0 suffiks ów
+            //Liczaba mnoga w ilości 5 i więcej - suffiks ów (nie poprawny dla wszystkich wyrazów, np. 100 wiadomości)
+            //Zero znaków, Pięć znaków, sześć znaków, siedem znaków, osiem znaków.
+            //Zero elementów Pięć elementów, sześć elementów, siedem elementów, osiem elementów.
+            suffix = 'ów';
+        }
+        return " " + n + " " + word + suffix;
+    }
+})(jQuery);

+ 18 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_pt-BR.js

@@ -0,0 +1,18 @@
+/**
+ * Select2 Brazilian Portuguese translation
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['pt-BR'] = {
+        formatNoMatches: function () { return "Nenhum resultado encontrado"; },
+        formatAjaxError: function () { return "Erro na busca"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Digite " + (min == 1 ? "" : "mais") + " " + n + " caracter" + (n == 1? "" : "es"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " caracter" + (n == 1? "" : "es"); },
+        formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "Carregando mais resultados…"; },
+        formatSearching: function () { return "Buscando…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-BR']);
+})(jQuery);

+ 17 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_pt-PT.js

@@ -0,0 +1,17 @@
+/**
+ * Select2 Portuguese (Portugal) translation
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['pt-PT'] = {
+        formatNoMatches: function () { return "Nenhum resultado encontrado"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduza " + n + " car" + (n == 1 ? "ácter" : "acteres"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " car" + (n == 1 ? "ácter" : "acteres"); },
+        formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "A carregar mais resultados…"; },
+        formatSearching: function () { return "A pesquisar…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-PT']);
+})(jQuery);

+ 17 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_ro.js

@@ -0,0 +1,17 @@
+/**
+ * Select2 Romanian translation.
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['ro'] = {
+        formatNoMatches: function () { return "Nu a fost găsit nimic"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Vă rugăm să introduceți incă " + n + " caracter" + (n == 1 ? "" : "e"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Vă rugăm să introduceți mai puțin de " + n + " caracter" + (n == 1? "" : "e"); },
+        formatSelectionTooBig: function (limit) { return "Aveți voie să selectați cel mult " + limit + " element" + (limit == 1 ? "" : "e"); },
+        formatLoadMore: function (pageNumber) { return "Se încarcă…"; },
+        formatSearching: function () { return "Căutare…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['ro']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_rs.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Serbian translation.
+ *
+ * @author  Limon Monte <limon.monte@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['rs'] = {
+        formatNoMatches: function () { return "Ništa nije pronađeno"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Ukucajte bar još " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Obrišite " + n + " simbol" + (n % 10 == 1 && n % 100 != 11	 ? "" : "a"); },
+        formatSelectionTooBig: function (limit) { return "Možete izabrati samo " + limit + " stavk" + (limit % 10 == 1 && limit % 100 != 11	 ? "u" : (limit % 10 >= 2 && limit % 10 <= 4 && (limit % 100 < 12 || limit % 100 > 14)? "e" : "i")); },
+        formatLoadMore: function (pageNumber) { return "Preuzimanje još rezultata…"; },
+        formatSearching: function () { return "Pretraga…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['rs']);
+})(jQuery);

+ 23 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_ru.js

@@ -0,0 +1,23 @@
+/**
+ * Select2 Russian translation.
+ *
+ * @author  Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['ru'] = {
+        formatNoMatches: function () { return "Совпадений не найдено"; },
+        formatInputTooShort: function (input, min) { return "Пожалуйста, введите еще хотя бы" + character(min - input.length); },
+        formatInputTooLong: function (input, max) { return "Пожалуйста, введите на" + character(input.length - max) + " меньше"; },
+        formatSelectionTooBig: function (limit) { return "Вы можете выбрать не более " + limit + " элемент" + (limit%10 == 1 && limit%100 != 11 ? "а" : "ов"); },
+        formatLoadMore: function (pageNumber) { return "Загрузка данных…"; },
+        formatSearching: function () { return "Поиск…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['ru']);
+
+    function character (n) {
+        return " " + n + " символ" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 20) ? n%10 > 1 ? "a" : "" : "ов");
+    }
+})(jQuery);

+ 50 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_sk.js

@@ -0,0 +1,50 @@
+/**
+ * Select2 Slovak translation.
+ *
+ * Author: David Vallner <david@vallner.net>
+ */
+(function ($) {
+    "use strict";
+    // use text for the numbers 2 through 4
+    var smallNumbers = {
+        2: function(masc) { return (masc ? "dva" : "dve"); },
+        3: function() { return "tri"; },
+        4: function() { return "štyri"; }
+    };
+    $.fn.select2.locales['sk'] = {
+        formatNoMatches: function () { return "Nenašli sa žiadne položky"; },
+        formatInputTooShort: function (input, min) {
+            var n = min - input.length;
+            if (n == 1) {
+                return "Prosím, zadajte ešte jeden znak";
+            } else if (n <= 4) {
+                return "Prosím, zadajte ešte ďalšie "+smallNumbers[n](true)+" znaky";
+            } else {
+                return "Prosím, zadajte ešte ďalších "+n+" znakov";
+            }
+        },
+        formatInputTooLong: function (input, max) {
+            var n = input.length - max;
+            if (n == 1) {
+                return "Prosím, zadajte o jeden znak menej";
+            } else if (n >= 2 && n <= 4) {
+                return "Prosím, zadajte o "+smallNumbers[n](true)+" znaky menej";
+            } else {
+                return "Prosím, zadajte o "+n+" znakov menej";
+            }
+        },
+        formatSelectionTooBig: function (limit) {
+            if (limit == 1) {
+                return "Môžete zvoliť len jednu položku";
+            } else if (limit >= 2 && limit <= 4) {
+                return "Môžete zvoliť najviac "+smallNumbers[limit](false)+" položky";
+            } else {
+                return "Môžete zvoliť najviac "+limit+" položiek";
+            }
+        },
+        formatLoadMore: function (pageNumber) { return "Načítavajú sa ďalšie výsledky…"; },
+        formatSearching: function () { return "Vyhľadávanie…"; }
+    };
+
+	$.extend($.fn.select2.defaults, $.fn.select2.locales['sk']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_sv.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Swedish translation.
+ *
+ * Author: Jens Rantil <jens.rantil@telavox.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['sv'] = {
+        formatNoMatches: function () { return "Inga träffar"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Var god skriv in " + n + (n>1 ? " till tecken" : " tecken till"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Var god sudda ut " + n + " tecken"; },
+        formatSelectionTooBig: function (limit) { return "Du kan max välja " + limit + " element"; },
+        formatLoadMore: function (pageNumber) { return "Laddar fler resultat…"; },
+        formatSearching: function () { return "Söker…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['sv']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_th.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Thai translation.
+ *
+ * Author: Atsawin Chaowanakritsanakul <joke@nakhon.net>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['th'] = {
+        formatNoMatches: function () { return "ไม่พบข้อมูล"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "โปรดพิมพ์เพิ่มอีก " + n + " ตัวอักษร"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "โปรดลบออก " + n + " ตัวอักษร"; },
+        formatSelectionTooBig: function (limit) { return "คุณสามารถเลือกได้ไม่เกิน " + limit + " รายการ"; },
+        formatLoadMore: function (pageNumber) { return "กำลังค้นข้อมูลเพิ่ม…"; },
+        formatSearching: function () { return "กำลังค้นข้อมูล…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['th']);
+})(jQuery);

+ 19 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_tr.js

@@ -0,0 +1,19 @@
+/**
+ * Select2 Turkish translation.
+ * 
+ * Author: Salim KAYABAŞI <salim.kayabasi@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['tr'] = {
+        formatNoMatches: function () { return "Sonuç bulunamadı"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "En az " + n + " karakter daha girmelisiniz"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return n + " karakter azaltmalısınız"; },
+        formatSelectionTooBig: function (limit) { return "Sadece " + limit + " seçim yapabilirsiniz"; },
+        formatLoadMore: function (pageNumber) { return "Daha fazla…"; },
+        formatSearching: function () { return "Aranıyor…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['tr']);
+})(jQuery);

+ 16 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_ug-CN.js

@@ -0,0 +1,16 @@
+/**
+ * Select2 Uyghur translation
+ */
+(function ($) {
+    "use strict";
+    $.fn.select2.locales['ug-CN'] = {
+        formatNoMatches: function () { return "ماس كېلىدىغان ئۇچۇر تېپىلمىدى"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "يەنە " + n + " ھەرپ كىرگۈزۈڭ";},
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "" + n + "ھەرپ ئۆچۈرۈڭ";},
+        formatSelectionTooBig: function (limit) { return "ئەڭ كۆپ بولغاندا" + limit + " تال ئۇچۇر تاللىيالايسىز"; },
+        formatLoadMore: function (pageNumber) { return "ئۇچۇرلار ئوقۇلىۋاتىدۇ…"; },
+        formatSearching: function () { return "ئىزدەۋاتىدۇ…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['ug-CN']);
+})(jQuery);

+ 25 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_uk.js

@@ -0,0 +1,25 @@
+/**
+ * Select2 Ukrainian translation.
+ * 
+ * @author  bigmihail <bigmihail@bigmir.net>
+ * @author  Uriy Efremochkin <efremochkin@uriy.me>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['uk'] = {
+        formatMatches: function (matches) { return character(matches, "результат") + " знайдено, використовуйте клавіші зі стрілками вверх та вниз для навігації."; },
+        formatNoMatches: function () { return "Нічого не знайдено"; },
+        formatInputTooShort: function (input, min) { return "Введіть буль ласка ще " + character(min - input.length, "символ"); },
+        formatInputTooLong: function (input, max) { return "Введіть буль ласка на " + character(input.length - max, "символ") + " менше"; },
+        formatSelectionTooBig: function (limit) { return "Ви можете вибрати лише " + character(limit, "елемент"); },
+        formatLoadMore: function (pageNumber) { return "Завантаження даних…"; },
+        formatSearching: function () { return "Пошук…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['uk']);
+
+    function character (n, word) {
+        return n + " " + word + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "и" : "" : "ів");
+    }
+})(jQuery);

+ 20 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_vi.js

@@ -0,0 +1,20 @@
+/**
+ * Select2 Vietnamese translation.
+ * 
+ * Author: Long Nguyen <olragon@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.fn.select2.locales['vi'] = {
+        formatNoMatches: function () { return "Không tìm thấy kết quả"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Vui lòng nhập nhiều hơn " + n + " ký tự" + (n == 1 ? "" : "s"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Vui lòng nhập ít hơn " + n + " ký tự" + (n == 1? "" : "s"); },
+        formatSelectionTooBig: function (limit) { return "Chỉ có thể chọn được " + limit + " tùy chọn" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "Đang lấy thêm kết quả…"; },
+        formatSearching: function () { return "Đang tìm…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['vi']);
+})(jQuery);
+

+ 16 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_zh-CN.js

@@ -0,0 +1,16 @@
+/**
+ * Select2 Chinese translation
+ */
+(function ($) {
+    "use strict";
+    $.fn.select2.locales['zh-CN'] = {
+        formatNoMatches: function () { return "没有找到匹配项"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "请再输入" + n + "个字符";},
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "请删掉" + n + "个字符";},
+        formatSelectionTooBig: function (limit) { return "你只能选择最多" + limit + "项"; },
+        formatLoadMore: function (pageNumber) { return "加载结果中…"; },
+        formatSearching: function () { return "搜索中…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-CN']);
+})(jQuery);

+ 16 - 0
htdocs/includes/jquery/plugins/select2/select2_locale_zh-TW.js

@@ -0,0 +1,16 @@
+/**
+ * Select2 Traditional Chinese translation
+ */
+(function ($) {
+    "use strict";
+    $.fn.select2.locales['zh-TW'] = {
+        formatNoMatches: function () { return "沒有找到相符的項目"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "請再輸入" + n + "個字元";},
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "請刪掉" + n + "個字元";},
+        formatSelectionTooBig: function (limit) { return "你只能選擇最多" + limit + "項"; },
+        formatLoadMore: function (pageNumber) { return "載入中…"; },
+        formatSearching: function () { return "搜尋中…"; }
+    };
+
+    $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-TW']);
+})(jQuery);

BIN
htdocs/includes/jquery/plugins/select2/select2x2.png


+ 8 - 8
htdocs/main.inc.php

@@ -1015,13 +1015,10 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs
                 //print '<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.'/includes/jquery/plugins/datatables/extras/ColVis/css/ColVisAlt.css'.($ext?'?'.$ext:'').'" />'."\n";
                 print '<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.'/includes/jquery/plugins/datatables/extras/TableTools/css/TableTools.css'.($ext?'?'.$ext:'').'" />'."\n";
             }
-            if ((! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) && $conf->global->MAIN_USE_JQUERY_MULTISELECT == 'multiselect') || (defined('REQUIRE_JQUERY_MULTISELECT') && constant('REQUIRE_JQUERY_MULTISELECT') == 'multiselect'))     // jQuery multiselect
+            if (! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined('REQUIRE_JQUERY_MULTISELECT'))     // jQuery plugin "mutiselect", "multiple-select", "select2"...
             {
-            	print '<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.'/includes/jquery/plugins/multiselect/css/ui.multiselect.css'.($ext?'?'.$ext:'').'" />'."\n";
-            }
-            if ((! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) && $conf->global->MAIN_USE_JQUERY_MULTISELECT == 'multiple-select') || (defined('REQUIRE_JQUERY_MULTISELECT') && constant('REQUIRE_JQUERY_MULTISELECT') == 'multiple-select'))     // jQuery multiple-select
-            {
-            	print '<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.'/includes/jquery/plugins/multiple-select/multiple-select.css'.($ext?'?'.$ext:'').'" />'."\n";
+            	$tmpplugin=empty($conf->global->MAIN_USE_JQUERY_MULTISELECT)?constant('REQUIRE_JQUERY_MULTISELECT'):$conf->global->MAIN_USE_JQUERY_MULTISELECT;
+            	print '<link rel="stylesheet" type="text/css" href="'.DOL_URL_ROOT.'/includes/jquery/plugins/'.$tmpplugin.'/'.$tmpplugin.'.css'.($ext?'?'.$ext:'').'" />'."\n";
             }
             // jQuery Timepicker
             if (! empty($conf->global->MAIN_USE_JQUERY_TIMEPICKER) || defined('REQUIRE_JQUERY_TIMEPICKER'))
@@ -1130,14 +1127,12 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs
             {
                 if (constant('JS_JQUERY_FLOT'))
                 {
-                    print '<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="/javascript/excanvas/excanvas.min.js'.($ext?'?'.$ext:'').'"></script><![endif]-->'."\n";
                     print '<script type="text/javascript" src="'.JS_JQUERY_FLOT.'jquery.flot.js'.($ext?'?'.$ext:'').'"></script>'."\n";
                     print '<script type="text/javascript" src="'.JS_JQUERY_FLOT.'jquery.flot.pie.js'.($ext?'?'.$ext:'').'"></script>'."\n";
                     print '<script type="text/javascript" src="'.JS_JQUERY_FLOT.'jquery.flot.stack.js'.($ext?'?'.$ext:'').'"></script>'."\n";
                 }
                 else
                 {
-                    print '<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="'.DOL_URL_ROOT.'/includes/jquery/plugins/flot/excanvas.min.js'.($ext?'?'.$ext:'').'"></script><![endif]-->'."\n";
                     print '<script type="text/javascript" src="'.DOL_URL_ROOT.'/includes/jquery/plugins/flot/jquery.flot.min.js'.($ext?'?'.$ext:'').'"></script>'."\n";
                     print '<script type="text/javascript" src="'.DOL_URL_ROOT.'/includes/jquery/plugins/flot/jquery.flot.pie.min.js'.($ext?'?'.$ext:'').'"></script>'."\n";
                     print '<script type="text/javascript" src="'.DOL_URL_ROOT.'/includes/jquery/plugins/flot/jquery.flot.stack.min.js'.($ext?'?'.$ext:'').'"></script>'."\n";
@@ -1188,6 +1183,11 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs
             	print '<script type="text/javascript" src="'.DOL_URL_ROOT.'/includes/jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'.($ext?'?'.$ext:'').'"></script>'."\n";
             	print '<script type="text/javascript" src="'.DOL_URL_ROOT.'/core/js/timepicker.js.php?lang='.$langs->defaultlang.($ext?'&amp;'.$ext:'').'"></script>'."\n";
             }
+            if (! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined('REQUIRE_JQUERY_MULTISELECT'))     // jQuery plugin "mutiselect", "multiple-select", "select2"...
+            {
+            	$tmpplugin=empty($conf->global->MAIN_USE_JQUERY_MULTISELECT)?constant('REQUIRE_JQUERY_MULTISELECT'):$conf->global->MAIN_USE_JQUERY_MULTISELECT;
+            	print '<script type="text/javascript" src="'.DOL_URL_ROOT.'/includes/jquery/plugins/'.$tmpplugin.'/'.$tmpplugin.'.js'.($ext?'?'.$ext:'').'" />'."\n";
+            }
             // jQuery jMobile
             if (! empty($conf->global->MAIN_USE_JQUERY_JMOBILE) || defined('REQUIRE_JQUERY_JMOBILE') || (! empty($conf->dol_use_jmobile) && $conf->dol_use_jmobile > 0))
             {

+ 9 - 1
htdocs/public/test/test_forms.php

@@ -1,7 +1,7 @@
 <?php
 //define("NOLOGIN",1);		// This means this output page does not require to be logged.
 define("NOCSRFCHECK",1);	// We accept to go on this page from external web site.
-define('REQUIRE_JQUERY_MULTISELECT','multiple-select');
+define('REQUIRE_JQUERY_MULTISELECT','select2');
 
 require '../../main.inc.php';
 include_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
@@ -55,6 +55,14 @@ $array=array(1=>'Value 1',2=>'Value 2',3=>'Value 3');
 $arrayselected=array(1,3);
 print $form->multiselectarray('testmulti', $array, $arrayselected, '', 0, '', 0, 250);
 
+print '<br><br>'."\n";
+
+// Test5: a select
+print "Test 5: a select<br>\n";
+$array=array(1=>'Value 1',2=>'Value 2',3=>'Value 3');
+$selected=3;
+print $form->selectarray('testselect', $array, $selected, 1, 0, 0, 'style="min-width: 250px;"');
+
 
 llxFooter();
 $db->close();

Some files were not shown because too many files changed in this diff