var lang = (document.location + '').match('/de/') ? 'de' : 'en';


var jsf = {};
var IE = !!(window.attachEvent && navigator.userAgent.indexOf('Opera') === -1);

String.prototype.trim = function()
{
	return this.replace(/^\s+/, '').replace(/\s+$/, '');
}

String.prototype.camelize = function()
{
	var tmp = this.split('-');
	var camelized = this.charAt(0) == '-' ? tmp[0].charAt(0).toUpperCase() + tmp[0].substring(1) : tmp[0];
	for(var i = 1; i < tmp.length; i++)
		camelized += tmp[i].charAt(0).toUpperCase() + tmp[i].substring(1);
	return camelized;
}

function $A(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) return iterable.toArray();
  var length = iterable.length || 0, results = new Array(length);
  while (length--) results[length] = iterable[length];
  return results;
}

function _concat(a, b) {
	for (var i = 0, node; node = b[i]; i++)
		a.push(node);
	return a;
}

Function.prototype.bind = function()
{
	// wenns nur ein arg gibt und dies undefined is, die function methode zurückgeben
	if (arguments.length < 2 && typeof arguments[0] == "undefined") return this;
	
	// this zeigt auf die zu bindende methode - merken als closure
	var __method = this;
	
	// aus dem arguments "object" ein array machen (für .shift() und .concat())
	var args = $A(arguments);
	
	// das erste arg (wunsch-scope-obj) merken und aus args entfernen (Array.shift ist JS standard)
	var object = args.shift();
	
	// annonyme function zurückgeben - nur so klappt wohl die closure für __method
	return function() {
		// methode mit dem wunschkontext aufrufen und die argumente übergeben
		// über concat werden die argumente die beim bind() aufruf übergeben wurden
		// (der erste wurde entfernt) mit denen die beim späteren aufruf übergebenen
		// werden zusammengefasst - erst binArgs, dann die "späteren"
		// return __method.apply(object, args.concat($A(arguments)));
		return __method.apply(object, _concat(args, $A(arguments)));
	}

}

Function.prototype.bindAsEventListener = function() {
	var __method = this, args = $A(arguments), object = args.shift();
	return function(event) {
		return __method.apply(object, _concat([event], args));
	}
}

function jsfAddEvent(elm, type, pFunc )
{
   if(elm.addEventListener)
      elm.addEventListener(type, pFunc, false );
   else if (elm.attachEvent)
   {
      elm['e' + type + pFunc] = pFunc;
      elm[type + pFunc] = function() { elm['e' + type + pFunc](window.event); }
      elm.attachEvent('on' + type, elm[type + pFunc] );
   }
}

function jsfRemoveEvent(elm, type, pFunc )
{
   if(elm.removeEventListener)
      elm.removeEventListener( type, pFunc, false );
   else if (elm.detachEvent)
   {
      elm.detachEvent('on' + type, elm[type + pFunc] );
      elm[type + pFunc] = null;
      elm['e' + type + pFunc] = null;
   }
}


function setStylesheetStyle(selektor, property, value)
{
	if(!document.styleSheets || !selektor || !property) return null;
	for(var i = document.styleSheets.length-1; i >= 0; i--){
		try {
			var rules = (typeof document.styleSheets[i].rules != 'undefined') ?
				document.styleSheets[i].rules : 	// IE
				document.styleSheets[i].cssRules; 	// MZ
			for(var j = rules.length-1; j >= 0; j--){
				if(rules[j].selectorText == selektor){
					rules[j].style[property.camelize()] = value;
					return true;
				} else {
					tmp = rules[j].selectorText.split(',');
					for(s=0; s < tmp.length; s++){
						if(tmp[s] == selektor)
						{
							rules[j].style[property.camelize()] = value;
							return true;
						}
					}
				}
			}
		} catch (e) {}
	}
	return false;
}

/*
function getDocWidth()
{
	if(navigator.userAgent.indexOf('MSIE') > -1)
		return document.documentElement.clientWidth;
		
	return window.innerWidth;
}

function getDocHeight()
{
	if(navigator.userAgent.indexOf('MSIE') > -1)
		return document.documentElement.clientHeight;

	return window.clientHeight;
}
*/

function getDocHeight() {
    var D = document;
    return Math.max(
        Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
        Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
        Math.max(D.body.clientHeight, D.documentElement.clientHeight)
    );
}

/*
*	AJAX
*/
jsf.ajax = new (function()
{
	this.getXMLHttpRequest = function()
	{
		if(window.XMLHttpRequest) return new XMLHttpRequest();
		if(window.ActiveXObject){
			try {
				return new ActiveXObject("Msxml2.XMLHTTP"); // neuer IE
			} catch(e){
				try { return new ActiveXObject("Microsoft.XMLHTTP"); } // alter IE 
				catch(e){ return null; }
			}
		}
		return null;
	}

	this.request = function(url, params, onSuccess)
	{
		if(!url) return alert("jsfAjax2: no URL !");
		params = jsfObjectToUrlParam(params);
		var xmlHttpRequest = jsf.ajax.getXMLHttpRequest();
		if(!xmlHttpRequest){
			alert("Es konnte kein xmlHttpRequest erstellt werden");
			return false;
		}	
		xmlHttpRequest.open('POST', url, true);
		xmlHttpRequest.onreadystatechange = function readyStateHandler()
		{
			if(xmlHttpRequest.readyState < 4) return false;
			if(xmlHttpRequest.status == 200 || xmlHttpRequest.state == 304){
				if(onSuccess) onSuccess(xmlHttpRequest.responseText, xmlHttpRequest.responseXML);
			} else 
				alert("[" + xmlHttpRequest.status + xmlHttpRequest.statusText + "]" + " \nFehler bei der datenübertragung");
		};
		xmlHttpRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xmlHttpRequest.send(params);
	}

})();

