var CheckedListBox = new Class({
Implements: [Options],
options: {
replaceOriginal: false
},
initialize: function(input, opt)
{
// we need select element with mutliple enabled
if(input.get("tag") == "select" && $chk(input.get("multiple")) )
{
this.setOptions(opt);
var aliasOptions = $A(input.options).map(function(el){
var chb = new Element("input", {
type: "checkbox",
checked: el.selected
});
if(this.options.replaceOriginal)
{
chb.setProperties({
value: el.value,
name: input.name
}).addEvent("change", function(){
this.checked ? this.getParent("label").addClass("cidsi-checked") : this.getParent("label").removeClass("cidsi-checked");
});
}else{
chb.addEvent("change", function(){
el.selected = this.checked;
this.checked ? this.getParent("label").addClass("cidsi-checked") : this.getParent("label").removeClass("cidsi-checked");
});
}
return new Element("li").adopt( new Element("label", {
title: el.text,
text: el.text
}).addClass(chb.getProperty("checked")?"cidsi-checked":"").grab(chb, "top") );
}.bind(this));
this.alias = new Element("ul", {
"class": "cidsi",
styles: $merge(input.getStyles("width", "height", "float", "margin", "padding"), {
"overflow": "auto",
"list-style": "none"
})
}).adopt(aliasOptions);
if(this.options.replaceOriginal)
{
this.alias.set("id", input.id).replaces(input);
}
else
{
this.alias.set("id", input.id+"_cidsi").inject(input, "after");
input.addEvent("change", function(){
this.getElements("option").each(function(el){
aliasOptions[el.index].getElement("input").checked = el.selected;
})
})
input.setStyles({
position: "absolute",
left: -99999,
opacity: 0.001
}).set("tabindex", -1);
}
// fix ugly ie behaviour with checkboxes and change event
// read http://www.quirksmode.org/dom/events/change.html
if(Browser.Engine.trident){
this.alias.getElements("label, input").addEvent("click", function(){this.blur()});
}
}
},
toElement: function(){
return this.alias;
}
});
window.addEvent("domready", (function($){
new CheckedListBox($("mselect"));
new CheckedListBox($("mselectReplaceMe"), {replaceOriginal: true} )
}).pass(document.id) );
<h2>The form</h2>
<form id="myForm" action="#" method="post">
<fieldset>
<legend>
Please check it, don't select it.
</legend>
<p>
<select multiple="multiple" name="myMutlipleSelect[]" size="5" id="mselect">
<option value="o1">Option 1</option>
<option value="o2">Option 2</option>
<option value="o3">Option 3 is very long and will span mutliple lines if width for the select was set with css</option>
<option value="o4">Option 4</option>
<option value="o5">Option 5</option>
<option value="o6">Option 6</option>
<option value="o7">Option 7</option>
<option value="o8">Option 8</option>
<option value="o9">Option 9</option>
<option value="o10">Option 10</option>
<option value="o11">Option 11</option>
<option value="o12">Option 12</option>
</select>
</p>
<p>
<select multiple="multiple" name="myMutlipleSelectReplaced[]" size="5" id="mselectReplaceMe">
<option value="o1">Option 1</option>
<option value="o2">Option 2</option>
<option value="o3">Option 3 is very long and will span mutliple lines if width for the select was set with css</option>
<option value="o4">Option 4</option>
<option value="o5">Option 5</option>
<option value="o6">Option 6</option>
<option value="o7">Option 7</option>
<option value="o8">Option 8</option>
<option value="o9">Option 9</option>
<option value="o10">Option 10</option>
<option value="o11">Option 11</option>
<option value="o12">Option 12</option>
</select>
</p>
<p>
<input type="submit" />
</p>
</fieldset>
</form>
html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td{
margin: 0;
padding: 0;
font: 12px Arial;
}
body{
font-size: 100.01%;
}
form{
margin: 20px;
}
fieldset{
padding: 20px;
margin: 10px;
}
p{
margin-bottom: 1.5em;
}
select{
height: 185px;
}
#mselect{
width: 150px;
}
.cidsi{
border: 1px solid #ccc;
}
.cidsi li label:hover, .cidsi label.cidsi-checked{
background-color: #EFFF79;
}
.cidsi li label{
cursor: pointer;
border-bottom: 1px dotted #ccc;
text-indent: -35px;
display: block;
padding: 10px 10px 10px 35px;
}
.cidsi li label input{
vertical-align: top;
margin:0 10px;
}
* html .checklist label { height: 1%; }