var DED = window.DED || {};

DED.effects = function() {
	var $D = YAHOO.util.Dom;
	var $M = YAHOO.util.Motion;
	return {
		/*
			@param {String/HTMLElement} | oEl : Accepts a string to use as an ID for getting a DOM reference, or an actual DOM reference
			@param {Int} | iOffset : The unit (in 'px') that the element will be shaken 'by'
			@param {Int} | iNum : The number of times the motion will iterate
			@param {Int} | iSpeed : The speed at which the motion will animate
		*/
		shake : function(oEl, iOffset, iNum, iSpeed) {
			var xy = $D.getXY(oEl);
			var left = xy[0]-iOffset;
			var right = xy[0]+iOffset;
			(function(type, args, count) {
				if ( count >= iNum ) {
					var a = {
						points : {
							to : xy
						}
					};
					var anim = new $M(oEl, a, iSpeed);
					anim.animate();
					return;
				}
				else if ( count % 2 ) {
					var c = count+1;
					var a = {
						points : {
							to : [right, xy[1]]
						}
					};
					var anim = new $M(oEl, a, iSpeed);
					anim.onComplete.subscribe(arguments.callee, c);
					anim.animate();
				}
				else {
					var c = count+1;
					var a = {
						points : {
							to : [left, xy[1]]
						}
					};
					var anim = new $M(oEl, a, iSpeed);
					anim.onComplete.subscribe(arguments.callee, c);
					anim.animate();
				}
			})(null, null, 1);
		}
	};
}();



/**
 * Dropdown Menu z. B. auf der Startseite der Case Studies
 * <code>
 * new metkDropdown('trigger', 'menu');
 * </code>
 */
function metkDropdown(menuWrapId, triggerId, contentWrap) {
	this.menuWrapId = menuWrapId;
	this.triggerId = triggerId;
	this.contentWrap = contentWrap;

	YAHOO.util.Event.on(document.body, "mouseover", metkDropdown.prototype.handleRollover, null, this);
}

	metkDropdown.prototype.handleRollover = function(e) {
	    var elTarget = YAHOO.util.Event.getTarget(e);

	    if(!elTarget) {
	    	return;
	    }

	    while(elTarget && elTarget.id != this.menuWrapId) {
		    if(elTarget.id == this.triggerId) {
		    	this.showMenu();
				return;
		    }
		    else {
				elTarget = elTarget.parentNode;
		    }
	    }

		if(elTarget && elTarget.id == this.menuWrapId) {
			return;
		}

		this.hideMenu();
	}

	metkDropdown.prototype.showMenu = function() {
		var children = YAHOO.util.Dom.getChildren(this.contentWrap);

		var contentRegion = YAHOO.util.Dom.getRegion(children[0]);
		var contentHeight = contentRegion.bottom - contentRegion.top;

 		var animation = new YAHOO.util.Anim(this.contentWrap, { height: { to: contentHeight } }, 1, YAHOO.util.Easing.easeBoth);
 		animation.duration = 0.5;
 		animation.animate();
	}

	metkDropdown.prototype.hideMenu = function() {
 		var animation = new YAHOO.util.Anim(this.contentWrap, { height: { to: 0 } }, 1, YAHOO.util.Easing.easeBoth);
 		animation.duration = 0.5;
 		animation.animate();
	}

	metkDropdown.prototype.handleRollout = function(event) {
		if(!this.menu) {
			return;
		}

		var menuRegion = YAHOO.util.Dom.getRegion(this.objId);
		var mousePosition = YAHOO.util.Event.getXY(event);

		if((mousePosition[0] > menuRegion.left && mousePosition[0] < menuRegion.right) && (mousePosition[1] > menuRegion.top - 40 && mousePosition[1] < menuRegion.bottom)) {
			return;
		}

		this.menu.hide();
	}


/**
 * Rollover Objekt fuer "mitspringende" Pfeile
 *
 * <code>
 * new metkRollover('mainNav');
 * </code>
 */
