var DynamicDropdown=new Class({
	Implements: [Options,Events],
	options: {
		id:null,
		container:null,
		call:null,
		params:[]
	},
	initialize: function(options) {
		this.setOptions(options);
		this.id=this.options.id;
		this.element=$(this.id);
		if (!this.options.container) {
			this.options.container=this.id+"Container";
		}
		this.container=$(this.options.container);
	},
	refreshDropdown:function() {
		var url=this.set.service;
		var data={call:this.options.call};
		
		this.options.params.each(function(param) {
			var el=$(param);
			if (el)
				data[param]=el.value;
		});
		var request=new Request.HTML({
			url:url,
			data:Object.toQueryString(data),
			method:"get",
			update:this.container,
			onSuccess:this.bindRefresh.bind(this)
		 });
		request.send();	
	},
	bindRefresh:function() {
		this.element=$(this.id);
		this.set.bindParameters(this);
	}
});

var DynamicDropdownSet=new Class({
	Implements: [Options,Events],
	options: {
		form:$empty,
		service:"",
		dropdowns:[]
	},
	dropdowns:{},
	params:{},
	
	initialize: function(options) {
		this.setOptions(options);
		
		var url=document.location.toString();
		url=url.substr(0,url.lastIndexOf('/')+1);
		this.service=url+this.options.service;

		this.options.dropdowns.each(
			function(data) {
				this.addDropdown(new DynamicDropdown(data));
			},this);
	},
	
	addDropdown: function(dropdown) {
		this.dropdowns[dropdown.id]=dropdown;
		dropdown.set=this;
		dropdown.options.params.each(function(param) {
											  
			var paramDropdown=$(param);
			paramDropdown.addEvent("change",dropdown.refreshDropdown.bind(dropdown));

			if (!this.params[param]) {
				this.params[param]=[];
			}
			this.params[param].push(dropdown);
			
		},this);
	},

	bindParameters:function(dropdown) {
		var dependentList=this.params[dropdown.id];
		if (dependentList) {
			dependentList.each(function(dependent) {
				dropdown.element.addEvent("change",dependent.refreshDropdown.bind(dependent));
			});
		}
	}
		
});
