function LinkedSelection( inputSelects, callback, data )
{
	var self = this;				/* um aus EventHandlern auf diese Instanz zugreifen zu können */
	var selects = new Array();		/* Liste der verketteten Auswahllisten */

	var changeHandler = function()
	{
		var value = this.selectedValue();

		// Auf die nächste Auswahlliste folgende Auswahllisten müssen wieder
		// in den default-Zustand versetzt werden
		if( typeof(this.nextSelect) == 'object' )
		{
			for( var i = this.nextSelect.selectID + 1; i < selects.length; i++ )
				selects[i].replaceOptions( new Array() );
		}

		// Abbrechen, wenn ein Dummy-Wert ausgewählt wurde
		if( value == '--' )
		{
			if( this.selectID < selects.length )
				selects[ this.selectID +1 ].replaceOptions( new Array() );

			return;
		}

		if( typeof(this.nextSelect) == 'object' )
		{
			/*
			 * nextSelect ist eine Auswahlliste
			 */

			// Wenn keine Daten zur gemachten Auswahl zur Verfügung stehen,
			// müssen wir sicherstellen, dass wir auf keine nicht vorhandenen Objekte zugreifen.
			if( !data[ this.nextSelect.id ][ value ] )
			{
				if( !data[ this.nextSelect.id ] )
					data[ this.nextSelect.id ] = {};

				data[ this.nextSelect.id ][ value ] = new Array();
			}

			// Neue Optionen in der nächsten Auswahlliste setzen
			this.nextSelect.replaceOptions( data[ this.nextSelect.id ][ value ] );

			// Wenn die Auswahlstrecke nicht beendet ist, muss die Callback-Funktion
			// dennoch aufgerufen werden, damit entsprechend auf Änderungen
			// reagiert werden kann.
			//if(typeof(callback) == 'function')
				//callback.apply(new Array() );
				callback( new Array() );
		}
		else
		{
			/*
			 * Die Auswahlstrecke ist absolviert
			 */

			// Wahlen der einzelnen Listen in ein Array schreiben um
			// dieses an die Callback-Funktion zu übergeben.
			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() } );
			}
			//if(typeof(callback) == 'function')
				//callback.apply(selected);
				callback( selected );
		}
	};

	var replaceOptions = function( newOptions )
	{
		var my_td = document.getElementById("landart");
		var land = document.getElementById("land");
		var bundesland = document.getElementById("bundesland");
		var my_plz = document.getElementById("plz");
		var isgroup = document.getElementById("isgroup");
		var tr_region = document.getElementById("tr_region");
		var tr_bundesland = document.getElementById("tr_bundesland");

		if(tr_bundesland)
			tr_bundesland.style.visibility=(land.value>=1)? 'visible' : 'hidden';
		if(tr_region)
			tr_region.style.visibility=(bundesland.value>=1)? 'visible' : 'hidden';

		if(land.value == 0) {
			tr_bundesland.style.visibility='hidden';
			tr_region.style.visibility='hidden';
		}

		if(land.value == 3) {
			if(my_td.innerHTML == "Dein Kanton" || my_td.innerHTML == "Dein Bundesland")
				my_td.innerHTML = "Dein Kanton";
			else
				if(my_td.innerHTML == "Kanton:" || my_td.innerHTML == "Bundesland:")
					my_td.innerHTML = "Kanton:";
				else if(my_td.innerHTML == "aus dem Bundesland" || my_td.innerHTML == "aus dem Kanton")
					my_td.innerHTML = "aus dem Kanton";
		}
		else {
			if(my_td.innerHTML == "Dein Kanton" || my_td.innerHTML == "Dein Bundesland")
				my_td.innerHTML = "Dein Bundesland";
			else
				if(my_td.innerHTML == "Kanton:" || my_td.innerHTML == "Bundesland:")
					my_td.innerHTML = "Bundesland:";
				else if(my_td.innerHTML == "aus dem Bundesland" || my_td.innerHTML == "aus dem Kanton")
					my_td.innerHTML = "aus dem Bundesland";
		}
		if(land.value == 1 && my_plz)
			my_plz.setAttribute('maxLength', '5');
		else if(my_plz) {
			my_plz.value = "";
			my_plz.setAttribute('maxLength', '4');
		}

		// alte Optionen der Auswahlliste löschen
		var opts = this.getElementsByTagName( 'option' );
		while( opts.length > 0 )
			this.removeChild( opts[0] );

		// wenn keine neuen Optionen übergeben wurden, default-Option setzen
		// andernfalls "Bitte wählen" voranstellen
		if(isgroup) {
			if(this.name == "land")
				this.addOption( '--', 'überregional' );
			else {
				if(this.name == "bundesland")
					this.addOption( '--', 'landesweit' );
				else
					this.addOption( '--', 'für alle Regionen' );
			}
		}
		else {
			if( newOptions.length == 0)
				this.addOption( '--', '---' );
			else
				this.addOption( '--', 'bitte wählen' );
		}

		// neue Optionen in die Auswahlliste schreiben
		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()
	{
		// bestücke bestehende selects
		for( var i = 0; i < inputSelects.length; i++ )
		{
			var t = document.getElementById( inputSelects[i] );

			// ignoriere falsche IDs
			if(!t)
				continue;

			// neue Funktionen und Event-Handler zuweisen und in selects registrieren
			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 );

			// registriere Auswahlliste als nextSelect bei der vorhergehenden
			if( selects.length > 1 )
				selects[ selects.length-2 ].nextSelect = t;
		}
	};

	// initialisieren!
	this.init();
}