function metkRollover(objId, additionalHighlightMargin, itemImageSrc) {
	this.objId = objId;
	this.additionalHighlightMargin = additionalHighlightMargin ? additionalHighlightMargin : 0;
	this.itemImageSrc = itemImageSrc;

	if(document.getElementById(this.objId)) {
		this.createHighlightElement();

		this.navItemCollection = this.getNavItemCollection();

		if(this.navItemCollection.length) {
			this.attachRollover();

			if(YAHOO.util.Dom.getStyle(this.objId, 'opacity') > 0) {
				this.highlightActive();
			}
		}
	}
}

	metkRollover.prototype.createHighlightElement = function() {
		var hiDiv = document.createElement('div');

		//
		if(YAHOO.env.ua.ie)  {
			hiDiv.innerHTML = '<div style="width:23px;height:29px;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=image src=' + this.itemImageSrc + ');"></div>';
		}
		else {
			hiDiv.innerHTML = '<img src="' + this.itemImageSrc + '" alt="" />';
		}

		hiDiv.id = this.objId + 'Highlight';
		hiDiv.style.position = 'absolute';
		hiDiv.className = 'navHighlight';



/*
fileadmin/img/img-metaNav-item-hi.png
*/


/*
hiDiv.style.border = '1px solid lime';
hiDiv.style.zIndex = '10000';
*/
		//if(document.getElementById('navWrapper')) {
		document.getElementById('navWrapper').appendChild(hiDiv);
		//}
		//else {
		//document.getElementById('mainWrapper').appendChild(hiDiv); // muss dann navWrapper sein!
		//}


	}

	metkRollover.prototype.getNavItemCollection = function() {
		return document.getElementById(this.objId).getElementsByTagName('a');
	}

	metkRollover.prototype.highlightActive = function() {
		var activeNavItem = this.getActiveNavItem();

		if(activeNavItem) {
			this.scrollHighlightTo(activeNavItem, false);
		}
		else {
			this.hideHighlight();
		}
	}

	metkRollover.prototype.hideHighlight = function(animate) {
		this.isHidden = true;

		if(animate) {
	 		var self = this;

	 		var animation = new YAHOO.util.Anim(this.getHighlightItem(), { opacity: { to: 0, from: 1 } }, 1, YAHOO.util.Easing.easeBoth);
	 		animation.duration = 0.5;
	 		animation.onComplete.subscribe(function() {
				YAHOO.util.Dom.setStyle(self.getHighlightItem(), 'visibility', 'hidden');
	 		});
	 		animation.animate();
		}
		else {
			YAHOO.util.Dom.setStyle(this.getHighlightItem(), 'visibility', 'hidden');
		}
	}

	metkRollover.prototype.showHighlight = function(animate) {
		this.isHidden = false;
		YAHOO.util.Dom.setStyle(this.getHighlightItem(), 'visibility', '');

		if(animate) {
	 		var animation = new YAHOO.util.Anim(this.getHighlightItem(), { opacity: { to: 1, from: 0 } }, 1, YAHOO.util.Easing.easeBoth);
	 		animation.duration = 0.5;
	 		animation.animate();
		}
	}

	metkRollover.prototype.getActiveNavItem = function() {
		var elements = YAHOO.util.Dom.getElementsByClassName('active', 'a', this.objId);

		if(elements.length) {
			for(var i in elements) {
				var element = elements[i];

				if(!YAHOO.util.Dom.hasClass(element, 'activeInRootline')) {
				//console.log(element);
					return element;
				}
			}

			return elements[0];
		}

		return 0;
	}

	metkRollover.prototype.resetHighlightPosition = function() {
		if(this.getActiveNavItem()) {
			var activeNavItem = this.getActiveNavItem();
			//console.log('test');
			this.scrollHighlightTo(activeNavItem, true);
		}
		else {
			this.hideHighlight(true);
		}
	}

	metkRollover.prototype.getFirstNavItem = function() {
		var items = document.getElementById(this.objId).getElementsByTagName('a');
		return items[0];
	}

	metkRollover.prototype.getHighlightItem = function() {
		return this.objId + 'Highlight';
	}

	metkRollover.prototype.scrollHighlightTo = function(navItem, animate) {
		var navItemRegion = YAHOO.util.Dom.getRegion(navItem);

		var highlightItemRegion = YAHOO.util.Dom.getRegion(this.getHighlightItem());
		var hilightItemWidth = highlightItemRegion.right - highlightItemRegion.left;
		var hilightItemHeight = highlightItemRegion.bottom - highlightItemRegion.top;

		var offsetLeft = parseInt(navItemRegion.left - hilightItemWidth);
		var offsetTop = parseInt(navItemRegion.top + this.additionalHighlightMargin);

	//	YAHOO.util.Dom.setStyle(this.getHighlightItem(), 'left', offsetLeft + 'px');

		if(animate) {
	 		var animation = new YAHOO.util.Anim(this.getHighlightItem(), { top: { to: offsetTop } }, 1, YAHOO.util.Easing.easeBoth);
	 		animation.duration = 0.5;
	 		animation.animate();
		}
		else {
			YAHOO.util.Dom.setStyle(this.getHighlightItem(), 'top', offsetTop + 'px');
		}
	}

	metkRollover.prototype.attachRollover = function() {
		YAHOO.util.Event.addListener(this.navItemCollection, 'mouseover',  metkRollover.prototype.handleRollover, null, this);
		YAHOO.util.Event.addListener(this.navItemCollection, 'mouseout',  metkRollover.prototype.handleRollout, null, this);
	}

	metkRollover.prototype.handleRollover = function(event) {
		var eventTarget = YAHOO.util.Event.getTarget(event);

		this.scrollHighlightTo(eventTarget, this.isHidden ? false : true);

		if(this.isHidden) {
			this.showHighlight(true);
		}

		if(this.resetTimeout) {
			this.resetTimeout.cancel();
		}
	}

	metkRollover.prototype.handleRollout = function(event) {
		this.resetTimeout = YAHOO.lang.later(1000, this, 'resetHighlightPosition');
	}



