var gControls;

function DynamicSelect( control, paramsMap, dataSourceUrl ){
	if ( !gControls )
		gControls = new Hash( );

    this.control = control;
    this.controlsToObserve = $H( paramsMap.evalJSON( ) );
    this.dataSourceUrl = dataSourceUrl;
}

DynamicSelect.prototype.init = function ( ) {
	var obj = this;
	this.controlsToObserve.each( function( pair )
		{
			if ( !gControls[pair.value] )
				gControls[pair.value] = [];

			gControls[pair.value].push( obj );
		    Event.observe( $( pair.value ), 'change', handleDynamicSelectChange );
		}
	);
}

DynamicSelect.prototype.getQueryString = function( ) {
	var str = this.dataSourceUrl + '?';

	this.controlsToObserve.each( function( pair ) 
		{
			var value = $( pair.value ).options[ $( pair.value ).selectedIndex ].value;
			str += pair.key + '=' + value + '&';
		}
	)

	return str;
}

DynamicSelect.prototype.fillData = function ( data ) {
    var h = $H(data.evalJSON());
    this.clearOptions( );
	var obj = this;
    h.each( function( pair ) { addItem( obj.control, pair.key, pair.value ); } );
}

DynamicSelect.prototype.clearOptions = function ( ) {
	$( this.control ).options.length = 0;
}

function addItem( ctrl, value, text ) {
	var opt = new Option( text, value );
	if ( Prototype.Browser.IE )
		$( ctrl ).options.add( opt );
	else
		$( ctrl ).appendChild( opt );
}

function handleDynamicSelectChange( event ) {
	var arrObjs = gControls[Event.element( event ).id];

	arrObjs.each( function ( item ) 
		{
		    new Ajax.Request( 
        		item.getQueryString( ), 
		        { 
					asynchronous : false,
        		    method: 'get',
		            onSuccess: function(transport) 
						{ 
							item.fillData( transport.responseText ); 
						}
        		}
			);
		}
    );
}