function jsfObjectToUrlParam(_obj, _pre)
{
	if(jsfTypeOf(_obj) == 'string') return _obj;
	_pre = _pre ? _pre : '';
	function __cast(obj, pre){
		var param = '';
		for(var i in obj){
			if(jsfTypeOf(obj[i]) == 'array' || jsfTypeOf(obj[i]) == 'object')
				param += pre ? __cast(obj[i], pre + '[' + i + ']') : __cast(obj[i], i);
			else
				param += pre ? '&' + pre + '[' + i + ']=' + encodeURIComponent(obj[i]) : '&' + pre + i + '=' + encodeURIComponent(obj[i]);	
		}
		return param;
	}
	return __cast(_obj, _pre).replace(/^&/, '');
}

function jsfEvalJsonResponse(jsonText)
{
	var data = eval(jsonText);
	if(!data.state)
	{
		alert('evalJsonResponse Error');
		for(var i in data.error)
			console.log(data.error[i]);
		return false;
	}
	return data;
}


function jsfTypeOf(obj)
{
	if(!obj) return 'undefined';
	if(typeof(obj) == 'object')
		return typeof(obj.length) == 'number' ? 'array' : 'object';
	return typeof(obj);
}



/*
*	ajax layer inhalte laden und anzeigen
*	=> hier wird der solutionfinder gestatet !
*		- er läuft sonst nicht an wenn die daten über ajax als innerHTML eingefügt werden !
*		- javascript wird dann nicht ausgeführt
*/
var ajax_cache = {};
var sfApp = null;
function showAjaxContent(url)
{
	var sf = url.match(/solutionfinder/) ? '&sl=true' : '';

//	if(url.match(/Kontakt.php/) || url.match(/contact.php/))
//		return showIframe(url);

	if(!sf && ajax_cache[url])
		return fillAjaxContent(ajax_cache[url]);
	
	jsf.ajax.request(url + '?ajax=true' + sf, null, function(text, xml){
		ajax_cache[url] = text;
		fillAjaxContent(text);
		
		// solutionfinder starten, wenn er noch nicht läuft, sonst neu starten
		if(sf)
		{
			//if(!sfApp)
				sfApp = new solutionfinderApp();
			//else
			//	sfApp.init();
			document.getElementById('ajax_content').style.position = 'absolute';
			document.getElementById('ajax_content').style.top = '10px';
			document.getElementById('ajax_content').style.marginTop = '0px';
		}
		if(url.match(/Kontakt.php/) || url.match(/contact.php/))
		{
			addShadow('orange_box'); 
			addShadow('form_box'); 
			addShadow('captcha_box'); 
			addShadow('small_print_box'); 
			addShadow('editmode_info_layer');
		}
	});
}


function fillAjaxContent(html)
{
	if(!document.getElementById('ajax_bg'))
		document.body.appendChild(createElm('div', null, 'ajax_bg'));

	if(!document.getElementById('ajax_content'))
	{
		document.body.appendChild(createElm('div', 'ajax_shadow', 'ajax_content'));		
		//setTimeout(function(){ addShadow('ajax_shadow'); document.getElementById('ajax_content').style.position = 'absolute'; }, 100);
	}

	document.getElementById('ajax_bg').style.display = 'block';
	var h = document.getElementById('ajax_bg').offsetHeight / 2;
	var ajax_content = document.getElementById('ajax_content');
	ajax_content.style.visibility = 'hidden';
	ajax_content.style.width = '';
	ajax_content.innerHTML = html;
	ajax_content.style.display = 'block';
	addShadow('ajax_shadow');
	
	// die größe der beiden spalten bei layer 2 automatisch anpassen
	var left = document.getElementById('layer2_leftCol');
	var right = document.getElementById('layer2_rightCol');
	if(left && right && left.firstChild)
	{
		right.style.width = left.firstChild.offsetWidth + 'px';
		ajax_content.style.width = left.firstChild.offsetWidth * 2 + 'px';
		
		while(right.offsetHeight > left.firstChild.offsetHeight && right.offsetWidth < 450)
		{
			ajax_content.style.width = ajax_content.offsetWidth + 5 + 'px';
			right.style.width = right.offsetWidth + 5 + 'px';
		}
	}
	
	// layer 2 ohne bild
	if(left && right && !left.firstChild)
		ajax_content.style.width = '482px';
	
	ajax_content.style.marginLeft = '-' + (ajax_content.offsetWidth / 2) + 'px';
	
	ajaxLayerAlign();
	
	ajax_content.style.visibility = 'visible';
	
	initMoreLinks();
	initLinks(ajax_content);
	
	addShadow('shadow', [], document.getElementById('ajax_content'));
		
	// nur für die dienstleistungsübersicht
	addShadow('outer_0', [], document.getElementById('ajax_content'));
}
function closeAjaxContent()
{
	document.getElementById('ajax_content').innerHTML = '';
	document.getElementById('ajax_bg').style.display = 'none';
	document.getElementById('ajax_content').style.display = 'none';
}
function ajaxLayerAlign()
{
	var ajax_content = document.getElementById('ajax_content');	
	if(!ajax_content)
		return;

	if(ajax_content.offsetHeight > document.documentElement.clientHeight)
	{
		ajax_content.style.position = 'absolute';
		ajax_content.style.top = '5px';
		ajax_content.style.marginTop = '0';
		window.scrollTo(0, 0);
	}
	else
	{
		ajax_content.style.position = 'fixed';
		ajax_content.style.top = '50%';
		ajax_content.style.marginTop = '-' + (ajax_content.offsetHeight / 2) + 'px';
	}
}



