/**
 * Replace select-multiple (or select-one) with checklistbox control
 * @author   MiRacLe (miracle@rpz.name)
 * @example  $("select").checkboxlist();
 *
 * Revision: $Id: jquery.checklistbox.js 11 2007-08-01 09:17:56Z MiRacLe $
 **/ 
jQuery.fn.extend({
	checklistbox: function() {
		return this.each(function() {
			new jQuery.CheckListBox(this);
		});
	}
});
jQuery.CheckListBox = function(obj) {
    var $obj = $(obj);
    if (obj.tagName.toLowerCase() !== 'select') return; // replace only selectobj
    var $name = $obj.attr('name') || $obj.attr('id');
    var $options = $('option',$obj);
    var _control = $('#' + $name + '-checklistbox-container');
    if (!_control.length) {
        _control = document.createElement('div');
        $(_control).css('width',$obj.css('width')).css('height',$obj.css('height')).css('overflow','auto').addClass('checklistbox').attr('id',$name + '-checklistbox-container');
        $obj.change(function(){ $(this).checklistbox();}).after(_control); // @TODO fix onchange
    } else {
        $(_control).empty();        
    }
    if ($obj.is(':visible')) {
        $obj.css('display','none');
    }
    var i = 0;
    $options.each(function(){            
        var self = this;
        var $checked = (!($(self).is(':selected') || false)) ? '' : 'checked="checked"';
        var $onclick = function() { if (this.checked) { self.selected = true;}}
        $(_control).append('<div><input type="checkbox" id="' + $name +'_' + i + '" value="' + $(this).val() + '" ' + $checked + '><label for="' + $name +'_' + i + '">' + $(this).text() + '</label></div>');
        $('#' + $name + '_' + i).click(function(){
            var flag = $(this).is(':checked') || false;
            if (obj.type == 'select-one' && flag) {
                $('input:checked',_control).attr('checked',false);
            }
            $(self).attr('selected',flag);
            $(this).attr('checked',flag);
            $obj.change();
        });
        i++;
    });
}