/**
 * Objekte fuer die News Liste
 */
function metkNewsListItemWithoutDetailView(newsItem, hiddenNewsContentClassName) {
	this.newsItem = newsItem;
	this.hiddenNewsContentClassName = hiddenNewsContentClassName;

	this.isOpen = false;
}

	metkNewsListItemWithoutDetailView.prototype.getHiddenContentElement = function() {
		var elements = YAHOO.util.Dom.getElementsByClassName(this.hiddenNewsContentClassName, 'div', this.newsItem);
		return elements[0];
	}

	metkNewsListItemWithoutDetailView.prototype.show = function(callback) {
		this.isOpen = true;

		var hiddenContentElement = this.getHiddenContentElement();

		//var elements = YAHOO.util.Dom.getElementsByClassName(this.hiddenNewsContentClassName, 'div', this.newsItem);

		var hiddenContentRegion = YAHOO.util.Dom.getRegion(hiddenContentElement);
		var hiddenContentHeight = hiddenContentRegion.bottom - hiddenContentRegion.top;

		if(hiddenContentElement) {
	 		var animation = new YAHOO.util.Anim(hiddenContentElement.parentNode, { height: { to: hiddenContentHeight } }, 1, YAHOO.util.Easing.easeBoth);
	 		animation.duration = 0.5;
	 		animation.animate();
		}
	}

	metkNewsListItemWithoutDetailView.prototype.hide = function() {
		if(!this.isOpen) {
			return;
		}

		var self = this;

		//var elements = YAHOO.util.Dom.getElementsByClassName('newsListItemHiddenContentInner', 'div', this.newsItem);
		var hiddenContentElement = this.getHiddenContentElement();

		if(hiddenContentElement) {
	 		var animation = new YAHOO.util.Anim(hiddenContentElement.parentNode, { height: { to: 0 } }, 1, YAHOO.util.Easing.easeBoth);
	 		animation.duration = 0.5;
	 		animation.onComplete.subscribe(function() {
	 			self.isOpen = false;
	 		});
	 		animation.animate();
 		}
	}



