var globalExecuter = false;
var megaMenuExecuter = false;

/**
 * Registriert Mouseover Observer für neu geladene Level Items
 */
function levelLoadedHandler() {
	$$(".megaMenu .levelWrapper a:not([class=noDetails])").each(function(item) {
		if(item.up(".levelWrapper").hasClassName("last"))
			item.observe("mouseover", loadModelDetails);
		else
			item.observe("mouseover", loadLevel);
		
		item.observe("mouseout", function() {
			globalExecuter.stop();
		});
	});
	
	rewriteUriLanguage("#navi");
}

/**
 * Stoppt alle Mouseover Observer für die Zeit, in welcher ein anderer Level
 * geladen wird. 
 */
function stopLinkObserver() {
	$$(".megaMenu .levelWrapper:not(.details) a").each(function(item) {
		item.stopObserving("mouseover", loadLevel);
		item.stopObserving("mouseout");
	});
}

/**
 * Lädt neuen Level per Ajax
 */
function loadLevel() {
	// Executer stoppen, falls dieser schon aktiviert wurde
	if(globalExecuter)
		globalExecuter.stop();
	
	var mouseOverItem = this;
	
	// Starten des Executers für verspätete Mouseover Reaktion
	globalExecuter = new PeriodicalExecuter(function() {
		globalExecuter.stop();
		
		// Entfernen der Active Klasse im aktuellen Level
		mouseOverItem.up(".level").select(".levelItem", "a.active").invoke("removeClassName", "active");
		
		var levelItem = mouseOverItem.up(".levelItem");
		
		if(!levelItem)
			levelItem = mouseOverItem;
			
		// Aktiv schalten des Mouseover Level Items
		levelItem.addClassName("active");

		var categoryId = levelItem.readAttribute("categoryId");
		
		var currentLevelWrapper = levelItem.up(".levelWrapper");
		if(currentLevelWrapper.down(".levelShadow"))
			currentLevelWrapper.down(".levelShadow").remove();
		
		var nextLevelClasses = "levelWrapper";
		var nextLevelWrapper = currentLevelWrapper.next(".levelWrapper");
		var nextLevelShadow = false;
		var nextLevel = false;
		var lastLevel = false;
		
		if(!categoryId) {
			lastLevel = true;
			nextLevelClasses += " last";
		}
				
		// neuen Level im DOM erzeugen, falls dieser nicht schon vorhanden ist
		if(!nextLevelWrapper) {
			// Level Wrapper erzeugen
			nextLevelWrapper = new Element("div", {
				"class": nextLevelClasses
			});
			
			// Level Shadow erzeugen
			nextLevelShadow = new Element("div", {
				"class": "levelShadow"
			});
			
			// Level erzeugen
			nextLevel = new Element("div", {
				"class": "level"
			});
			
			nextLevelWrapper.insert({
				top: nextLevel,
				bottom: nextLevelShadow
			});
			
			var megaMenu = mouseOverItem.up(".megaMenu");
			$(megaMenu).insert({
				bottom: nextLevelWrapper
			});
		// Falls nächster Level vorhanden ist, alle Level nach diesem aus DOM entfernen
		} else {
			nextLevelShadow = nextLevelWrapper.down(".levelShadow");
			if(!nextLevelShadow) {
				nextLevelWrapper.insert({
					bottom: new Element("div", {
						"class": "levelShadow"
					})
				});
			}
			
			nextLevel = nextLevelWrapper.down(".level");
			
			nextLevelWrapper.nextSiblings().invoke("remove");
		}
		
		var params = new Object();
		
		params.language = levelItem.readAttribute("language");
		params.pimLanguage = levelItem.readAttribute("pimLanguage");
		params.docId = levelItem.readAttribute("docId");
		
		if(levelItem.readAttribute("constructionType"))
			params.constructionType = levelItem.readAttribute("constructionType");
		
		// Parameter für Ajaxaufruf anhand gesetzter Attribute bestimmen
		if(categoryId) {
			params.method = "getCategories";
			params.categoryId = categoryId;
		} else {
			params.method = "getModelOverview";
			params.range = levelItem.readAttribute("range");
			params.modelYear = levelItem.readAttribute("modelYear");
			params.countryId = levelItem.readAttribute("countryId");
		}
		
		if(mouseOverItem.up().previous("a"))
			mouseOverItem = mouseOverItem.up().previous("a");
		
		new Ajax.Updater(nextLevel, "/include/de/navi/listview.php", {
			method: "post",
			parameters: params,
			
			onLoading: function() {
				if(nextLevel.getHeight() < 90)
					nextLevelHeight = 90;
				else
					nextLevelHeight = nextLevel.getHeight();
			
				nextLevel.setStyle({
					height: nextLevelHeight + "px"
				}).update("").addClassName("loading");
			
				stopLinkObserver();
			},
			
			onComplete: function() {
				nextLevel.setStyle({
					height: "100%"
				}).removeClassName("loading");
				
				document.fire("level:loaded");
				
				if(lastLevel)
					document.fire("lastLevel:loaded");					
			}
		});
	}, 0.6);
}

