//  NOTICE: This whole object works correct, but there's still a lot to do.

var SectorDynSelect = {

	// This is the form we aim to.
	form: null,

	// This array contains numeric key and HTML ids of every gotten HTML element.
	// It's doubles indixed with numeric and string key to have a kind of backreferencing
	elder: new Array(),

	// This tree contains all gotten HTML elements.
	elem: new Array(),

	// List for empty nodes
	empty: new Array(),

	// List with default selected entries in HTML select elements
	selected: new Array(),

	init: function(formname,elder,firstSel,secondSel,thirdSel)
	{
		// If we have an ancient version of IE we won'd do anything.
		if (   (navigator.appName.indexOf('Microsoft Internet Explorer') > -1)/*
			&& (parseInt(navigator.appVersion.match(/MSIE ([\d])/)[1]) < 6)*/)
		{
			return false;
		}

		// Get GET sector parameter
		// this.searchCgiSelected();

		// Get init preselection parameter
		(firstSel  != null) ? this.selected[0] = firstSel  : null;
		(secondSel != null) ? this.selected[1] = secondSel : null;
		(thirdSel  != null) ? this.selected[2] = thirdSel  : null;

		// First we prepare the form element.
		if (this.form = document.forms[formname])
		{
			// Add eventListener wether DOM compatible or not
			if (document.addEventListener)
			{
				this.form.addEventListener('reset',this.formResetter,false);
			} else {
				this.form.onreset = this.formResetter;
			}
		} else {
			return false;
		}

		// ii is a security key for elder HTML elements, because selection
		// of a HTML element could fail ... is'nt secure
		ii = 0;

		// For each elder element get HTML node and assign it
		// into elder array
		for (i = 0; i < elder.length; i++)
		{
			sel = this.form.elements[elder[i]];
			if (sel != null)
			{
				this.elem[ii] = sel;
				this.elder[ii] = ii;
				this.elder[elder[i]] = this.elder[ii];
				ii++;
			}
		}

		// This will be assigned, if select field is not filled
		this.empty = {'0':0};

		for(i = 0; i < this.elem.length; i++)
		{
			// Cleaning select node
			this.rmnodes(this.elem[i]);

			// Add eventListener wether DOM compatible or not
			if (document.addEventListener)
			{
				this.elem[i].addEventListener('change',this.observer,false);
			}
			else
			{
				this.elem[i].onchange = this.observer;
			}
		}

		if (this.selected.length > 0)
		{
			// Set "root" element and preselected elements
			this.assign(this.elem[0],sectorTree,'',this.selected[0]);
			SectorDynSelect.autoAssign();
		}
		else
		{
			// Set only "root" element
			this.assign(this.elem[0],sectorTree);
		}
	},

	observer: function()
	{
		// Index of affected HTML node
		// and next node in SectorDynSelect.elem
		i  = SectorDynSelect.elder[this.name];
		ii = i+1;

		// Exit when there is no next node in elem list
		if (SectorDynSelect.elem[ii] == null)
		{
			return false;
		}

		switch (parseInt(ii))
		{
		case 1:
			list = sectorTree[SectorDynSelect.elem[i].value];
			pref = SectorDynSelect.elem[i].value+'-';
			break;
		case 2:
			list = sectorTree[SectorDynSelect.elem[0].value][SectorDynSelect.elem[i].value];
			pref = SectorDynSelect.elem[0].value+'-'+SectorDynSelect.elem[i].value+'-';
			break;
		default:
			list = sectorTree;
			pref='';
		}

		// Removing following nodes
		for(j = ii; j < SectorDynSelect.elem.length; j++)
		{
			SectorDynSelect.rmnodes(SectorDynSelect.elem[j]);
			// SectorDynSelect.assign(SectorDynSelect.elem[j],SectorDynSelect.empty);
		}

		// Assigning correct option tags to next node
		if (this.value != 0 && !isNaN(list[0]))
		{
			SectorDynSelect.assign(SectorDynSelect.elem[ii],SectorDynSelect.empty);
			SectorDynSelect.assign(SectorDynSelect.elem[ii],list,pref);
		}

		return true;
	},

	// Assign list elements to a node
	assign: function(node,elem,pref,sel)
	{
		// Setting prefix to empty string to avoid wrong translations
		if (!pref)
		{
			pref = '';
		}

		for (key in elem)
		{
			// Checking if translation is avialable.
			// This filters implicit all 0:0 entries without translation :-/
			if (!(localized = sectorStrings[pref+key]))
			{
				continue;
			}

			opt = document.createElement('option');

			val = document.createAttribute('value');
			val.nodeValue = key;
			txt = document.createTextNode(localized);

			// Anyway IE doesn't create new nodes by only setting their value
			// opt.text  = localized;
			// opt.value = key;

			opt.setAttributeNode(val);
			opt.appendChild(txt);

			if (parseInt(sel) === parseInt(key))
			{
				opt.selected = true;
			}

			node.appendChild(opt);
		}
	},

	// Assign a void node
	voidAssign: function(node)
	{
		opt = document.createElement('option');
		val = document.createAttribute('value');
		val.nodeValue = 0;
		opt.appendChild(document.createTextNode(''));
		opt.setAttributeNode(val);
		node.appendChild(opt);
	},

	autoAssign: function()
	{
		selected = this.selected;

		for (key in selected)
		{
			// Index of affected HTML node
			// and next node in SectorDynSelect.elem
			i  = this.elder[key];
			ii = i+1;

			switch (parseInt(ii))
			{
			case 1:
				list = sectorTree[selected[0]];
				pref = selected[0]+'-';
				break;
			case 2:
				list = sectorTree[selected[0]][selected[1]];
				pref = selected[0]+'-'+selected[1]+'-';
				break;
			default:
				list = sectorTree;
				pref='';
			}

			// Removing following nodes
			this.rmnodes(this.elem[ii]);

			// Assigning correct option tags to next node
			if (selected[key] != 0 && !isNaN(list[0]))
			{
 				SectorDynSelect.assign(this.elem[ii],this.empty);
				SectorDynSelect.assign(this.elem[ii],list,pref,selected[ii]);
			}
		}
	},

	// Removing all childes from a node
	rmnodes: function(node)
	{
		doomed = node.firstChild;
		while (doomed != null)
		{
			node.removeChild(doomed);
			doomed = node.firstChild;
		}
	},

	// This method takes care
	formResetter: function()
	{
		// Number of elements to reset.
		i = SectorDynSelect.elem.length;

		for (j = 1; j < i; j++)
		{
			doomed = SectorDynSelect.elem[j];
			SectorDynSelect.rmnodes(doomed);
		}

	}
};