function metkNewsList(objId, newsItemClassName, hiddenNewsContentClassName) {
	this.objId = objId;
	this.newsItemClassName = newsItemClassName;
	this.hiddenNewsContentClassName = hiddenNewsContentClassName;

	this.openNewsItems = {};

	YAHOO.util.Event.on(document.documentElement, "mouseover", metkNewsList.prototype.handleRollout, null, this);
}

	metkNewsList.prototype.showNewsItem = function(newsItemElement) {
		YAHOO.util.Dom.generateId(newsItemElement);

		if(this.activeNewsItem && this.activeNewsItem.id == newsItemElement.id) {
			return;
		}

		this.hideAllOpenNewsItems(newsItemElement.id);

		var activeNewsItem = new metkNewsListItemWithoutDetailView(newsItemElement, this.hiddenNewsContentClassName);
		activeNewsItem.show();

		this.openNewsItems[newsItemElement.id] = activeNewsItem;
	}

	metkNewsList.prototype.hideAllOpenNewsItems = function(excludeId) {
		for(var key in this.openNewsItems) {
			if(excludeId && key == excludeId) {
				continue;
			}

			var item = this.openNewsItems[key];
			item.hide();
		}
	}

	metkNewsList.prototype.handleRollout = function(e) {
	    var elTarget = YAHOO.util.Event.getTarget(e);

	    if(!elTarget) {
	    	return;
	    }


		if(YAHOO.util.Dom.hasClass(elTarget, 'newsListItemImage') || elTarget.tagName.toLowerCase() == 'img') {
			return;
		}


	    while(elTarget && elTarget.id != this.objId) {
		    if(YAHOO.util.Dom.hasClass(elTarget, this.newsItemClassName)) {
				this.showNewsItem(elTarget);
				return;
		    }
		    else {
				elTarget = elTarget.parentNode;
		    }
	    }

	//	console.log(elTarget);

		this.hideAllOpenNewsItems();

	}


/**
 * Tooltips
 */
function nl2br( str ) {
	if(str == undefined) {
		return '';
	}

    return str.replace(/([^>])\n/g, '$1<br />\n');
}

function metkTooltips(className) {
	this.className = className;

	this.attachEvents();
}

	metkTooltips.prototype.attachEvents = function() {
		var elements = YAHOO.util.Dom.getElementsByClassName(this.className);

		for(var i = 0; i < elements.length; i++) {
			var currentTooltip = new YAHOO.util.Element(elements[i]);
			var titleText = YAHOO.lang.trim(currentTooltip.get('title'));

			if(!titleText) {
				continue;
			}

			elements[i].withinOpeningAccordionItem = function() {
				var accordionItemContainer = YAHOO.util.Dom.getAncestorByClassName(this, 'yui-accordion-content'); //

				if(accordionItemContainer && accordionItemContainer.style && accordionItemContainer.style.height != 'auto') {
					return true;
				}

				return false;
			}

			elements[i].onmouseover = function() {
				if(this.withinOpeningAccordionItem()) {
					return;
				}

				if(typeof this.title == 'undefined') {
					return;
				}

				this.tempTitle = this.title;
				this.title = '';

				overlib('<div class="toolTip"><div class="toolTipInner">' + nl2br(this.tempTitle) + '</div></div>', SHADOW, SHADOWIMAGE,'clear.gif');
			};

			elements[i].onmouseout = function() {
				if(this.withinOpeningAccordionItem()) {
					return;
				}

				if(typeof this.tempTitle == 'undefined') {
					return;
				}

				this.title = this.tempTitle;

				nd();
			};
		}
	}



/**
 * Default Value switchen bei text inputs
 */
function metkFocusBlurInputs(className) {
	YAHOO.util.Dom.getElementsByClassName(className, '', '', this.metkFocusBlurInputs);
}

	metkFocusBlurInputs.prototype.metkFocusBlurInputs = function(element) {
		YAHOO.util.Event.on(element, "focus", function() {
			if(this.value == this.defaultValue) this.value='';
		});

		YAHOO.util.Event.on(element, "blur", function() {
			if(this.value == '') this.value = this.defaultValue;
		});
	}



/**
 * Haupt- / Subnavigation mit dazugehoerigen Entities
 */