function loadModelDetails() {
	if(globalExecuter)
		globalExecuter.stop();
	
	mouseoverItem = this;
	
	globalExecuter = new PeriodicalExecuter(function() {
		globalExecuter.stop();
		
		$$(".levelWrapper.last a").invoke("removeClassName", "active");
		mouseoverItem.addClassName("active");
		
		params = {
			method: "getModelDetails",
			language: mouseoverItem.readAttribute("language"),
			pimLanguage: mouseoverItem.readAttribute("pimLanguage"),
			docId: mouseoverItem.readAttribute("docId"),
			range: mouseoverItem.readAttribute("range"),
			countryId: mouseoverItem.readAttribute("countryId"),
			model: mouseoverItem.readAttribute("model"),
			modelYear: mouseoverItem.readAttribute("modelYear")
		};
		
		new Ajax.Updater("modelDetails", "/include/de/navi/listview.php", {
			method: "post",
			parameters: params,
			
			onLoading: function() {
				$("modelDetails").setStyle({
					height: $("modelDetails").getHeight() - 40 + "px"
				}).update("").addClassName("loading");
			},
			
			onComplete: function() {
				$("modelDetails").setStyle({
					height: "auto"
				}).removeClassName("loading");
				
				document.fire("modelDetails:loaded");
			}
		});
	}, 0.6);
}

function resetMegaMenu(megaMenu) {
	if(megaMenu) {
		megaMenu.select(".levelItem.active").invoke("removeClassName", "active");
		megaMenu.select(".levelWrapper:not([level=1])").invoke("remove");
		megaMenu.hide();
	} else {
		$$("#navi_top .levelItem.active").invoke("removeClassName", "active");
		$$("#navi_top .levelWrapper:not([level=1])").invoke("remove");
		$$(".megaMenu").invoke("hide");
	}
}


Event.observe(window,'load', function() {
	$$("#navi_top .naviItem").each(function(naviItem) {

		// if ( naviItem.select(".megaMenu") ) {
		var megaMenu = naviItem.select(".megaMenu").first();

		if(megaMenu) {
			naviItem.observe("mouseover", function(event) {		
				if(event.findElement().up().hasClassName("naviItem")) {
					resetMegaMenu();
					
					if(!megaMenu.down(".levelWrapper[level=1]").down(".levelShadow")) {
						megaMenu.down(".levelWrapper[level=1]").insert({
							bottom: new Element("div", {
								"class": "levelShadow"
							})
						});
					}
				}
					
				this.addClassName("hover");
				megaMenu.show();
				
				if(megaMenuExecuter)
					megaMenuExecuter.stop();
			});

			naviItem.observe("mouseout", function() {
				megaMenuExecuter = new PeriodicalExecuter(function() {
					naviItem.removeClassName("hover");
					
					resetMegaMenu(megaMenu);
				}, 1);
			});
		}
		// };
	});
	
	levelLoadedHandler();
});

document.observe("level:loaded", levelLoadedHandler);

document.observe("lastLevel:loaded", function() {
	var firstModelLink = $$(".levelWrapper.last a:not([class=noDetails])").first();
	
	if(firstModelLink)
		firstModelLink.simulate("mouseover", loadModelDetails);
});

document.observe("modelDetails:loaded", function() {
	var tabLightwindow = new lightwindow();
	
	$$(".panoLink").each(function(panoLink) {
		panoLink.observe("click", function() {
			$$("#navi_top .naviItem").invoke("stopObserving", "mouseout");
		});
	});
	
	rewriteUriLanguage("#navi");
});
