/**
 * Navigation Typ 1 
 * 
 * Level 1 bleibt stehen, Level <= 2 werden nur bei Hover Level 1 Parent eingeblendet 
 * 
 * @author	pro (1.0)
 */
View.Navigation1 = Class.create(View, 
{
	/**
	 * Overlay generieren
	 * 
	 * @author	pro (1.0)
	 */
	main : function(objElement)
	{
		this.Object 		= $(objElement);
		this.Object.Level 	= [];
		
		this.Object.Level[1] = $A(this.Object.getElementsByClassName('tabLevel1'));
		this.Object.Level[2] = [];
		
		var intAnzTabs = this.Object.Level[1].length;
		for(var i=0; i<intAnzTabs; i++)
		{
			/*
			 * Handelt es sich bei dem Tab um einen ausgewählten Tab
			 */
			if(this.Object.Level[1][i].hasClassName('selected'))
			{
				this.Object.Selected = this.Object.Level[1][i];
			}
			this.Object.Level[2][i] = $A(this.Object.Level[1][i].getElementsByClassName('tabLevel2'));
		}
	}
});


/**
 * Navigation Typ 2 
 * 
 * Level 3 bleibt stehen, Level <= 2 werden nur bei Hover Level 1 Parent eingeblendet 
 * 
 * @author	pro (1.0)
 */
View.Navigation2 = Class.create(View, 
{
	/**
	 * Overlay generieren
	 * 
	 * @author	pro (1.0)
	 */
	main : function(objElement)
	{
		this.Object 		= $(objElement);
		this.Object.Level 	= [];

		this.Object.Level[1] = $A(this.Object.getElementsByClassName('tabLevel3'));	
		
		var intAnzTabs = this.Object.Level[1].length;
		for(var i=0; i<intAnzTabs; i++)
		{
			/*
			 * Handelt es sich bei dem Tab um einen ausgewählten Tab
			 */
			if(this.Object.Level[1][i].hasClassName('selected'))
			{
				this.Object.Selected = this.Object.Level[1][i];
			}
		}
	}
});

/**
 * Kontrolliert einen Dialog
 * 
 * @author pro (1.0)
 */
