/**
 * Class Menu
 * 
 * This class controll the Main Menu
 */
var Menu = new Class({
	options: {},
	
	/**
	 * Constructer of the main class
	 * 
	 * @param {Object} options
	 */
	initialize: function(options){
		
		this.fxMenuFold();
		this.fxMouseOverMenuBoxen();
		
		
	},
	
	fxMouseOverMenuBoxen: function(){
		var list = par.navi.boxes;
		list.each(function(el) {
			var element = $(el);
			var fx_element = $('fx_'+el);
			
			// init opacity 
			if(element.hasClass('foldout')){
				fx_element.setStyle('opacity',par.navi.fxOpacity.active.opacity);
			} else {
				fx_element.setStyle('opacity',par.navi.fxOpacity.enter.opacity.start);
			}
		
			var fx = new Fx.Styles(fx_element, {duration: par.navi.fxOpacity.duration, wait:false});
	
			element.addEvent('mouseenter', function(){
				if (!element.hasClass('foldout')) {
					fx.start({
						'opacity': [fx_element.getStyle('opacity'), par.navi.fxOpacity.enter.opacity.end]
					});
				}
			});
			
			element.addEvent('mouseleave', function(){
				if (!element.hasClass('foldout')) {
					fx.start({
						'opacity': [fx_element.getStyle('opacity'), par.navi.fxOpacity.leave.opacity.end]
					});
				}
			});		
		});		
	},
	/**
	 * 
	 * 	 
	 **/
	fxMenuFold: function(){
		var selfObj = this;
/*
		$$('ul.level3open').each(function(el){
			el.removeClass('level3open');
		});
*/
		// Initalisierung: Alle Menuelemente der Ebene 2 ausblenden
		$$('li.level2').each(function(el){
			el.setStyle('display', 'none');
		});
		
		par.navi.boxes.each(function(el){
			// Initialisierung Ebene 3 falls vorhanden
			if ($$('#' + el + ' li.level3').length > 0) {
				
				$$('#' + el + ' ul').each(function(el){
						el.setStyles({'display': 'inline'});
				});
				
				$$('#' + el + ' ul ul').each(function(el){
						el.setStyles({'position': 'static', 
									  'top': 'auto', 
									  'left': 'auto'});
				});
			
					
				$$('#' + el + ' ul ul ul').each(function(el){
						el.setStyles({'position': 'absolute', 
									  'top': 29, 
									  'left': 0, 
									  'display':'block'});
				});	
				
				
				// Benötigte Elemente auf Sichtbar setzen
				$$('#' + el + ' li.l1').each(function(el){
						el.setStyle('display', 'inline');
				});
				
				$$('#' + el + ' li.level2').each(function(el){
						if (el.hasClass('act') || el.hasClass('cur')) {
							el.setStyles({
								'display': 'inline',
								'margin-left': 10
							});
						}
				});

				$$('#' + el + ' li.level3').each(function(el){
						el.setStyle('display', '');
				});	
				
				$(el).addClass('foldout');
				
			} else {
			// Initalisierung: Menuelemente der Ebene 2 einblenden falls unter ihnen die eine CUR Seite ist.
				if ($$('#' + el + ' .cur').length > 0) {
					$$('#' + el + ' li.level2').each(function(el){
						el.setStyle('display', '');
					});
					$(el).addClass('foldout');
				}
			}
		});
		
		

				
		// Allen Menuelementen der Ebene 1 das Foldin/out Event beim Click hinzufügen
		par.navi.boxes.each(function(el){
			$$('#' + el + ' a.level1').addEvent("click", function(e) {
				e = new Event(e);
				var level2actRow = '';
				$$('#' + el + ' li.level2').each(function(ele){
					if (ele.hasClass('act') || ele.hasClass('cur')) {
						level2actRow = ele;	
					}
				});
			
				var rows = '';
				if ($$('#' + el +' li.level3').length > 0){
					rows = $$(level2actRow,'#' + el +' li.level3');
				} else {
					rows = $$('#' + el +' li.level2');
				}
				
				var curMenuChain = new Chain();
				var oldMenuChain = new Chain();

				if ($(el).hasClass('foldout')){
					// Menuelemente des Aktuellen Menus ausblenden
					rows.reverse();
					rows.each(function(row){ curMenuChain.chain( function(){ selfObj.hiddeRow(row); }); });
					$(el).removeClass('foldout');
				} else {
					// Menuelemente des Aktuellen Menus einblenden
					rows.each(function(row){ 
						curMenuChain.chain( function(){ 
							selfObj.showRow(row); 
						}); 
					});
					$(el).addClass('foldout');
				}
				
				var runCurMenuChain = function() { 
					curMenuChain.callChain();
					if (curMenuChain.chains.length == 0) { runCurMenuChain = $clear(curTimer); } 
				}
				var curTimer = runCurMenuChain.periodical(par.navi.fxFold.duration);
				
				// Altes Menu ausblenden falls vorhanden
				// Falls eines der anderen beiden Menus eingeblendet ist
				// wird dieses ausgeblendet
				par.navi.boxes.each(function(el_menu){
					if ( ($(el_menu).hasClass('foldout') == true) && (el != el_menu)){
						
						var level2actRowFoldout = '';
						$$('#' + el_menu + ' li.level2').each(function(ele){
							if (ele.hasClass('act') || ele.hasClass('cur')) {
								level2actRowFoldout = ele;	
							}
						});
						
						var foldoutRows  = '';
						if ($$('#' + el_menu +' li.level3').length > 0){
							foldoutRows = $$(level2actRowFoldout, '#' + el_menu +' li.level3');
						} else {
							foldoutRows = $$('#' + el_menu +' li.level2');
						}
						
						// Menuelemente des nicht mehr Aktuellen Menus ausblenden
						foldoutRows.reverse();
						foldoutRows.each(function(foldoutRow){ oldMenuChain.chain( function(){ selfObj.hiddeRow(foldoutRow); }); });
						oldMenuChain.chain( function(){ $(el_menu).removeClass('foldout'); });
						
						// Background ausfaden
						var fx_element = $('fx_'+el_menu);
						var fx = new Fx.Styles(fx_element, {duration: par.navi.fxOpacity.duration, wait:false});
						fx.start({
							'opacity': [fx_element.getStyle('opacity'), par.navi.fxOpacity.leave.opacity.end]
						});
					}
				});

				if (oldMenuChain.chains) {
					var runOldMenuChain = function(){
						oldMenuChain.callChain();
						if (oldMenuChain.chains.length == 0) {
							runOldMenuChain = $clear(oldTimer);
						}
					}
					var oldTimer = runOldMenuChain.periodical(par.navi.fxFold.duration);
				}
				e.stop();
			});
		});
	},
	
	showRow: function(row){
		row.setStyle('opacity','0');
		row.setStyle('display','');
		var fxRow = new Fx.Style(row, 'opacity', {duration:par.navi.fxFold.duration, wait:true}).start(1);
	},
	
	hiddeRow: function(row){
		var fxRow = new Fx.Style(row, 'opacity', {duration:par.navi.fxFold.duration, wait:true}).start(0).chain(function(){
			row.setStyle('display','none');
		});
	}
	
});

Menu.implement(new Options());