function getPageLeft(elm)
{
	var left = 0;
	while(elm.offsetParent && elm != document.body)
	{
		left += elm.offsetLeft;
		elm = elm.offsetParent;
	}
	return left;
}
function getPageTop(elm)
{
	var top = 0;
	while(elm.offsetParent && elm != document.body)
	{
		top += elm.offsetTop;
		elm = elm.offsetParent;
	}
	return top;
}


function fixEvent(event)
{
	event = event || window.event;
	event.key = event.which ? event.which : event.keyCode;
	
	// beim IE target fixen
	if(!event.target && event.srcElement)
		event.target = event.srcElement;
	
	// mouseposition relativ zum document
	if(event.pageX || event.pageY)
	{
		event.docX = event.pageX;
		event.docY = event.pageY;
	}
	else if(event.clientX || event.clientY)
	{
		event.docX = event.clientX;// + document.body.scrollLeft + document.documentElement.scrollLeft;
		event.docY = event.clientY;// + document.body.scrollTop + document.documentElement.scrollTop;
	}
	
	// mouseposition relativ zum element
	// start ist die obere linke position (border ist im elm)
	// nicht wie im IE - border ist außerhalb...
	event.elmX = event.docX - getPageLeft(event.target);
	event.elmY = event.docY - getPageTop(event.target);
	
	// buttons erkennen
	if(!event.relatedTarget)
	{
		if(event.button == 1) event.btn = 'left';
		if(event.button == 4) event.btn = 'middle';
		if(event.button == 2) event.btn = 'right';
	}
	else
	{
		if(event.button == 0) event.btn = 'left';

		if(event.button == 1) event.btn = 'middle';
		if(event.button == 2) event.btn = 'right';

	}
	
	try {
		// related target bei mouseover und mouseout im IE fixen
		if(event.type == 'mouseover' && !event.relatedTarget)
			event.relatedTarget = event.fromElement;
		if(event.type == 'mouseout' && !event.relatedTarget)
			event.relatedTarget = event.toElement;
	} catch(e){}
	
	/*
	*	crossbrowser mouseenter und mouseleave
	*	- wird bei mouseover und mouseout augerufen
	*	- true wenn wirklich das element verlassen/betreten wird
	*	- false wenn die maus nicht wirklich das element betritt bzw. verlässt,
	* 	  also nur childs den event auslösen
	*
	*	=> es gibt noch fehler mit textfeldern !!
	*	=> jsf.elmExt.isChildOf muss manuell aufgerufen werden, sonst gibt es fehler bei nodeName abfrage bei $(elm)
	*	=> isChildOf arbeitet mit try {} um die fehler zu unterdrücken
	*/
	if((event.type == 'mouseover' || event.type == 'mouseout'))
		event.mouseleave = event.mouseenter = function(elm){ return !(this.relatedTarget && (this.relatedTarget == elm || isChildOf(this.relatedTarget, elm))); }

	return event;
}

function isChildOf(elm, root)
{
	if(elm == root) return false;
	try {
		while(elm && elm != root && elm.parentNode)
			elm = elm.parentNode;
		return elm == root;
	} catch(e) { }
	return false; 
}



function inArray(val, arr)
{
	if(typeof(arr.length) != 'undefined')
	{
		for(var i=0; i < arr.length; i++)
			if(arr[i] == val)
				return true;
		return false;
	}
	else if(typeof(arr) == 'object')
	{
		for(var i in arr)
			if(arr[i] == val)
				return true;
	}
	
	return false;
}

function createElm(tagName, className, id)
{
	var elm = document.createElement(tagName);
	if(className) elm.className = className;
	if(id) elm.id = id;
	return elm;
}

function getUsedStyle(elm, property, parseNumber)
{
	var val = window.getComputedStyle ? getComputedStyle(elm, '')[property] : elm.currentStyle[property];
	val = parseNumber ? jsf.parseNumber(val) : val;
	if(!val) return '';
	return val;
}