function metkNavList(objId, subNavDelay) {
	this.objId = objId;
	YAHOO.lang.later(subNavDelay, this, 'initRollover');
}

	metkNavList.prototype.initRollover = function() {
		this.rollover = new metkRollover(this.objId, 0, 'fileadmin/img/img-mainNav-item-hi.png');
	}

	metkNavList.prototype.exists = function() {
		return document.getElementById(this.objId) != null;
	}

	metkNavList.prototype.getRegion = function() {
		return YAHOO.util.Dom.getRegion(this.objId);
	}

	metkNavList.prototype.isActive = function() {
		return YAHOO.util.Dom.hasClass(this.objId, 'active');
	}

	metkNavList.prototype.setActive = function() {
		YAHOO.util.Dom.addClass(this.objId, 'active');
	}

	metkNavList.prototype.setInactive = function() {
		YAHOO.util.Dom.removeClass(this.objId, 'active');
	}

	metkNavList.prototype.calculateOffsetYByNavList = function(navList) {
		var myRegion = this.getRegion();
		var otherRegion = navList.getRegion();

		var diff = myRegion.top - otherRegion.top;
		return diff;
	}

	metkNavList.prototype.hide = function() {
 		var animation = new YAHOO.util.Anim(this.objId, { opacity: { to: 0, from: 1} }, 0.5, YAHOO.util.Easing.easeOut);
 		animation.animate();

 		this.rollover.hideHighlight(false);
	}

	metkNavList.prototype.show = function() {
 		var animation = new YAHOO.util.Anim(this.objId, { opacity: { to: 1, from: 0	} }, 0.5, YAHOO.util.Easing.easeOut);
 		animation.animate();
	}


function metkNavListSwitch(objId, navContainer, mainNavList, subNavList) {
	this.objId = objId;

	this.navContainer = navContainer;
	this.mainNavList = mainNavList;
	this.subNavList = subNavList;

	YAHOO.util.Event.addListener(this.objId, 'mouseover',  metkNavListSwitch.prototype.handleRollover, null, this);

	this.resetAnimationStatus();
}

	metkNavListSwitch.prototype.setSubnavPosition = function(hasSeenSubNavAnimation) {
		var regionMainNav = this.mainNavList.getRegion();
		var regionSubNav = this.subNavList.getRegion();

		var diff = regionMainNav.top - regionSubNav.top;

		this.navContainer.changePositionBy(diff, hasSeenSubNavAnimation);
		this.mainNavList.hide(false);
	}

	metkNavListSwitch.prototype.resetAnimationStatus = function() {
		this.animationRunning = false;
	}

	metkNavListSwitch.prototype.handleRollover = function() {
		if(this.animationRunning) {
			return;
		}

		this.animationRunning = true;

		YAHOO.lang.later(500, this, 'resetAnimationStatus');

		if(this.subNavList.isActive()) {
			var offsetY = this.subNavList.calculateOffsetYByNavList(this.mainNavList);

			this.navContainer.changePositionBy(offsetY);

			this.mainNavList.setActive();
			this.mainNavList.show();

			this.subNavList.setInactive();
			this.subNavList.hide(true);

			document.getElementById(this.objId).className = 'mainNavActive';
		}
		else {
			var offsetY = this.mainNavList.calculateOffsetYByNavList(this.subNavList);

			this.navContainer.changePositionBy(offsetY);

			this.subNavList.setActive();
			this.subNavList.show();

			this.mainNavList.setInactive();
			this.mainNavList.hide(true);

			document.getElementById(this.objId).className = 'subNavActive';
		}
	}

function metkMainNavContainer(objId) {
	this.objId = objId;
}

	metkMainNavContainer.prototype.changePositionBy = function(offsetY, noAnimation) {
		var currentStyleTop = parseInt(YAHOO.util.Dom.getStyle(this.objId, 'top'));

		if(noAnimation) {
			YAHOO.util.Dom.setStyle(this.objId, 'top', (currentStyleTop + offsetY) + 'px');
		}
		else {
	 		var animation = new YAHOO.util.Anim(this.objId, { top: { to: (currentStyleTop + offsetY), from: currentStyleTop }}, 0.5, YAHOO.util.Easing.easeOut);
	 		animation.animate();
		}
	}

