function LinkedSelection(inputSelects, callback, data) {
	var self = this;	
	var selects = new Array();

	var changeHandler = function() {
		var value = this.selectedValue();

		if(typeof(this.nextSelect) == 'object') {
			for( var i = this.nextSelect.selectID + 1; i < selects.length; i++) {
				selects[i].replaceOptions(new Array());
			}
		}

		if(value == '') {
			if( this.selectID < selects.length ) {
				selects[ this.selectID +1 ].replaceOptions( new Array() );
			}
			return;
		}
		
		if(typeof(this.nextSelect) == 'object') {
			if(!data[this.nextSelect.id][value]) {
				if(!data[ this.nextSelect.id ]) {
					data[this.nextSelect.id] = {};
				}
				data[this.nextSelect.id][value] = new Array();
			}
			this.nextSelect.replaceOptions(data[ this.nextSelect.id ][ value ]);
			callback(new Array());
		} else {
			var selected = new Array();
			for(var i = 0; i < selects.length; i++) {
				selected.push({'id' : selects[i].id,
								 'value': selects[i].selectedValue(),
								 'text' : selects[i].selectedText()});
			}
			callback(selected);
		}
	};

	var replaceOptions = function(newOptions) {
		var opts = this.getElementsByTagName('option');
		while(opts.length > 0) {
			this.removeChild(opts[0]);
		}
		if( newOptions.length == 0) {
			this.addOption('', '');
		}

		for(var i = 0; i < newOptions.length; i++) {
			this.addOption(newOptions[i][0], newOptions[i][1]);
		}
	};

	var addOption = function(value, text) {
		var opt = document.createElement('option');
		opt.value = value;
		opt.appendChild(document.createTextNode(text));
		this.appendChild(opt);
	};

	var selectedValue = function() {
		return this.options[this.selectedIndex].value;
	};

	var selectedText = function() {
		return this.options[this.selectedIndex].text;
	};

	var selectByValue = function(value) {
		for(var i = 0; i < this.options.length; i++) {
			if(this.options[i].value == value)
				this.selectedIndex = i;
		}
	}

	this.init = function() {
		for(var i = 0; i < inputSelects.length; i++) {
			var t = document.getElementById(inputSelects[i]);
			if(!t) continue;

			t.replaceOptions 	= replaceOptions;
			t.addOption 		= addOption;
			t.selectedValue 	= selectedValue;
			t.selectedText 		= selectedText;
			t.selectByValue 	= selectByValue;
			t.selectID 			= selects.length;
			t.onchange 			= changeHandler;
			selects.push(t);

			if(selects.length > 1) {
				selects[selects.length - 2].nextSelect = t;
			}
		}
	};
	
	this.init();
}