Blame | Letzte Änderung | Log anzeigen | RSS feed
/*** toChecklist plugin (works with jQuery 1.4.x)* @author Scott Horlbeck <me@scotthorlbeck.com>* @url http://www.scotthorlbeck.com/code/tochecklist/* @version 1.4.3** See full version or enclosed license for license information.*/(function($){jQuery.fn.toChecklist=function(o){var updateChecklist=function(action,checklistElem){var showSelectedItemsSetting;var disableDynamicList=function(checklistLength){if(checklistLength>3){showSelectedItemsSetting=$(checklistElem).attr('showSelectedItems');$(checklistElem).attr('showSelectedItems','false');}};var enableDynamicList=function(){$(checklistElem).attr('showSelectedItems',showSelectedItemsSetting);};switch(action){case'clearAll':var selector='li:has(input:checked)';break;case'checkAll':var selector='li:has(input:not(:checked,:disabled))';break;case'invert':var selector='li:has(input)';break;default:alert("toChecklist Plugin says:\n\nWarning - Invalid action requested on checklist.\nThe action requested was: "+action);break;}var checklistLength=$(selector,checklistElem).length;disableDynamicList(checklistLength);$(selector,checklistElem).each(function(i){if(i==checklistLength-2&&checklistLength>3)enableDynamicList();$(this).trigger('click');});};if(typeof o=='string'){this.each(function(){if(!$(this).isChecklist())return true;updateChecklist(o,this);});return $;}o=jQuery.extend({"addScrollBar":true,"addSearchBox":false,"searchBoxText":'Type here to search list...',"showCheckboxes":true,"showSelectedItems":false,"submitDataAsArray":true,"preferIdOverName":true,"maxNumOfSelections":-1,"onMaxNumExceeded":function(){alert('You cannot select more than '+this.maxNumOfSelections+' items in this list.');},"cssChecklist":'checklist',"cssChecklistHighlighted":'checklistHighlighted',"cssLeaveRoomForCheckbox":'leaveRoomForCheckbox',"cssEven":'even',"cssOdd":'odd',"cssChecked":'checked',"cssDisabled":'disabled',"cssShowSelectedItems":'showSelectedItems',"cssFocused":'focused',"cssFindInList":'findInList',"cssBlurred":'blurred',"cssOptgroup":'optgroup'},o);var error=function(msg){alert("jQuery Plugin Error (Plugin: toChecklist)\n\n"+msg);};var overflowProperty=(o.addScrollBar)?'overflow-y: auto; overflow-x: hidden;':'';var leaveRoomForCheckbox=(o.showCheckboxes)?'padding-left: 25px':'padding-left: 3px';this.each(function(){var numOfCheckedBoxesSoFar=0;var jSelectElem=$(this);varjSelectElemId=jSelectElem.attr('id');var jSelectElemName=jSelectElem.attr('name');if(jSelectElemId==''||!o.preferIdOverName){jSelectElemId=jSelectElemName.replace(/\[|\]/g,'');if(jSelectElemId==''){error('Can\'t convert element to checklist.\nYour SELECT element must'+' have a "name" attribute and/or an "id" attribute specified.');return $;}}var h=jSelectElem.outerHeight();var w=jSelectElem.outerWidth();w-=4;if(this.type!='select-multiple'&&this.type!='select-one'){error("Can't convert element to checklist.\n"+"Expecting SELECT element with \"multiple\" attribute.");return $;}else if(this.type=='select-one'){return $;}var convertListItemsToCheckboxes=function(){var checkboxValue=$(this).attr('value');if(checkboxValue==''){checkboxValue=this.innerHTML;}checkboxValue=checkboxValue.replace(/ /g,'_');var checkboxId=jSelectElemId+'_'+checkboxValue;checkboxId=checkboxId.replace(/(\.|\/|\,|\%|\<|\>)/g,'\\$1');var labelText=$(this).attr('innerHTML');var selected='';if($(this).attr('disabled')){var disabled=' disabled="disabled"';var disabledClass=' class="disabled"';}else{var disabled='';var disabledClass='';var selected='';if($(this).attr('selected')){if(o.maxNumOfSelections!=-1&&numOfCheckedBoxesSoFar<o.maxNumOfSelections){selected+='checked="checked"';numOfCheckedBoxesSoFar++;}else if(o.maxNumOfSelections==-1){selected+='checked="checked"';}}}var arrayBrackets=(o.submitDataAsArray)?'[]':'';var checkboxName=(o.preferIdOverName)?jSelectElemId+arrayBrackets:jSelectElemName+arrayBrackets;$(this).replaceWith('<li tabindex="0"><input type="checkbox" value="'+checkboxValue+'" name="'+(o.preferIdOverName?jSelectElemId:jSelectElemName)+arrayBrackets+'" id="'+checkboxId+'" '+selected+disabled+' /><label for="'+checkboxId+'"'+disabledClass+'>'+labelText+'</label></li>');if(o.showCheckboxes===false){$('#'+checkboxId).css('position','absolute').css('left','-50000px');}else{$('label[for='+checkboxId+']').addClass(o.cssLeaveRoomForCheckbox);}};$('optgroup',jSelectElem).each(function(){$('option',this).each(convertListItemsToCheckboxes);$(this).replaceWith('<li class="'+o.cssOptgroup+'">'+$(this).attr('label')+'</li>'+$(this).html());});$('option',jSelectElem).each(convertListItemsToCheckboxes);$('li:first',jSelectElem).each(function(){if($(this).hasClass('optgroup'))$(this).css('border-top','none');});var checklistId=jSelectElemId+'_'+'checklist';jSelectElem.replaceWith('<div id="'+jSelectElemId+'"><div id="'+checklistId+'">'+'<ul>'+jSelectElem.attr('innerHTML')+'</ul></div></div>');var checklistDivId='#'+checklistId;$('#'+jSelectElemId).attr('showSelectedItems',o.showSelectedItems.toString());$(checklistDivId).css('position','relative');var findInListDivHeight=0;if(o.addSearchBox){var focusSearchBox=function(){this.value="";$(this).removeClass(o.cssBlurred);};var blurSearchBox=function(){this.value=this.defaultValue;$(this).addClass(o.cssBlurred);};$(checklistDivId).before('<div class="findInList" id="'+jSelectElemId+'_findInListDiv">'+'<input type="text" value="'+o.searchBoxText+'" id="'+jSelectElemId+'_findInList" class="'+o.cssBlurred+'" /></div>');$('#'+jSelectElemId+'_findInList').css('width',w);$('#'+jSelectElemId+'_findInList').bind('focus.focusSearchBox',focusSearchBox).bind('blur.blurSearchBox',blurSearchBox).keyup(function(event){var textbox=this;if(this.value==''){$(checklistDivId).attr('scrollTop',0);$(this).unbind('keydown.tabToFocus');return false;}$('label',checklistDivId).each(function(){if(!$(this).is(':disabled')){var curItem=$(this).html().toLowerCase();var typedText=textbox.value.toLowerCase();if(curItem.indexOf(typedText)==0){var curLabelObj=this;var scrollValue=this.parentNode.offsetTop;$(checklistDivId).attr('scrollTop',scrollValue);$(textbox).unbind('blur.blurSearchBox').unbind('keydown.tabToFocus').bind('keydown.tabToFocus',function(event){if(event.keyCode==9){event.preventDefault();$(curLabelObj.parentNode).bind('blur.restoreDefaultText',function(){var defaultVal=$(textbox).attr('defaultValue');$(textbox).attr('value',defaultVal).addClass(o.cssBlurred).bind('blur.blurSearchBox',blurSearchBox);$(this).unbind('blur.restoreDefaultText');}).bind('keydown.tabBack',function(event){if(event.keyCode==9&&event.shiftKey){event.preventDefault();$(textbox).unbind('focus.focusSearchBox').removeClass(o.cssBlurred).bind('focus.focusSearchBox',focusSearchBox).bind('blur.blurSearchBox',blurSearchBox).focus();$(this).unbind('keydown.tabBack');}}).focus();$(this).unbind('keydown.tabToFocus');}});return false;}}});return;});findInListDivHeight=$('#'+jSelectElemId+'_findInListDiv').height()+3;}$(checklistDivId).addClass(o.cssChecklist);if(o.addScrollBar){$(checklistDivId).height(h-findInListDivHeight).width(w);}else{$(checklistDivId).height('100%').width(w);}$('ul',checklistDivId).addClass(o.cssChecklist);$('li:even',checklistDivId).addClass(o.cssEven);$('li:odd',checklistDivId).addClass(o.cssOdd);$('li',checklistDivId).focus(function(){$(this).addClass(o.cssFocused);}).blur(function(event){$(this).removeClass(o.cssFocused);});$('li',checklistDivId).each(function(){if($('input',this).attr('checked')){$(this).addClass(o.cssChecked);}});var toggleDivGlow=function(){if($('li',checklistDivId).hasClass(o.cssChecked)){$(checklistDivId).addClass(o.cssChecklistHighlighted);}else{$(checklistDivId).removeClass(o.cssChecklistHighlighted);}};var moveToNextLi=function(){if($(this).attr('tagName')!='LI')return;if($(this).is('li:has(input)'))$(this).focus();else$(this).next().each(moveToNextLi);};var check=function(event){if(event.type=='keydown'){if(event.keyCode==32||event.keyCode==13)event.preventDefault();if(event.keyCode==9&&!event.shiftKey){event.preventDefault();$(this).unbind('keydown.tabBack').blur().next().each(moveToNextLi);}else if(event.keyCode==9&&event.shiftKey){}if(event.keyCode!=32)return;}var numOfItemsChecked=$('input:checked',checklistDivId).length;if(o.maxNumOfSelections!=-1&&numOfItemsChecked>=o.maxNumOfSelections&&!$('input',this).attr('checked')){o.onMaxNumExceeded();event.preventDefault();return;}$('label',this).unbind();if(event.target.tagName!='INPUT'&&event.target.tagName!='LABEL'){$('input',this).trigger('click');}var checkbox=$('input',this).get(0);updateLIStyleToMatchCheckedStatus(checkbox);if($('#'+jSelectElemId).attr('showSelectedItems')==='true')showSelectedItems();};var updateLIStyleToMatchCheckedStatus=function(checkbox){if(checkbox.checked){$(checkbox).parent().addClass(o.cssChecked);}else{$(checkbox).parent().removeClass(o.cssChecked);}toggleDivGlow();};var handFocusToLI=function(){$(this).parent().focus();};$('li:has(input)',checklistDivId).click(check).keydown(check);$('label',checklistDivId).focus(handFocusToLI);$('input',checklistDivId).focus(handFocusToLI);toggleDivGlow();var fixFormElems=function(event){$('input',this).each(function(){this.checked=this.defaultChecked;updateLIStyleToMatchCheckedStatus(this);if(o.showSelectedItems)showSelectedItems();}).parent();};$('form:has(div.'+o.cssChecklist+')').bind('reset.fixFormElems',fixFormElems);var selectedItemsListId='#'+jSelectElemId+'_selectedItems';if(o.showSelectedItems){$(selectedItemsListId).addClass(o.cssShowSelectedItems);}var showSelectedItems=function(){$(selectedItemsListId).html('');$('label',checklistDivId).each(function(){var vcontext=$(this).parent();if($(this).parent().hasClass(o.cssChecked)){var labelText=jQuery.trim(this.innerHTML);$('<li class="">'+labelText+'</li>').bind('click.remove',function(){vcontext.trigger('click');}).appendTo(selectedItemsListId);}});};if(o.showSelectedItems)showSelectedItems();});};jQuery.fn.isChecklist=function(){var isChecklist=false;this.each(function(){var divContainsChecklist=$('#'+this.id+'_checklist',this).get();isChecklist=(this.tagName=='DIV'&&divContainsChecklist);return false;});return(isChecklist)?true:false;};})(jQuery);