function setAlpha(elm, val)
{
	if(val == 100){
		elm.style.opacity = 1;
		elm.style.MozOpacity = 1;
		elm.style.KhtmlOpacity = 1;
		elm.style.filter = 'none';			
	} else {
		elm.style.opacity = (val/100);
		elm.style.MozOpacity = (val/100);
		elm.style.KhtmlOpacity = (val/100);
		elm.style.filter = 'alpha(opacity=' + val + ');';			
	}
	return elm;
}

/*
*	die keywords im content einrichten
*	- content_keywords wird global durch das we:doc inc/content_keywords.php definiert
*	- wenns nicht vorhanen ist, wird nichts eingerichtet
*/
function initContentKeywords()
{

//	if(!content_keywords)
//		return alert('initContentKeywords() :  keine keywords');

	var keyword_layer = document.getElementById('keyword_layer'),
		keyword_layer_inner = document.getElementById('keyword_layer_inner');

	// für die index zuteilung ein array name => index erstellen
	var keyIndex = {};
	for(var k=0; k < content_keywords.length; k++)
		for(var w=0; w < content_keywords[k].words.length; w++)
			keyIndex[content_keywords[k].words[w]] = k;
	
	// alle spans der seite durchgehen, alle mit der content_keyword klasse werden behandelt
	var spans = document.getElementsByTagName('span');
	for(var i=0; i < spans.length; i++)
	{
		if(spans[i].className == 'content_keyword')
		{
			spans[i].kIndex = keyIndex[spans[i].innerHTML.trim()];
			spans[i].onmousemove = function(event)
			{
				event = fixEvent(event);
				var _this = this;
				clearTimeout(this.outTimer);
				clearTimeout(this.timer);
				this.timer = setTimeout(function(){
					keyword_layer_inner.innerHTML = '<span style="color:#DA980C;">' + content_keywords[_this.kIndex].words[0] + '</span> ' + content_keywords[_this.kIndex].teaser;
					if(content_keywords[_this.kIndex].link)
					{
						if(content_keywords[_this.kIndex].ajax)
							keyword_layer_inner.innerHTML += ' <a href="javascript:showAjaxContent(\'' + content_keywords[_this.kIndex].link.href + '\');" class="more_link">mehr</a>';
						else
							keyword_layer_inner.innerHTML += ' <a href="' + content_keywords[_this.kIndex].link.href + '" target="' + content_keywords[_this.kIndex].link.target + '" class="more_link">mehr</a>';
					}
					initLinks(keyword_layer_inner);
					keyword_layer.style.left = (event.docX + 15) + 'px';
					keyword_layer.style.top = (event.docY) + 'px';
					keyword_layer.style.display = 'inline';
					keyword_layer.style.marginTop = '-' + (keyword_layer.offsetHeight / 2) + 'px';
				}, 300);
				keyword_layer.onmouseover = function(event)
				{
					clearTimeout(_this.outTimer);
				}
				keyword_layer.onmouseout = function(event)
				{
					_this.onmouseout();
				}
			}
			spans[i].onmouseout = function(event)
			{
				clearTimeout(this.timer);
				this.outTimer = setTimeout(function(){
					keyword_layer.style.display = 'none';
				}, 300);
			}
		}
	}
	

}

