var MultipleCheckbox = Class.create();
MultipleCheckbox.prototype = {
    currentfilter :  ""   ,
    showmode      : 0     ,
    /* -------------------------------------- */
    initialize: function( id ){
        
        
        //Construct
	var select = $( id );

        var pnode  = $(document.createElement("div"));
        pnode.addClassName( 'widget_checkboxlist' );
        
        var input = document.createElement("input");
        pnode.appendChild( input );
			
        var scroller = $( document.createElement("div") );
        scroller.addClassName( "scroller");
        pnode.appendChild( scroller );

	var table = $( document.createElement( "table" ) );
        table.cellSpacing = 0;
        table.cellPadding = 0;
        scroller.appendChild( table );

        Event.observe( input , "keyup" , this.onfilter.bindAsEventListener( this , input , table ) );

        //Load Data From the select box to checkboxlist
        var x;
	var opts = select.options;
	var rows = table.rows;
	var c    = opts.length;
        for( x = 0 ; x < c ; x++ ){

            //Create Row
            var tr = table.insertRow( rows.length  );

            //Create First Column
            var td = $( tr.insertCell( 0 ));
            td.addClassName("checkbox");

            var chk  = document.createElement("input");
            chk.type = 'checkbox';
            td.appendChild( chk );

            //Create Second Column
            var td2 = $( tr.insertCell( 1 ) );
            td2.addClassName("caption");
            td2.innerHTML = opts[x].text;

            if( opts[x].selected ){
                tr.addClassName("selected");
                chk.checked = true;
            }

            Event.observe( tr , "click" , this.onselect.bindAsEventListener( this , tr , chk , opts[x] ) );

        }

        //Add Widget to document
        select.style.display = 'none';
        select.parentNode.insertBefore( pnode , select );

    },
    /* -------------------------------------- */
    onselect: function( e  , tr , chk , option ){

        tr.toggleClassName("selected");
        option.selected = !option.selected;
        chk.checked     =  option.selected;

    },
    /* -------------------------------------- */
    onfilter: function( e , txt , table ){

				var x         = 0;
				var filter    = txt.value;
			
                                //Check if it is a blank filter
                                if( /^\s*$/.test( filter ) ){

                                    var c = table.rows.length;
                                    for( x = 0 ; x < c ; x++ ){
                                            table.rows[x].removeClassName( "filterpos" );
                                            table.rows[x].removeClassName( "filterneg" );
                                    }

                                    this.currentfilter = "";

                                    return;
                                }

                                //Filter
                                if( filter == this.currentfilter ){
                                     return;
                                }

                                var c = table.rows.length;
                                for( x = 0 ; x < c ; x++ )
                                    if( this.test_subtri( filter , table.rows[x].cells[1].innerHTML )){
                                        var item = table.rows[x];
                                        item.addClassName( "filterpos" );
                                        item.removeClassName( "filterneg" );
                                    }
                                    else{
                                        var item = table.rows[x];
                                        item.addClassName( "filterneg" );
                                        item.removeClassName( "filterpos" );
                                    }

                                this.currentfilter = filter;

    },
    /* -------------------------------------- */
    test_subtri : function( filter , text ){
        var haystack = text.toLowerCase().strip();
        var needle   = filter.toLowerCase().strip();
        return haystack.indexOf( needle ) > -1;
    }
};



Event.observe( window , "load" , function(){

    var x;
    var objs = document.getElementsByTagName('select');
    for( x = 0 ; x < objs.length ; x++ )
        if( objs[x].multiple ){
            new MultipleCheckbox( objs[x] );
	}

});
