multiselect.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. (function( $ ){
  2. var multiSelectId=-1;
  3. $.fn.multiSelect=function(options){
  4. multiSelectId++;
  5. var settings = {
  6. 'createCallback':false,
  7. 'createText':false,
  8. 'title':this.attr('title'),
  9. 'checked':[],
  10. 'oncheck':false,
  11. 'onuncheck':false,
  12. 'minWidth': 'default;',
  13. };
  14. $.extend(settings,options);
  15. $.each(this.children(),function(i,option){
  16. if($(option).attr('selected') && settings.checked.indexOf($(option).val())==-1){
  17. settings.checked.push($(option).val());
  18. }
  19. });
  20. var button=$('<div class="multiselect button"><span>'+settings.title+'</span><span>▾</span></div>');
  21. var span=$('<span/>');
  22. span.append(button);
  23. button.data('id',multiSelectId);
  24. button.selectedItems=[];
  25. this.hide();
  26. this.before(span);
  27. if(settings.minWidth=='default'){
  28. settings.minWidth=button.width();
  29. }
  30. button.css('min-width',settings.minWidth);
  31. settings.minOuterWidth=button.outerWidth()-2;
  32. button.data('settings',settings);
  33. if(settings.checked.length>0){
  34. button.children('span').first().text(settings.checked.join(', '));
  35. }
  36. button.click(function(event){
  37. var button=$(this);
  38. if(button.parent().children('ul').length>0){
  39. button.parent().children('ul').slideUp(400,function(){
  40. button.parent().children('ul').remove();
  41. button.removeClass('active');
  42. });
  43. return;
  44. }
  45. var lists=$('ul.multiselectoptions');
  46. lists.slideUp(400,function(){
  47. lists.remove();
  48. $('div.multiselect').removeClass('active');
  49. button.addClass('active');
  50. });
  51. button.addClass('active');
  52. event.stopPropagation();
  53. var options=$(this).parent().next().children();
  54. var list=$('<ul class="multiselectoptions"/>').hide().appendTo($(this).parent());
  55. function createItem(element,checked){
  56. element=$(element);
  57. var item=element.val();
  58. var id='ms'+multiSelectId+'-option-'+item;
  59. var input=$('<input type="checkbox"/>');
  60. input.attr('id',id);
  61. var label=$('<label/>');
  62. label.attr('for',id);
  63. label.text(item);
  64. if(settings.checked.indexOf(item)!=-1 || checked){
  65. input.attr('checked',true);
  66. }
  67. if(checked){
  68. settings.checked.push(item);
  69. }
  70. input.change(function(){
  71. var groupname=$(this).next().text();
  72. if($(this).is(':checked')){
  73. element.attr('selected','selected');
  74. if(settings.oncheck){
  75. if(settings.oncheck(groupname)===false){
  76. $(this).attr('checked', false);
  77. return;
  78. }
  79. }
  80. settings.checked.push(groupname);
  81. }else{
  82. var index=settings.checked.indexOf(groupname);
  83. element.attr('selected',null);
  84. if(settings.onuncheck){
  85. if(settings.onuncheck(groupname)===false){
  86. $(this).attr('checked',true);
  87. return;
  88. }
  89. }
  90. settings.checked.splice(index,1);
  91. }
  92. var oldWidth=button.width();
  93. if(settings.checked.length>0){
  94. button.children('span').first().text(settings.checked.join(', '));
  95. }else{
  96. button.children('span').first().text(settings.title);
  97. }
  98. var newOuterWidth=Math.max((button.outerWidth()-2),settings.minOuterWidth)+'px';
  99. var newWidth=Math.max(button.width(),settings.minWidth);
  100. var pos=button.position();
  101. button.css('height',button.height());
  102. button.css('white-space','nowrap');
  103. button.css('width',oldWidth);
  104. button.animate({'width':newWidth},undefined,undefined,function(){
  105. button.css('width','');
  106. });
  107. list.animate({'width':newOuterWidth,'left':pos.left+3});
  108. });
  109. var li=$('<li></li>');
  110. li.append(input).append(label);
  111. return li;
  112. }
  113. $.each(options,function(index,item){
  114. list.append(createItem(item));
  115. });
  116. button.parent().data('preventHide',false);
  117. if(settings.createText){
  118. var li=$('<li>+ <em>'+settings.createText+'<em></li>');
  119. li.click(function(event){
  120. li.empty();
  121. var input=$('<input class="new">');
  122. li.append(input);
  123. input.focus();
  124. input.css('width',button.width());
  125. button.parent().data('preventHide',true);
  126. input.keypress(function(event) {
  127. if(event.keyCode == 13) {
  128. event.preventDefault();
  129. event.stopPropagation();
  130. var value = $(this).val();
  131. var exists = false;
  132. $.each(options,function(index, item) {
  133. if ($(item).val() == value) {
  134. exists = true;
  135. return false;
  136. }
  137. });
  138. if (exists) {
  139. return false;
  140. }
  141. var li=$(this).parent();
  142. $(this).remove();
  143. li.text('+ '+settings.createText);
  144. li.before(createItem(this));
  145. var select=button.parent().next();
  146. var option=$('<option selected="selected"/>');
  147. option.attr('value',value);
  148. option.text($(this).val());
  149. select.append(option);
  150. li.prev().children('input').trigger('click');
  151. button.parent().data('preventHide',false);
  152. if(settings.createCallback){
  153. settings.createCallback($(this).val());
  154. }
  155. }
  156. });
  157. input.blur(function(){
  158. event.preventDefault();
  159. event.stopPropagation();
  160. $(this).remove();
  161. li.text('+ '+settings.createText);
  162. setTimeout(function(){
  163. button.parent().data('preventHide',false);
  164. },100);
  165. });
  166. });
  167. list.append(li);
  168. }
  169. var pos=button.position();
  170. list.css('top',pos.top+button.outerHeight()-5);
  171. list.css('left',pos.left+3);
  172. list.css('width',(button.outerWidth()-2)+'px');
  173. list.slideDown();
  174. list.click(function(event){
  175. event.stopPropagation();
  176. });
  177. });
  178. $(window).click(function(){
  179. if(!button.parent().data('preventHide')){
  180. button.parent().children('ul').slideUp(400,function(){
  181. button.parent().children('ul').remove();
  182. button.removeClass('active');
  183. });
  184. }
  185. });
  186. return span;
  187. };
  188. })( jQuery );