/*
*	die more aufklapplinks im content einrichten
*	- jede headline oder erster nachfahre mit 'with_more_link' oder 'with_answer_link' klasse bekommt einen more link
*	- der inhalt dazu ist der nächste nachbar von der headline mit der klasse 'more_box' oder 'answer_box'
*	- das kann direkt ein <p> sein oder (über den we editor) ein <span> in einem p
*
*	@19.04.2011
*	- für den druck sollen alle more_box'n offen sein
*/
function initMoreLinks()
{
	var lang = ('' + document.location).match("/de/") ? 'de' : 'en';
	var printMode = ('' + document.location).match("print=true") ? true : false;
	var elementTypes = [ 'h2', 'h3', 'span' ];
	for(var t=0; t < elementTypes.length; t++)
	{
		var elmements = document.body.getElementsByTagName(elementTypes[t]);
		for(var i=0; i < elmements.length; i++)
		{
			if(!elmements[i].hasMore && (elmements[i].className == 'with_more_link' || (elmements[i].firstChild && elmements[i].firstChild.className == 'with_more_link') || 
			   elmements[i].className == 'with_answer_link' || (elmements[i].firstChild && elmements[i].firstChild.className == 'with_answer_link')))
			{
				//console.log('elmements[i]: ' + elmements[i].nodeName);
				//console.log('elmements[i]: ' + elmements[i].className);

				elmements[i].hasMore = true;

				// das nächste element bestimmen, bei leerzeichen ist es erstmal ein textnode
				var next = elmements[i].nextSibling;
				var count = 0;
				//console.log('node start: ' + next.nodeName);
				while((next.nodeName == '#text' || next.nodeName == 'BR') && count++ < 5)
				{
					//console.log(next.nodeName);
					next = next.nextSibling;
				}
				//console.log('node end: ' + next.nodeName);
				//console.log('node end class: ' + next.className);

				//console.log(next.innerHTML);
				
				// more

				if(next.className == 'more_box' || (next.firstChild && next.firstChild.className == 'more_box'))
				{
					// wenn der firstChild nur die klasse hat ist nur er unsichtbar, das übernimmt sein parent, der p
					if(next.firstChild && next.firstChild.className == 'more_box')
						next.firstChild.style.display = 'inline';
					
					// @19.04.2011 im druck sollen die boxen alle offen sein
					if(!printMode)
						next.style.display = 'none';
					
					//console.log('found: ' + next.innerHTML);
					
					//if(elmements[i].className == 'with_more_link')
					//	var moreLink = elmements[i];
					//else
					//{
						var moreLink = createElm('a');
						moreLink.innerHTML = lang == 'de' ? 'mehr' : 'more';
					//}
					moreLink.className = 'switch_more_link';
					
					moreLink.href = 'javascript:void(0)';
					moreLink.onfocus = function(){ this.blur(); }
					moreLink.onmousedown = function(event){ event = fixEvent(event); event.cancelBubble = true; return false; };
					moreLink.box = next;
					jsfAddEvent(moreLink, 'mousedown', function(){ 
						//console.log(this);
						var display = window.getComputedStyle ? getComputedStyle(this.box, '').display : this.box.currentStyle.display;
						this.className = display == 'none' ? 'switch_more_link_open' : 'switch_more_link';
						this.box.style.display = display == 'none' ? 'inline' : 'none';
						if(this.box.firstChild)
							this.box.style.display = display == 'none' ? 'inline' : 'none';

						// die ajax box neu ausrichten (falls sie offen ist)
						ajaxLayerAlign();

					});
					//if(elmements[i].className != 'switch_more_link')
						elmements[i].appendChild(moreLink);
				}
				
				// answer
				if(next.className == 'answer_box' || (next.firstChild && next.firstChild.className == 'answer_box'))
				{
					// wenn der firstChild nur die klasse hat ist nur er unsichtbar, das übernimmt sein parent, der p
					if(next.firstChild && next.firstChild.className == 'answer_box')
						next.firstChild.style.display = 'inline';
					next.style.display = 'none';
					//console.log('found: ' + next.innerHTML);
					
					var moreLink = createElm('a', 'switch_answer_link');
					moreLink.innerHTML = lang == 'de' ? 'Antwort' : 'answer';
					moreLink.href = 'javascript:void(0)';
					moreLink.onfocus = function(){ this.blur(); }
					moreLink.box = next;
					jsfAddEvent(moreLink, 'mousedown', function(){ 
						//console.log(this);
						var display = window.getComputedStyle ? getComputedStyle(this.box, '').display : this.box.currentStyle.display;
						this.className = display == 'none' ? 'switch_answer_link_open' : 'switch_answer_link';
						this.box.style.display = display == 'none' ? 'inline' : 'none';
						if(this.box.firstChild)
							this.box.style.display = display == 'none' ? 'inline' : 'none';


						// die ajax box neu ausrichten (falls sie offen ist)
						ajaxLayerAlign();
					});
					elmements[i].appendChild(moreLink);
				}
			}
		}
	}
}

jsfAddEvent(window, 'load', initMoreLinks);

/*
*	die manuell gepflegten product tables im content fixen
*	- hier muss vor dem anmelde btn eine zelle eingefügt werden
*/
function fixContentProductsTables()
{
	var tables = document.getElementsByTagName('table');
	for(var i=0; i < tables.length; i++)
	{
		if(tables[i].className == 'content_table')
		{
			var tds = tables[i].getElementsByTagName('td');
			if(tds.length == 3)
			{
				// den registration link fixen
				tds[2].firstChild.innerHTML = ('' + document.location).match('/de/') ? 'Anmeldung' : 'Registration';
				tds[2].firstChild.className = 'registration_link';
				var img = document.createElement('img');
				img.src = '/img/link_arrow_left_white.png';
				tds[2].firstChild.appendChild(img);
			
				tds[2].className = 'content_table_btn_td';
				var td = document.createElement('td');
				td.className = 'content_table_free_td';
				tds[0].parentNode.insertBefore(td, tds[2]);
				
				
			}
		}
	}
}
jsfAddEvent(window, 'load', fixContentProductsTables);