function metkMainNav() {
	var subNavExists = document.getElementById('subNav') != null;
	var hasSeenSubNavAnimation = YAHOO.util.Cookie.get('subnavAnimation') == '1';
	
	if(!hasSeenSubNavAnimation) {
		YAHOO.util.Cookie.set('subnavAnimation', '1'); 
	}	
	
	this.navContainer = new metkMainNavContainer('mainNavContainer');
	this.mainNavList = new metkNavList('mainNav', 100);
	this.subNavList = new metkNavList('subNav', subNavExists && !hasSeenSubNavAnimation ? 500 : 100);

	if(subNavExists) {
		this.navListSwitch = new metkNavListSwitch('mainNavSwitch', this.navContainer, this.mainNavList, this.subNavList);
		this.navListSwitch.setSubnavPosition(hasSeenSubNavAnimation);
	}
}


// Events
YAHOO.util.Event.onDOMReady(function() {
	new metkMainNav();
});
YAHOO.util.Event.onDOMReady(function() {
	new metkRollover('metaNav', -3, 'fileadmin/img/img-metaNav-item-hi.png');
});
YAHOO.util.Event.onDOMReady(function() {
	new metkTooltips('tooltip');
});
YAHOO.util.Event.onDOMReady(function() {
	new metkFocusBlurInputs('focusBlur');
});








function metkGlossaryItemLightbox(item, backLinkText) {
	this.item = item;

	var content = '';
	content += '<div id="searchAdditionalInfoContent">';
	content += '<h2>' + item.word + '</h2>';
	content += '<h3>' + item.short_description + '</h3>';
	content += '<div id="searchAdditionalInfoContentBody">' + item.long_description  + '</div>';
	content += '<div><a id="searchAdditionalInfoContentCloseTrigger" href="#">' + backLinkText + '</a></div>';
	content += '</div>';

	this.panel = new YAHOO.widget.Panel("searchAdditionalInfo",
				{ width:"861px",
				  fixedcenter:false,
				  close:false,
				  draggable:false,
				  zindex:100000,
				  modal:true,
				  visible:true
				}
			);

	this.panel.setBody(content);
	this.panel.render(document.body);

	this.repositionPanel();

	var self = this;

	YAHOO.widget.Overlay.windowResizeEvent.subscribe(function() {
		self.repositionPanel();
	});

	var trigger = document.getElementById('searchAdditionalInfoContentCloseTrigger');

	trigger.onclick = function() {
		self.hidePanel();
		return false;
	}

	YAHOO.util.Event.addListener(document.documentElement, 'click',  function(event) {
		var eventTarget = YAHOO.util.Event.getTarget(event);

		if(YAHOO.util.Dom.hasClass(eventTarget, 'mask')) {
			self.hidePanel();
		}
	});

	this.sendNotificationToFlash(true);
}

	metkGlossaryItemLightbox.prototype.sendNotificationToFlash = function(running) {
		var flashElements = YAHOO.util.Dom.getElementsBy(function(el) {
			return el.id && el.id.indexOf('mymovie_element') != -1;
		});

//		console.log(flashMovies.length);

		for(var i in flashElements) {
			var flashElement = flashElements[i];
			var movie = getFlashMovie(flashElement.id);

			try {
				//console.log(movie);

				if(running) {
					movie.lightboxOn();
				}
				else {
					movie.lightboxOff();
				}
			}
			catch(e) {
				//console.log(e);
			}

//		console.log('test');
		}
	}

	metkGlossaryItemLightbox.prototype.hidePanel = function() {
		this.panel.hide();
		this.panel.destroy();
		this.sendNotificationToFlash(false);
	}

	metkGlossaryItemLightbox.prototype.repositionPanel = function() {
		var mainNavContainerRegion = YAHOO.util.Dom.getRegion('mainNavContainer');

		var posLeft = mainNavContainerRegion.left;
		var posTop = 416;

		this.panel.moveTo(posLeft, posTop);
		//this.panel.syncPosition();
		this.panel.cfg.refireEvent("iframe");
	}

 function getFlashMovie(movieName) {
	var isIE = navigator.appName.indexOf("Microsoft") != -1;
	return (isIE) ? window[movieName] : document[movieName];
 }