var Navigation = Class.create(Module,
{	
	/**
	 * View zuweisen
	 * 
	 * @var View
	 */
	View : null,
			
	/**
	 * Navigationstype
	 * 
	 * 1 - Level 1 bleibt stehen, Level <= 2 werden nur bei Hover Level 1 Parent eingeblendet 
	 * 
	 * @var Integer
	 */
	intType : 1,
	
	/**
	 *  Timeout zum Zurücksetzen des Menüs
	 */
	objResetTimeout : null, 
	
	/**
	 * Timeout zum aktivieren eines Hoverevents
	 */
	objHoverTimeout : null,
	
	/**
	 * Main-Methode
	 * 
	 * @author 	pro (1.0)
	 * @param	Object	objElement		Navigationselement
	 * @param	Integer	intStartLevel	Nr. des ersten Levels
	 * @param	Integer	intAnzLevel		Anzahl der Levelebenen
	 * @param	Integer	intType			Wie soll die Navigation behandelt werden
	 */
	main : function($super, objElement, intType)
	{
		this.intType = intType 	? intType 	: this.intType;	
		this.setView();
		
		$super(objElement);
	},
	
	setView : function()
	{
		switch(this.intType)
		{
			default:
			case 1: 
				this.View = 'View.Navigation1';
				break;
			
			case 2: 
				this.View = 'View.Navigation2';
				break;				
		}	
	},

	/**
	 * Setzt die diversen Eventlistener
	 * 
	 * @author 	pro (1.0)
	 */
	setListeners : function()
	{
		switch(this.intType)
		{
			default:
			case 1: 
				this.setListenersType1();
				break;
				
			case 2:
				this.setListenersType2();
				break;
				
		}	
	},
	
	/**
	 * 
	 */
	setListenersType1 : function()
	{
		this.View.observe('mouseout', this._delayReset.bind(this));
		this.View.observe('mouseover', this._clearResetTimeout.bind(this));
		
		var intAnzTabsLevel1 = this.View.Level[1].length;
		for(var i=0; i<intAnzTabsLevel1; i++)
		{
			
			/*
			 * Tabs Level 1 
		 	 */
			this.View.Level[1][i].observe('mouseover', this._showNextLevel.bind(this, this.View.Level[1][i], this.View.Level[1]));
			this.View.Level[1][i].observe('mouseover', this._clearResetTimeout.bind(this));
//			this.View.Level[1][i].observe('mouseout', this._clearHoverTimeout.bind(this));

			
			/*
			 * Tabs Level 1 , 2
			 */
			var intAnzTabsLevel2 = this.View.Level[2][i].length;
			for(var j=0; j<intAnzTabsLevel2; j++)
			{
				this.View.Level[2][i][j].observe('mouseover', this._showTab.bind(this, this.View.Level[2][i][j]));
				this.View.Level[2][i][j].observe('mouseover', this._clearResetTimeout.bind(this));
				this.View.Level[2][i][j].observe('mouseout', this._hideTab.bind(this, this.View.Level[2][i][j]));
			}
		}
	},
	
	/**
	 * 
	 */
	setListenersType2 : function()
	{
		var intAnzTabsLevel1 = this.View.Level[1].length;
		
		for(var i=0; i<intAnzTabsLevel1; i++)
		{
			/*
			 * Tabs Level 1 
		 	 */
		 	if(!this.View.Selected || this.View.Level[1][i] != this.View.Selected)
		 	{
		 		this.View.Level[1][i].observe('mouseover', this._highlight.bind(this, this.View.Level[1][i]));
				this.View.Level[1][i].observe('mouseout', this._lowlight.bind(this, this.View.Level[1][i]));
		 	}

		}
	},
	
	_clearHoverTimeout : function()
	{
		clearTimeout(this.objHoverTimeout);
	},
	
	_clearResetTimeout : function()
	{
		clearTimeout(this.objResetTimeout);
	},
	
	_delayShowNextLevel :  function(objElement, objElements)
	{
		this.objHoverTimeout = this._showNextLevel.bind(this, objElement, objElements).delay(0.05);
	},
	
	_delayReset : function()
	{
		this.objResetTimeout = this._reset.bind(this).delay(0.2);
	},
	
	_reset : function()
	{
		this._showNextLevel(this.View.Selected, this.View.Level[1], false);
	},
	
	/**
	 * 
	 */
	_showNextLevel : function(objElement, objElements, blnHide)
	{
		var objNextElement 	= false;
		var blnUseNext		= false;
		
		objElements.each(function(objElementCheck){
			
			if(blnUseNext)
			{
				objNextElement 	= objElementCheck;
				blnUseNext 		= false;
			}
			
			if(!objNextElement && !blnUseNext && objElement == objElementCheck)
			{
				blnUseNext = true;
			}
			
			objElementCheck.addClassName('hide');
			objElementCheck.removeClassName('highlight');
			objElementCheck.removeClassName('highlightAfter');		
		});
		
		this._showTab(objElement,objNextElement, blnHide);
	},
	
	_highlight : function(objElement)
	{
		objElement.addClassName('highlight');
	},
	
	_lowlight : function(objElement)
	{
		objElement.removeClassName('highlight');
	},
	
	/**
	 * 
	 */
	 _hideTab  : function(objElement)
	 {
	 	objElement.addClassName('hide');
		objElement.removeClassName('highlight');
	 },
	
	/**
	 * 
	 */
	 _showTab  : function(objElement, objNextElement, blnHide)
	 {
	 	if(blnHide)
	 	{
	 		objElement.removeClassName('hide');
	 	}
//	 	
//	 	if($(objNextElement) && typeof(objNextElement) != 'event')
//	 	{alert(objNextElement);
//	 		 $(objNextElement).addClassName('highlightAfter');
//	 	}
	 	
	 	if(blnHide)
	 	{
			objElement.addClassName('highlight');
			
	 	}
	 }
});