/*
*	die schlagschatten erzeugen
*/
function addShadow(className, exclude, target)
{
	exclude = exclude ? exclude : [];
	target = target ? target : document;
	var elements = target.getElementsByTagName('div');
	for(var i=0; i < elements.length; i++)
	{
		if(elements[i].className == className)
		{
			if(getUsedStyle(elements[i], 'position') != 'absolute' && getUsedStyle(elements[i], 'position') != 'fixed')
				elements[i].style.position = 'relative';
				
			if(!inArray('top_left', exclude))
				elements[i].appendChild(createElm('div', 'shadow_top_left'));
			if(!inArray('top', exclude))
				elements[i].appendChild(createElm('div', 'shadow_top'));
			if(!inArray('top_right', exclude))
				elements[i].appendChild(createElm('div', 'shadow_top_right'));
			if(!inArray('right', exclude))
				elements[i].appendChild(createElm('div', 'shadow_right'));

			if(!inArray('bottom_right', exclude))
				elements[i].appendChild(createElm('div', 'shadow_bottom_right'));
			if(!inArray('bottom', exclude))
				elements[i].appendChild(createElm('div', 'shadow_bottom'));
			if(!inArray('bottom_left', exclude))
				elements[i].appendChild(createElm('div', 'shadow_bottom_left'));
			if(!inArray('left', exclude))
				elements[i].appendChild(createElm('div', 'shadow_left'));
		}
	}
}
jsfAddEvent(window, 'load', function()
{
	addShadow('shadow');
	addShadow('left_nav_a', [ 'top_right', 'right', 'bottom_right' ]);
	addShadow('left_nav_a_active', [ 'top_right', 'right', 'bottom_right' ]);
	addShadow('left_nav_b', [ 'top_right', 'right', 'bottom_right' ]);
	addShadow('left_nav_b_active', [ 'top_right', 'right', 'bottom_right' ]);
	addShadow('left_nav_c', [ 'top_right', 'right', 'bottom_right', 'bottom_left', 'top' ]);
	addShadow('left_nav_c_active', [ 'top_right', 'right', 'bottom_right', 'bottom_left', 'top' ]);
	addShadow('left_nav_d', [ 'top_right', 'right', 'bottom_right', 'bottom_left', 'top' ]);
	addShadow('left_nav_d_active', [ 'top_right', 'right', 'bottom_right', 'bottom_left', 'top' ]);
	addShadow('left_navigation', [ 'top_left', 'top', 'bottom', 'bottom_left', 'left' ]);
});

/*
*	alle links mit target="_top" auf den ajax layer schicken
*
*	wird beim laden vom dokument gemacht und muss für die content keywords 
*	nochmal beim öffnen gemacht werden
*/
jsfAddEvent(window, 'load', initLinks);

function initLinks(target)
{
	if(!target.getElementsByTagName) target = document.body;
	var links = target.getElementsByTagName('a');
	for(var i=0; i < links.length; i++)
	{
		// ajax layer
		if(links[i].target == '_top')
		{

			links[i].href = 'javascript:showAjaxContent(\'' + links[i].href + '\');';
			links[i].target = '';
		}
		// anmelden/kostenloses angebot ohne pfeil
		if(links[i].className == 'registration_link')
		{
			//console.log(links[i].innerHTML);
			if(!(links[i].innerHTML + '').match('<img'))
				links[i].innerHTML += '<img src="/img/link_arrow_left_white.png" />';
		}
	}
}


/*
*	newsticker einrichten
*/
function initNewsticker()
{
	newstickerManager = new NewstickerManager(newstickerItems);
}

function NewstickerManager(itemData)
{
	this.itemData = itemData;
	this.target = document.getElementById('newsticker_content');
	
	this.init();
}
NewstickerManager.prototype.init = function()
{
	this.timeout = 5000;
	this.active = 0;
	this.items = [];
	this.maxHeight = 0;
	for(var i=0; i < this.itemData.length; i++)
	{
		var outer = document.createElement('div');
		outer.className = 'newsticker_inner';
		outer.innerHTML = this.itemData[i].content;
		
		if(this.itemData[i].link)
		{
			var a = document.createElement('a');
			a.className = 'more_link';
			a.href = this.itemData[i].link;
			if(this.itemData[i].target == '_top')
				a.href = 'javascript:showAjaxContent("' + this.itemData[i].link + '");';
			else
				a.target = this.itemData[i].target;
			a.innerHTML = lang == 'de' ? 'mehr' : 'more';
			outer.appendChild(a);
		}
		
		this.target.appendChild(outer);
		
		// die box soll fest auf die maximale größe angezeigt werden
		if(outer.offsetHeight > this.maxHeight)
			this.maxHeight = outer.offsetHeight;
			
		if(i)
			outer.style.display = 'none';
		//else
		//	this.target.style.height = outer.offsetHeight + 'px';
		
		outer.style.position = 'absolute';
		outer.style.left = '0px';
		outer.style.top = '0px';
		
		this.items.push(outer);
	}
	
	// alle kriegen die maximale höhe für die blendung
	for(var i=0; i < this.items.length; i++)
		this.items[i].style.height = this.maxHeight - 18 + 'px';
	
	this.target.style.height = this.maxHeight + 'px';
	this.target.style.position = 'relative';
	this.target.style.overflow = 'hidden';
	
	setTimeout(function(){ this.next(); }.bind(this), this.timeout);
}
NewstickerManager.prototype.next = function()
{
	var nextIndex = this.active + 1 >= this.items.length ? 0 : this.active + 1;
	var currentItem = this.items[this.active];
	var nextItem = this.items[nextIndex];
	
	nextItem.style.top = currentItem.offsetHeight + 'px';
	nextItem.style.display = 'block';
	
	var moveHeight = nextItem.offsetHeight;
	//var heightDiff = nextItem.offsetHeight - currentItem.offsetHeight;
	var pos = 0;
	function move()
	{
		pos += 0.1;
		if(pos >= 1)
		{
			nextItem.style.top = '0px';
			//this.target.style.height = nextItem.offsetHeight + 'px';
			currentItem.style.display = 'none';
			clearInterval(this.timer);

			this.active = nextIndex;
			setTimeout(function(){ this.next(); }.bind(this), this.timeout);
		}
		else
		{
			nextItem.style.top = ((1 - pos) * nextItem.offsetHeight) + 'px';
			currentItem.style.top = '-' + (pos * nextItem.offsetHeight) + 'px';
			//this.target.style.height = currentItem.offsetHeight + (pos * heightDiff) + 'px';
		}
	}
	this.timer = setInterval(move.bind(this), 30);
}




