| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544 | 
							- /*
 
- * MultiSelect v0.9.12
 
- * Copyright (c) 2012 Louis Cuny
 
- *
 
- * This program is free software. It comes without any warranty, to
 
- * the extent permitted by applicable law. You can redistribute it
 
- * and/or modify it under the terms of the Do What The Fuck You Want
 
- * To Public License, Version 2, as published by Sam Hocevar. See
 
- * http://sam.zoy.org/wtfpl/COPYING for more details.
 
- */
 
- !function ($) {
 
-   "use strict";
 
-  /* MULTISELECT CLASS DEFINITION
 
-   * ====================== */
 
-   var MultiSelect = function (element, options) {
 
-     this.options = options;
 
-     this.$element = $(element);
 
-     this.$container = $('<div/>', { 'class': "ms-container" });
 
-     this.$selectableContainer = $('<div/>', { 'class': 'ms-selectable' });
 
-     this.$selectionContainer = $('<div/>', { 'class': 'ms-selection' });
 
-     this.$selectableUl = $('<ul/>', { 'class': "ms-list", 'tabindex' : '-1' });
 
-     this.$selectionUl = $('<ul/>', { 'class': "ms-list", 'tabindex' : '-1' });
 
-     this.scrollTo = 0;
 
-     this.elemsSelector = 'li:visible:not(.ms-optgroup-label,.ms-optgroup-container,.'+options.disabledClass+')';
 
-   };
 
-   MultiSelect.prototype = {
 
-     constructor: MultiSelect,
 
-     init: function(){
 
-       var that = this,
 
-           ms = this.$element;
 
-       if (ms.next('.ms-container').length === 0){
 
-         ms.css({ position: 'absolute', left: '-9999px' });
 
-         ms.attr('id', ms.attr('id') ? ms.attr('id') : Math.ceil(Math.random()*1000)+'multiselect');
 
-         this.$container.attr('id', 'ms-'+ms.attr('id'));
 
-         this.$container.addClass(that.options.cssClass);
 
-         ms.find('option').each(function(){
 
-           that.generateLisFromOption(this);
 
-         });
 
-         this.$selectionUl.find('.ms-optgroup-label').hide();
 
-         if (that.options.selectableHeader){
 
-           that.$selectableContainer.append(that.options.selectableHeader);
 
-         }
 
-         that.$selectableContainer.append(that.$selectableUl);
 
-         if (that.options.selectableFooter){
 
-           that.$selectableContainer.append(that.options.selectableFooter);
 
-         }
 
-         if (that.options.selectionHeader){
 
-           that.$selectionContainer.append(that.options.selectionHeader);
 
-         }
 
-         that.$selectionContainer.append(that.$selectionUl);
 
-         if (that.options.selectionFooter){
 
-           that.$selectionContainer.append(that.options.selectionFooter);
 
-         }
 
-         that.$container.append(that.$selectableContainer);
 
-         that.$container.append(that.$selectionContainer);
 
-         ms.after(that.$container);
 
-         that.activeMouse(that.$selectableUl);
 
-         that.activeKeyboard(that.$selectableUl);
 
-         var action = that.options.dblClick ? 'dblclick' : 'click';
 
-         that.$selectableUl.on(action, '.ms-elem-selectable', function(){
 
-           that.select($(this).data('ms-value'));
 
-         });
 
-         that.$selectionUl.on(action, '.ms-elem-selection', function(){
 
-           that.deselect($(this).data('ms-value'));
 
-         });
 
-         that.activeMouse(that.$selectionUl);
 
-         that.activeKeyboard(that.$selectionUl);
 
-         ms.on('focus', function(){
 
-           that.$selectableUl.focus();
 
-         });
 
-       }
 
-       var selectedValues = ms.find('option:selected').map(function(){ return $(this).val(); }).get();
 
-       that.select(selectedValues, 'init');
 
-       if (typeof that.options.afterInit === 'function') {
 
-         that.options.afterInit.call(this, this.$container);
 
-       }
 
-     },
 
-     'generateLisFromOption' : function(option, index, $container){
 
-       var that = this,
 
-           ms = that.$element,
 
-           attributes = "",
 
-           $option = $(option);
 
-       for (var cpt = 0; cpt < option.attributes.length; cpt++){
 
-         var attr = option.attributes[cpt];
 
-         if(attr.name !== 'value' && attr.name !== 'disabled'){
 
-           attributes += attr.name+'="'+attr.value+'" ';
 
-         }
 
-       }
 
-       var selectableLi = $('<li '+attributes+'><span>'+that.escapeHTML($option.text())+'</span></li>'),
 
-           selectedLi = selectableLi.clone(),
 
-           value = $option.val(),
 
-           elementId = that.sanitize(value);
 
-       selectableLi
 
-         .data('ms-value', value)
 
-         .addClass('ms-elem-selectable')
 
-         .attr('id', elementId+'-selectable');
 
-       selectedLi
 
-         .data('ms-value', value)
 
-         .addClass('ms-elem-selection')
 
-         .attr('id', elementId+'-selection')
 
-         .hide();
 
-       if ($option.prop('disabled') || ms.prop('disabled')){
 
-         selectedLi.addClass(that.options.disabledClass);
 
-         selectableLi.addClass(that.options.disabledClass);
 
-       }
 
-       var $optgroup = $option.parent('optgroup');
 
-       if ($optgroup.length > 0){
 
-         var optgroupLabel = $optgroup.attr('label'),
 
-             optgroupId = that.sanitize(optgroupLabel),
 
-             $selectableOptgroup = that.$selectableUl.find('#optgroup-selectable-'+optgroupId),
 
-             $selectionOptgroup = that.$selectionUl.find('#optgroup-selection-'+optgroupId);
 
-         if ($selectableOptgroup.length === 0){
 
-           var optgroupContainerTpl = '<li class="ms-optgroup-container"></li>',
 
-               optgroupTpl = '<ul class="ms-optgroup"><li class="ms-optgroup-label"><span>'+optgroupLabel+'</span></li></ul>';
 
-           $selectableOptgroup = $(optgroupContainerTpl);
 
-           $selectionOptgroup = $(optgroupContainerTpl);
 
-           $selectableOptgroup.attr('id', 'optgroup-selectable-'+optgroupId);
 
-           $selectionOptgroup.attr('id', 'optgroup-selection-'+optgroupId);
 
-           $selectableOptgroup.append($(optgroupTpl));
 
-           $selectionOptgroup.append($(optgroupTpl));
 
-           if (that.options.selectableOptgroup){
 
-             $selectableOptgroup.find('.ms-optgroup-label').on('click', function(){
 
-               var values = $optgroup.children(':not(:selected, :disabled)').map(function(){ return $(this).val();}).get();
 
-               that.select(values);
 
-             });
 
-             $selectionOptgroup.find('.ms-optgroup-label').on('click', function(){
 
-               var values = $optgroup.children(':selected:not(:disabled)').map(function(){ return $(this).val();}).get();
 
-               that.deselect(values);
 
-             });
 
-           }
 
-           that.$selectableUl.append($selectableOptgroup);
 
-           that.$selectionUl.append($selectionOptgroup);
 
-         }
 
-         index = index === undefined ? $selectableOptgroup.find('ul').children().length : index + 1;
 
-         selectableLi.insertAt(index, $selectableOptgroup.children());
 
-         selectedLi.insertAt(index, $selectionOptgroup.children());
 
-       } else {
 
-         index = index === undefined ? that.$selectableUl.children().length : index;
 
-         selectableLi.insertAt(index, that.$selectableUl);
 
-         selectedLi.insertAt(index, that.$selectionUl);
 
-       }
 
-     },
 
-     'addOption' : function(options){
 
-       var that = this;
 
-       if (options.value !== undefined && options.value !== null){
 
-         options = [options];
 
-       } 
 
-       $.each(options, function(index, option){
 
-         if (option.value !== undefined && option.value !== null &&
 
-             that.$element.find("option[value='"+option.value+"']").length === 0){
 
-           var $option = $('<option value="'+option.value+'">'+option.text+'</option>'),
 
-               $container = option.nested === undefined ? that.$element : $("optgroup[label='"+option.nested+"']"),
 
-               index = parseInt((typeof option.index === 'undefined' ? $container.children().length : option.index));
 
-           if (option.optionClass) {
 
-             $option.addClass(option.optionClass);
 
-           }
 
-           if (option.disabled) {
 
-             $option.prop('disabled', true);
 
-           }
 
-           $option.insertAt(index, $container);
 
-           that.generateLisFromOption($option.get(0), index, option.nested);
 
-         }
 
-       });
 
-     },
 
-     'escapeHTML' : function(text){
 
-       return $("<div>").text(text).html();
 
-     },
 
-     'activeKeyboard' : function($list){
 
-       var that = this;
 
-       $list.on('focus', function(){
 
-         $(this).addClass('ms-focus');
 
-       })
 
-       .on('blur', function(){
 
-         $(this).removeClass('ms-focus');
 
-       })
 
-       .on('keydown', function(e){
 
-         switch (e.which) {
 
-           case 40:
 
-           case 38:
 
-             e.preventDefault();
 
-             e.stopPropagation();
 
-             that.moveHighlight($(this), (e.which === 38) ? -1 : 1);
 
-             return;
 
-           case 37:
 
-           case 39:
 
-             e.preventDefault();
 
-             e.stopPropagation();
 
-             that.switchList($list);
 
-             return;
 
-           case 9:
 
-             if(that.$element.is('[tabindex]')){
 
-               e.preventDefault();
 
-               var tabindex = parseInt(that.$element.attr('tabindex'), 10);
 
-               tabindex = (e.shiftKey) ? tabindex-1 : tabindex+1;
 
-               $('[tabindex="'+(tabindex)+'"]').focus();
 
-               return;
 
-             }else{
 
-               if(e.shiftKey){
 
-                 that.$element.trigger('focus');
 
-               }
 
-             }
 
-         }
 
-         if($.inArray(e.which, that.options.keySelect) > -1){
 
-           e.preventDefault();
 
-           e.stopPropagation();
 
-           that.selectHighlighted($list);
 
-           return;
 
-         }
 
-       });
 
-     },
 
-     'moveHighlight': function($list, direction){
 
-       var $elems = $list.find(this.elemsSelector),
 
-           $currElem = $elems.filter('.ms-hover'),
 
-           $nextElem = null,
 
-           elemHeight = $elems.first().outerHeight(),
 
-           containerHeight = $list.height(),
 
-           containerSelector = '#'+this.$container.prop('id');
 
-       $elems.removeClass('ms-hover');
 
-       if (direction === 1){ // DOWN
 
-         $nextElem = $currElem.nextAll(this.elemsSelector).first();
 
-         if ($nextElem.length === 0){
 
-           var $optgroupUl = $currElem.parent();
 
-           if ($optgroupUl.hasClass('ms-optgroup')){
 
-             var $optgroupLi = $optgroupUl.parent(),
 
-                 $nextOptgroupLi = $optgroupLi.next(':visible');
 
-             if ($nextOptgroupLi.length > 0){
 
-               $nextElem = $nextOptgroupLi.find(this.elemsSelector).first();
 
-             } else {
 
-               $nextElem = $elems.first();
 
-             }
 
-           } else {
 
-             $nextElem = $elems.first();
 
-           }
 
-         }
 
-       } else if (direction === -1){ // UP
 
-         $nextElem = $currElem.prevAll(this.elemsSelector).first();
 
-         if ($nextElem.length === 0){
 
-           var $optgroupUl = $currElem.parent();
 
-           if ($optgroupUl.hasClass('ms-optgroup')){
 
-             var $optgroupLi = $optgroupUl.parent(),
 
-                 $prevOptgroupLi = $optgroupLi.prev(':visible');
 
-             if ($prevOptgroupLi.length > 0){
 
-               $nextElem = $prevOptgroupLi.find(this.elemsSelector).last();
 
-             } else {
 
-               $nextElem = $elems.last();
 
-             }
 
-           } else {
 
-             $nextElem = $elems.last();
 
-           }
 
-         }
 
-       }
 
-       if ($nextElem.length > 0){
 
-         $nextElem.addClass('ms-hover');
 
-         var scrollTo = $list.scrollTop() + $nextElem.position().top - 
 
-                        containerHeight / 2 + elemHeight / 2;
 
-         $list.scrollTop(scrollTo);
 
-       }
 
-     },
 
-     'selectHighlighted' : function($list){
 
-       var $elems = $list.find(this.elemsSelector),
 
-           $highlightedElem = $elems.filter('.ms-hover').first();
 
-       if ($highlightedElem.length > 0){
 
-         if ($list.parent().hasClass('ms-selectable')){
 
-           this.select($highlightedElem.data('ms-value'));
 
-         } else {
 
-           this.deselect($highlightedElem.data('ms-value'));
 
-         }
 
-         $elems.removeClass('ms-hover');
 
-       }
 
-     },
 
-     'switchList' : function($list){
 
-       $list.blur();
 
-       this.$container.find(this.elemsSelector).removeClass('ms-hover');
 
-       if ($list.parent().hasClass('ms-selectable')){
 
-         this.$selectionUl.focus();
 
-       } else {
 
-         this.$selectableUl.focus();
 
-       }
 
-     },
 
-     'activeMouse' : function($list){
 
-       var that = this;
 
-       this.$container.on('mouseenter', that.elemsSelector, function(){
 
-         $(this).parents('.ms-container').find(that.elemsSelector).removeClass('ms-hover');
 
-         $(this).addClass('ms-hover');
 
-       });
 
-       this.$container.on('mouseleave', that.elemsSelector, function () {
 
-         $(this).parents('.ms-container').find(that.elemsSelector).removeClass('ms-hover');
 
-       });
 
-     },
 
-     'refresh' : function() {
 
-       this.destroy();
 
-       this.$element.multiSelect(this.options);
 
-     },
 
-     'destroy' : function(){
 
-       $("#ms-"+this.$element.attr("id")).remove();
 
-       this.$element.off('focus');
 
-       this.$element.css('position', '').css('left', '');
 
-       this.$element.removeData('multiselect');
 
-     },
 
-     'select' : function(value, method){
 
-       if (typeof value === 'string'){ value = [value]; }
 
-       var that = this,
 
-           ms = this.$element,
 
-           msIds = $.map(value, function(val){ return(that.sanitize(val)); }),
 
-           selectables = this.$selectableUl.find('#' + msIds.join('-selectable, #')+'-selectable').filter(':not(.'+that.options.disabledClass+')'),
 
-           selections = this.$selectionUl.find('#' + msIds.join('-selection, #') + '-selection').filter(':not(.'+that.options.disabledClass+')'),
 
-           options = ms.find('option:not(:disabled)').filter(function(){ return($.inArray(this.value, value) > -1); });
 
-       if (method === 'init'){
 
-         selectables = this.$selectableUl.find('#' + msIds.join('-selectable, #')+'-selectable'),
 
-         selections = this.$selectionUl.find('#' + msIds.join('-selection, #') + '-selection');
 
-       }
 
-       if (selectables.length > 0){
 
-         selectables.addClass('ms-selected').hide();
 
-         selections.addClass('ms-selected').show();
 
-         options.prop('selected', true);
 
-         that.$container.find(that.elemsSelector).removeClass('ms-hover');
 
-         var selectableOptgroups = that.$selectableUl.children('.ms-optgroup-container');
 
-         if (selectableOptgroups.length > 0){
 
-           selectableOptgroups.each(function(){
 
-             var selectablesLi = $(this).find('.ms-elem-selectable');
 
-             if (selectablesLi.length === selectablesLi.filter('.ms-selected').length){
 
-               $(this).find('.ms-optgroup-label').hide();
 
-             }
 
-           });
 
-           var selectionOptgroups = that.$selectionUl.children('.ms-optgroup-container');
 
-           selectionOptgroups.each(function(){
 
-             var selectionsLi = $(this).find('.ms-elem-selection');
 
-             if (selectionsLi.filter('.ms-selected').length > 0){
 
-               $(this).find('.ms-optgroup-label').show();
 
-             }
 
-           });
 
-         } else {
 
-           if (that.options.keepOrder && method !== 'init'){
 
-             var selectionLiLast = that.$selectionUl.find('.ms-selected');
 
-             if((selectionLiLast.length > 1) && (selectionLiLast.last().get(0) != selections.get(0))) {
 
-               selections.insertAfter(selectionLiLast.last());
 
-             }
 
-           }
 
-         }
 
-         if (method !== 'init'){
 
-           ms.trigger('change');
 
-           if (typeof that.options.afterSelect === 'function') {
 
-             that.options.afterSelect.call(this, value);
 
-           }
 
-         }
 
-       }
 
-     },
 
-     'deselect' : function(value){
 
-       if (typeof value === 'string'){ value = [value]; }
 
-       var that = this,
 
-           ms = this.$element,
 
-           msIds = $.map(value, function(val){ return(that.sanitize(val)); }),
 
-           selectables = this.$selectableUl.find('#' + msIds.join('-selectable, #')+'-selectable'),
 
-           selections = this.$selectionUl.find('#' + msIds.join('-selection, #')+'-selection').filter('.ms-selected').filter(':not(.'+that.options.disabledClass+')'),
 
-           options = ms.find('option').filter(function(){ return($.inArray(this.value, value) > -1); });
 
-       if (selections.length > 0){
 
-         selectables.removeClass('ms-selected').show();
 
-         selections.removeClass('ms-selected').hide();
 
-         options.prop('selected', false);
 
-         that.$container.find(that.elemsSelector).removeClass('ms-hover');
 
-         var selectableOptgroups = that.$selectableUl.children('.ms-optgroup-container');
 
-         if (selectableOptgroups.length > 0){
 
-           selectableOptgroups.each(function(){
 
-             var selectablesLi = $(this).find('.ms-elem-selectable');
 
-             if (selectablesLi.filter(':not(.ms-selected)').length > 0){
 
-               $(this).find('.ms-optgroup-label').show();
 
-             }
 
-           });
 
-           var selectionOptgroups = that.$selectionUl.children('.ms-optgroup-container');
 
-           selectionOptgroups.each(function(){
 
-             var selectionsLi = $(this).find('.ms-elem-selection');
 
-             if (selectionsLi.filter('.ms-selected').length === 0){
 
-               $(this).find('.ms-optgroup-label').hide();
 
-             }
 
-           });
 
-         }
 
-         ms.trigger('change');
 
-         if (typeof that.options.afterDeselect === 'function') {
 
-           that.options.afterDeselect.call(this, value);
 
-         }
 
-       }
 
-     },
 
-     'select_all' : function(){
 
-       var ms = this.$element,
 
-           values = ms.val();
 
-       ms.find('option:not(":disabled")').prop('selected', true);
 
-       this.$selectableUl.find('.ms-elem-selectable').filter(':not(.'+this.options.disabledClass+')').addClass('ms-selected').hide();
 
-       this.$selectionUl.find('.ms-optgroup-label').show();
 
-       this.$selectableUl.find('.ms-optgroup-label').hide();
 
-       this.$selectionUl.find('.ms-elem-selection').filter(':not(.'+this.options.disabledClass+')').addClass('ms-selected').show();
 
-       this.$selectionUl.focus();
 
-       ms.trigger('change');
 
-       if (typeof this.options.afterSelect === 'function') {
 
-         var selectedValues = $.grep(ms.val(), function(item){
 
-           return $.inArray(item, values) < 0;
 
-         });
 
-         this.options.afterSelect.call(this, selectedValues);
 
-       }
 
-     },
 
-     'deselect_all' : function(){
 
-       var ms = this.$element,
 
-           values = ms.val();
 
-       ms.find('option').prop('selected', false);
 
-       this.$selectableUl.find('.ms-elem-selectable').removeClass('ms-selected').show();
 
-       this.$selectionUl.find('.ms-optgroup-label').hide();
 
-       this.$selectableUl.find('.ms-optgroup-label').show();
 
-       this.$selectionUl.find('.ms-elem-selection').removeClass('ms-selected').hide();
 
-       this.$selectableUl.focus();
 
-       ms.trigger('change');
 
-       if (typeof this.options.afterDeselect === 'function') {
 
-         this.options.afterDeselect.call(this, values);
 
-       }
 
-     },
 
-     sanitize: function(value){
 
-       var hash = 0, i, character;
 
-       if (value.length == 0) return hash;
 
-       var ls = 0;
 
-       for (i = 0, ls = value.length; i < ls; i++) {
 
-         character  = value.charCodeAt(i);
 
-         hash  = ((hash<<5)-hash)+character;
 
-         hash |= 0; // Convert to 32bit integer
 
-       }
 
-       return hash;
 
-     }
 
-   };
 
-   /* MULTISELECT PLUGIN DEFINITION
 
-    * ======================= */
 
-   $.fn.multiSelect = function () {
 
-     var option = arguments[0],
 
-         args = arguments;
 
-     return this.each(function () {
 
-       var $this = $(this),
 
-           data = $this.data('multiselect'),
 
-           options = $.extend({}, $.fn.multiSelect.defaults, $this.data(), typeof option === 'object' && option);
 
-       if (!data){ $this.data('multiselect', (data = new MultiSelect(this, options))); }
 
-       if (typeof option === 'string'){
 
-         data[option](args[1]);
 
-       } else {
 
-         data.init();
 
-       }
 
-     });
 
-   };
 
-   $.fn.multiSelect.defaults = {
 
-     keySelect: [32],
 
-     selectableOptgroup: false,
 
-     disabledClass : 'disabled',
 
-     dblClick : false,
 
-     keepOrder: false,
 
-     cssClass: ''
 
-   };
 
-   $.fn.multiSelect.Constructor = MultiSelect;
 
-   $.fn.insertAt = function(index, $parent) {
 
-     return this.each(function() {
 
-       if (index === 0) {
 
-         $parent.prepend(this);
 
-       } else {
 
-         $parent.children().eq(index - 1).after(this);
 
-       }
 
-     });
 
- };
 
- }(window.jQuery);
 
 
  |