var ChainedSelect = {
    Create :function( $data ) 
            {
                // data
                this._level = []; 
                this._uid   = '';
                this._data  = $data;
                for( var _key in $data ) {
                    if ( $( _key ) != null ) {
                        this._uid += _key;
                        this._level[ this._level.length++ ] = _key;
                    }
                }
                // check
                this.fillLevel();
            }
};

ChainedSelect.Create.prototype = {
    fillLevel: function( level, val ) {
        var _val    = val || 0; 
        var _lv     = level || 0;
        if ( _lv >= this._level.length )
            return;
        var elmId   = this._level[ _lv ];
        var data    = this._data[ elmId ];
        var l       = data.length;
        var ref     = this;
        elm = $( elmId );
        if ( _lv <  this._level.length )
        {
            
            elm.onchange = function() {  
                ref.fillLevel( _lv+1, this.selectedIndex >= 0 ? this.options[this.selectedIndex].value : '' );    
            };
        }
        if ( _lv == 0 ) {
            
            elm.options.length = 0;
            for( var i = 0; i < l; i++ ) {
                elm.options.length++;
                elm.options[ elm.options.length-1 ].value = data[ i ][ 0 ];
                elm.options[ elm.options.length-1 ].text = data[ i ][ 1 ];
            }
            for( var i = 0; i < this._level.length; i++ ) {
                elm = $( this._level[ i ] );
                Element.hide(this._level[ i ]);
            }
            new Effect.Appear( this._level[ 0 ] );
        }
        else  {
            var fire = true;
            if ( l > 0 )
            {
                elm.options.length = 0;
                for( var i = 0; i < l; i++ ) 
                {
                    // if ( i == 0 ) fire = data[ i ][ 1 ] != 0 && data[ i ][ 1 ] != "" ;
                    if ( data[ i ][ 0 ] == _val || data[ i ][ 0 ] == 0 || data[ i ][ 1 ] == 0 || data[ i ][ 1 ] == "" )
                    {
                        elm.options.length++;
                        elm.options[ elm.options.length-1 ].value = data[ i ][ 1 ];
                        elm.options[ elm.options.length-1 ].text = data[ i ][ 2 ];
                    }
                }
            }
            if ( fire ) 
            {
                
                
                if ( elm.options.length > 0 )
                {
                    if ( 'none' != Element.getStyle( elmId, 'display' ) )
                        Element.hide( elm );
                    new Effect.Appear( elmId );
                }
                else
                    new Effect.Fade( elmId );
                elm.onchange();
                
            }
        }
    }
    
}