var Application = function() {
	var yd = YAHOO.util.Dom;
	var yc = YAHOO.util.Connect;
	var ya = YAHOO.util.Anim;
	var ye = YAHOO.util.Event;
	
	var tooltip = null;
	
	initMenuHover();
	initSubMenu();
	initSWFArray();
	
	var blinkMaxCount = 6;
	var oldImageIcon = null;
	var blinkElement = null;
	var blinkInterval = null;

	var preloader = new NB.ImagePreloader();
	preloader.preload([
	   "tooltip/bd.png",
	   "tooltip/close.gif",
	   "tooltip/ft.png",
	   "tooltip/hd.png",
	   "header/menu/left.png",
	   "header/menu/right.png",
	   "header/menu/middle.png"
	   ],
	   "/images/"
	);
	
	function initSWFArray(){
		if (window.swfArray) {
			for (i = 0; i < swfArray.length; i++) {
				if (swfArray[i]) {
					swfobject.embedSWF(swfArray[i].swf, swfArray[i].id, swfArray[i].width, swfArray[i].height, "8", null, {}, {wmode:swfArray[i].wmode}, {});
				}
			}
		}
	}
	
	function focusFieldError(element)
	{
		element.focus();
		var blinkCount = 0;
		
		if(blinkInterval && blinkElement)
		{
			clearInterval(blinkInterval);
			blinkElement.style.borderColor = "#CDB897";
		}
		
		blinkElement = element;
		
		var defaultColor = element.style.borderColor;
		blinkInterval = setTimeout(blink, 200);
		
		function blink() {
		    var curColor = element.style.borderColor;
            element.style.borderColor = (curColor == defaultColor ) ? "#d32121" : defaultColor;
            
            blinkCount++;
            
            if(blinkCount < blinkMaxCount)
            {
                blinkInterval = setTimeout(blink, (blinkCount % 2 == 0) ? 200 : 400);          
            }
			else
			{
				blinkElement = null;
			}
        
		}
	}
	
	function initMenuHover()
	{
		var menuItems = yd.get("menu").getElementsByTagName("li");
		
		for(var i = 0; i < menuItems.length; i++)
		{
			if(!yd.hasClass(menuItems[i], "on"))
			{
			    var hoverImage = yd.getAttribute(menuItems[i], "hover");
				
				ye.addListener(menuItems[i], "mouseover", changeMenuImage, {element : menuItems[i], imgSrc: hoverImage});
			    ye.addListener(menuItems[i], "mouseout", changeMenuImage, {element : menuItems[i], imgSrc: menuItems[i].firstChild.firstChild.src});
			}
		}
	}
	
	function changeMenuImage(e, ea)
	{
		ea.element.firstChild.firstChild.src = ea.imgSrc;
	}
	
	function initSubMenu()
	{
		var activeMenuItems = yd.getElementsByClassName("on", "", "menu");
		if(activeMenuItems.length == 0)
		{
			return;
		}
		var activeMenuItem = activeMenuItems[0];
		var xy = yd.getXY(activeMenuItem);
		yd.setX("submenu", xy[0]-5);
		
		var anim = new ya("submenu", {top: {from: 125, to: 155}}, 1, YAHOO.util.Easing.elasticOut);
		var width = yd.get("submenu-content").firstChild.offsetWidth + 60;
		if(width == 60)
		{
			return;
		}
		
		yd.setStyle("submenu", "width", width + "px");
		
		yd.setX("submenu-selected", xy[0]);
		var menuItemWidth = activeMenuItem.offsetWidth + 10;
		yd.setStyle("submenu-selected", "width", menuItemWidth + "px");
		yd.setStyle("submenu-selected", "height", "38px");
		
		
		yd.setStyle("submenu-selected", "opacity", 0);
		var fadeAnim = new ya("submenu-selected", {opacity: {to: 1}}, .5, YAHOO.util.Easing.easeOut);
		
		
		setTimeout(function() {
			anim.animate();
			fadeAnim.animate();
		}, 500);		
	}
	
	
	
	
	function initTooltip()
	{
		tooltip = document.createElement("div");
		tooltip.id = "error-tooltip";
		tooltip.innerHTML = [
		  '<div class="hd"></div>',
		  '<div class="bd"><div></div></div>',
		  '<div class="ft"></div>',
		  '<a href="#close" class="close"></a>'
		].join("");
		
		ye.on(tooltip.lastChild, "click", Application.hideErrorTooltip);
		
		yd.get("page").appendChild(tooltip);
		
		
	}
	
	function restoreIcon()
	{
		if(!oldImageIcon)
		{
			return;
		}
		oldImageIcon.element.src = oldImageIcon.src;
		oldImageIcon.element.width = oldImageIcon.width;
		oldImageIcon.element.height = oldImageIcon.height;
		oldImageIcon.element.className = oldImageIcon.className;
	}
	
	return {
		hideErrorTooltip : function(e) {
			if(!tooltip)
			{
				return;
			}
			
			try
			{
			    e =  ye.getEvent(e);
			    ye.stopEvent(e);
			}
			catch(e) {}
			
			var bd = tooltip.firstChild.nextSibling;
            bd.firstChild.innerHTML = "";
			
			yd.setStyle(tooltip, "visibility", "hidden");
			
		},
		sendForm : function(formCheckCfg, formId, url, callbackFn, loaderIcon) {
			var form = yd.get(formId);
			
			this.hideErrorTooltip();
			
			var formCheck = new FormCheck(formCheckCfg);
			var formVars = formCheck.getFormVars(formId);
			for(var field in formVars)
			{
				if(form[field] && !form[field].length && form[field].nodeName.toLowerCase() == "input" && form[field].type == "text")
				{
					var defaultVal = form[field].attributes["defaultvalue"] ? form[field].attributes["defaultvalue"].nodeValue : null;
					if(defaultVal == form[field].value)
					{
					   formVars[field] = "";
					}
				}
			}
			
			formCheck.check(formVars);
			
			
			oldImageIcon = null;
			if(loaderIcon)
			{
				oldImageIcon = {
					src : loaderIcon.src,
					width: loaderIcon.width,
					height : loaderIcon.height,
					element : loaderIcon,
					className : loaderIcon.className
				};
				
				loaderIcon.src = "/images/send-loader.gif";
				loaderIcon.className = "send-loader";
				loaderIcon.width = 18;
				loaderIcon.height = 18;	
			}
			
			var result = {
				success : false
			}
			
			if(formCheck.hasErrors())
			{
				var errors = formCheck.getErrorTextsAssoc();
				
				var field = errors[0].field;
				var message = errors[0].message;
			
				var fieldEl = (field == "birthdate") ? form.birthday : form[field];
				
				this.showErrorTooltip(message, fieldEl);
				
				restoreIcon();
                callbackFn.call(this, result);					
			}
			else
			{
				var callback = {
					success : function(o) {
						result = null;
						try
						{
						  eval("var result=" + o.responseText);
						}
						catch(e)
						{
							alert("Leider konnte Deine Anfrage nicht übertragen werden! Bitte versuche es später erneut!");
						}
						
						if(!result.success)
						{
							for(var field in result.errors)
							{
								if(field == "captcha")
								{
									yd.get("captcha-code").src = "/images/captcha.php?t=" + Math.round(Math.random() * 1000000);
								}
								
								Application.showErrorTooltip(result.errors[field], form[field]);    
							}
						}
						
						restoreIcon();
						callbackFn.call(this, result);
					}
				};
				
				yc.setForm(form);
				
				yc.asyncRequest("post", url, callback);
			}
			
		},
		showErrorTooltip : function(text, element) {
			if(tooltip === null)
			{
				initTooltip();
			}
			
			if(element.nodeName && element.nodeName.toLowerCase() == "input")
			{
				setTimeout(function() {
	                focusFieldError(element);
	            }, 500);
			}
			
			if(element.length)
			{
				element = element[0];
			}
			
			var elementPos = yd.getXY(element);
			elementPos[0] += (element.offsetWidth - tooltip.offsetWidth) / 2;
			elementPos[1] -= 20;
			
			yd.setXY(tooltip, elementPos);
			yd.setStyle(tooltip, "visibility", "visible");
			
			var bd = tooltip.firstChild.nextSibling;
			yd.setStyle(bd, "height", 0);
			
			bd.firstChild.innerHTML = text;
			var height = bd.firstChild.offsetHeight + 10;
			
			var newTop = parseInt(yd.getStyle(tooltip, "top").replace("", ""), 10) - height;
			
			var expandBdAnim = new ya(bd, {height: {to: height}}, 1, YAHOO.util.Easing.elasticOut);
			expandBdAnim.animate();
			
			var fadeIn = new ya(bd.firstChild, {opacity : {from: 0, to: 1}}, .5, YAHOO.util.Easing.easeOut);
            fadeIn.animate();
			
			var expandAnim = new ya(tooltip, {top: {to: newTop}}, 1, YAHOO.util.Easing.elasticOut);
			expandAnim.animate();
			
		}
	};
	
}();
