﻿var VNDropdown = {};

(function(){
	
	var Dom = YAHOO.util.Dom;
	var Event = YAHOO.util.Event;
	
	/**
	 * Erzeugt ein neues Pseudoobjekt vom Typ Dropdown.
	 * @author Niklas Funke <n.funke@vest-netz.de>
	 * @package depending dropdown box
	 */
	var Dropdown = function (id) {
		
		// ID des Selectfeldes
		this._id = id;
		
		// Vergebene Options dieses Feldes
		this._options = [];
		
		// Zugewiesene Untermenüs
		this._dds = [];
		
		// Zuletzt ausgewählter Wert.
		this._lastValue = null;
	};
	
	/**
	 * Prototypeneingenschaften von Dropdown.
	 * @author Niklas Funke <n.funke@vest-netz.de>
	 * @package depending dropdown box
	 */
	Dropdown.prototype = {
		/**
		 * Aktiviert die Dropdown Box.
		 * @return void
		 */
		run : function () {
			var select = Dom.get(this._id);
			
			// Selectbox leeren
			for(var i = Dom.get(this._id).length; i >= 0; i--) {
				select.options[i] = null;
		    }
			
			// Selectbox aufbauen.
			for (i in this._options) {
				if (this._options[i]['value'] != undefined) {
					var e = document.createElement('option');
					var t = document.createTextNode(this._options[i]['name']);
					
					var a = document.createAttribute('value');
					a.nodeValue = this._options[i]['value'];
			        e.setAttributeNode(a);
			        
			        // Eintrag vormarkieren wenn vorgegeben.
			        if (this._lastValue == this._options[i]['value']) {
			        	var a = document.createAttribute('selected');
						a.nodeValue = 'selected';
				        e.setAttributeNode(a);
			        }
			        
			        e.appendChild(t);
			        Dom.get(this._id).appendChild(e);
				}
			}
			
			// Menü aktivieren.
			this.disable(false);
			this.select();
		},
		
		/**
		 * Deaktiviert alle Untermenüs
		 * @return void
		 */
		stop : function () {
			// Alle Unterdropdowns durchlaufen und deaktiveren
			try {
				for (i in this._dds) {
					this._dds[i].disable(true);
					this._dds[i].stop();
				}
			} catch (ex) {};
		},
		
		/** 
		 * Fügt eine Option dem Selectfeld hinzu.
		 * @param int value Wert
		 * @param string name Bezeichnung
		 */
		addOption : function (value, name, selected) {
			if (this._lastValue == null || selected) {
				this._lastValue = value;
			}
			
			this._options[this._options.length] = {
				'value': value,
				'name' : name
			};
		},
			
		/**
		 * Fügt ein abhängiges Dropdownfeld hinzu
		 * @param int value
		 * @param VNDropdown dd
		 */
		addDropdown : function (value, dd) {
			this._dds[value] = dd;
			dd.disable(true);
		},
		
		/**
		 * Wird ausgeführt, wenn sich der aktuelle Wert des Auswahlfeldes 
		 * ändert.
		 * @param YAHOO.util.Event e
		 */
		select : function (e) {
			if (this._dds[Dom.get(this._id).value]) {
				var dd = this._dds[Dom.get(this._id).value];
				dd.run();
			
			} else {
				this.stop();
			}
		},
		
		/**
		 * Deaktiviert das Selectfeld und springt auf den ersten Wert.
		 * @param boolean flag 
		 */
		disable : function (flag) {
			Dom.get(this._id).disabled = (flag == true);
			if (flag == true) {
				Event.removeListener(this._id, 'change');
			} else {
				Event.on(this._id, 'change', this.select, this, true);
			}
		}
	};

	VNDropdown = Dropdown;
})();