/*
*	=> nur für die /index.php
*
*	die boxen für die wahl von corporate/private für das linkziel
*/
jsfAddEvent(window, 'load', function(){
	jsfAddEvent(document.body, 'mousedown', function(event)
	{ 
		event = fixEvent(event);
		if(event.target.id == 'corporateLink' || event.target.id == 'privateLink')
			return;
		var box = document.getElementById('targetBox');
		if(box) box.style.display = 'none';
	
	});
});

function initTargetLinks(id)
{
	var links = document.getElementById(id).getElementsByTagName('a');
	for(var i=0; i < links.length; i++)
	{
		if(links[i].href)
		{
			links[i]._href = links[i].href;
			links[i].href = 'javascript:void(0);';
			links[i].isTargetLink = true;
			jsfAddEvent(links[i], 'mousedown', function(event){ openTargetSelect(this, fixEvent(event)); });
		}
	}
}

function openTargetSelect(_link, event)
{
	jsf.ajax.request('/ajax_get_url_wraps.php?url=' + _link._href, null, function(text, xml){
		_link.wraps = eval(text);
		targetLinks(_link, event);
	});
}

function targetLinks(_link, event)
{
	var box = document.getElementById('targetBox');
	
	var corporateBox = document.getElementById('corporateBox');
	var corporateLink = document.getElementById('corporateLink');
	var privateBox = document.getElementById('privateBox');
	var privateLink = document.getElementById('privateLink');
	if(!box)
	{
		box = createElm('div', null, 'targetBox');
		document.body.appendChild(box);
		
		corporateBox = createElm('div', 'targetShadow', 'corporateBox');
		box.appendChild(corporateBox);
		
		corporateLink = createElm('a', null, 'corporateLink');
		corporateLink.onmousedown = function(){ return false; }
		corporateBox.appendChild(corporateLink);
		
		privateBox = createElm('div', 'targetShadow', 'privateBox');
		box.appendChild(privateBox);
		
		privateLink = createElm('a', null, 'privateLink');
		privateLink.onmousedown = function(){ return false; }
		privateBox.appendChild(privateLink);
		
		addShadow('targetShadow');
	}
	
	corporateBox.style.display = _link.wraps.corporate ? 'block' : 'none';
	corporateLink.href = _link.wraps.corporate;
	corporateLink.name = 'corporateLink';
	
	privateBox.style.display = _link.wraps.private ? 'block' : 'none';
	privateLink.href = _link.wraps.private;
	privateLink.name = 'privateLink';

	// wenns der solutionfinder ist, wird er direkt als ajax layer geöffnet
	if(_link.wraps.corporate.match(/solutionfinder/))
	{
		corporateLink.href = 'javascript:showAjaxContent(\'' + corporateLink.href + '\');';
		privateLink.href = 'javascript:showAjaxContent(\'' + privateLink.href + '\');';
	}
	
	var lang = (document.location + '').match('\/de\/') ? 'de' : 'en';
	if(_link.wraps.corporate && _link.wraps.private)
	{
		corporateLink.innerHTML = lang == 'de' ? 'Besuchen Sie unsere Webseite im Auftrag Ihres Unternehmens?' : 'Are you here as a representative of your company?';
		privateLink.innerHTML = lang == 'de' ? 'Sind Sie privat hier?' : 'Are you here as a private individual?';
	}
	else if(_link.wraps.corporate)
	{
		corporateLink.innerHTML = lang == 'de' ? 'Dieser Link führt Sie zu unserer Webseite für Unternehmen <span class="linkMore">WEITER</span>' : 'This choice leads to our website for Corporate Clients <span class="linkMore">GO</span>';
		privateLink.innerHTML = '';
	}
	else if(_link.wraps.private)
	{
		corporateLink.innerHTML = '';
		privateLink.innerHTML = lang == 'de' ? 'Dieser Link führt Sie zu unserer Webseite für Privatkunden <span class="linkMore">WEITER</span>' : 'This choice leads to our website for Private Individuals <span class="linkMore">GO</span>';
	}
		
	box.style.display = 'block';
	box.style.position = 'absolute';
	box.style.zIndex = 10;
	box.style.background = 'orange';
	box.style.width = '1px';
	box.style.height = '1px';
	box.style.left = event.docX - 10 + 'px';
	box.style.top = event.docY - 20 + 'px';
	
	// falls die box links raus geht weiter nach rechts positionieren
	var leftOver = getPageLeft(corporateLink);
	if(leftOver < 0)
		box.style.left = event.docX + (leftOver*-1) - 10 + 'px';
	
	// falls die box rechts raus geht weiter nach links positionieren
	var rightOver = document.body.offsetWidth - (getPageLeft(privateLink) + privateLink.offsetWidth);
	if(rightOver < 0)
		box.style.left = event.docX + rightOver - 10 + 'px';
	
	// falls die box oben raus geht weiter nach unten positionieren
	var topOver = getPageTop(privateLink);
	if(topOver < 0)
		box.style.top = box.offsetTop - topOver + 'px';
}


/*
*	contact
*	- damit es als ajax layer läuft muss es global definiert sein
*/
var contactActiveSalutation = null;
function contactSelectSalutation(_item)
{
	if(contactActiveSalutation)
		contactActiveSalutation.className = 'radio';
	contactActiveSalutation = _item;
	contactActiveSalutation.className = 'radio_active';
	document.getElementById('salutation').value = _item.innerHTML;
}

function resetContactForm()
{
	document.getElementById('salutation').value = '';
	document.getElementById('herr').className = 'radio';
	document.getElementById('frau').className = 'radio';
	document.getElementById('form').reset();
}

/*
*	erst wird das formular an ein iframe zum captcha check gesendet
*	- das ruft diese function mit dem ergebnis auf
*/
function captchaChecked(state)
{
	// alles gut
	if(state)
	{
		document.getElementById('form').action = (document.getElementById('form').action + '').replace('&check_recaptcha=true', '');
		//document.getElementById('form').target = '_self';
		document.getElementById('form').submit();
		return;
	}
	// fehler
	alert(lang == 'de' ? 'Das reCAPTCHA wurde nicht richtig eingegegben.' : "The reCAPTCHA wasn't entered correctly.");
	//document.getElementById('recaptcha_response_field').focus();
	document.getElementById('captcha_headline').style.color = '#DA980C';
}

function submitContactForm(withoutCaptcha)
{
	var err = [];
	document.getElementById('salutation_td').style.color = '';
	document.getElementById('first_name').style.borderColor = '';
	document.getElementById('last_name').style.borderColor = '';
	document.getElementById('telephone').style.color = '';
	document.getElementById('email').style.color = '';
	
	if(!document.getElementById('salutation').value)
	{
		document.getElementById('salutation_td').style.color = '#DA980C';
		err.push(lang == 'de' ? 'Anrede' : 'Title');
	}
	else
		document.getElementById('salutation_td').style.color = '';
		
	if(!document.getElementById('first_name').value || document.getElementById('first_name').value == document.getElementById('first_name').title)
	{
		document.getElementById('first_name').className = 'input_text_err';
		err.push(lang == 'de' ? 'Vorname' : 'First Name');
	}
	else
		document.getElementById('first_name').className = 'input_text';
		
	if(!document.getElementById('last_name').value || document.getElementById('last_name').value == document.getElementById('last_name').title)
	{
		document.getElementById('last_name').className = 'input_text_err';
		err.push(lang == 'de' ? 'Nachname' : 'Last Name');

	}
	else
		document.getElementById('last_name').className = 'input_text';
		
	if(!document.getElementById('telephone').value || document.getElementById('telephone').value == document.getElementById('telephone').title)
	{
		document.getElementById('telephone').className = 'input_text_err';
		err.push(lang == 'de' ? 'Telefon' : 'Telephone Number');
	}
	else
		document.getElementById('telephone').className = 'input_text';
		
	if(!document.getElementById('email').value || document.getElementById('email').value == document.getElementById('email').title)
	{
		document.getElementById('email').className = 'input_text_err';
		err.push('Email');
	}
	else
		document.getElementById('email').className = 'input_text';
	
	if(!withoutCaptcha)
	{
		if(!frames['re_captcha_frame'].document.getElementById('recaptcha_response_field').value)
		{
			document.getElementById('captcha_headline').style.color = '#DA980C';
			err.push('reCAPTCHA');
		}
		else
			document.getElementById('captcha_headline').style.color = '';
	}
		
	if(err.length)
		return alert(lang == 'de' ? 'Bitte füllen sie alle Pflichtfelder aus:\n' + err.join('\n') : 'Please fill out all required fields:\n' + err.join('\n'));

	// reCaptcha werte übertragen (captcha wir im iframe geladen wg ajax)
	if(!withoutCaptcha)
	{
		document.getElementById('recaptcha_challenge_field').value = frames['re_captcha_frame'].document.getElementById('recaptcha_challenge_field').value;
		document.getElementById('recaptcha_response_field').value = frames['re_captcha_frame'].document.getElementById('recaptcha_response_field').value;
	}
	// wenn alle pflichtfelder ok sind noch die felder wo der title im feld steht (die nicht angefasst wurden) leeren
	var input = document.body.getElementsByTagName('input');
	for(var i=0; i < input.length; i++)
		if(input[i].value == input[i].title)
			input[i].value = '';
	var textarea = document.body.getElementsByTagName('textarea');
	for(var i=0; i < textarea.length; i++)
		if(textarea[i].value == textarea[i].title)
			textarea[i].value = '';
	
	document.getElementById('form').submit();
	
}


