function send(modul,data,data2) // modul = function, data = data send by ajax, data2 = parameters as an object for javascript function
{
	if (!modul) return;
	
	$('#loading').show();
	var param = 'ajax=true';
	
	if (isArray(modul)){ // more functions
		for (var i=0; i<modul.length; i++) param += '&modul'+i+'='+modul[i];
		param += '&modulNumber='+modul.length;
	}	
	else param += '&modul='+modul;
	
	if (data) $.each(data, function(key,value){ param += '&'+key+'='+escape(nl2br(value)); });

	$.ajax({
		type: 'POST',
		url: phpFile,
		dataType: 'json',
		data: param,
		success: function (answer){ answerAjax(answer,modul,data2); },
		error:answerError
	});
}
function answerError(noShow)
{
	$('#loading').hide(); $('#menu span').css('cursor','pointer');
	if (!noShow) write('error');
}
function answerAjax(answer,modul,data)
{
	if (!answer){ answerError(true); return; }
	answer = decodeObject(answer);
	$('#loading').hide();
	
	var error = answer.error;
	var info = answer.info;
	var success = answer.success;
	if (!info) info = Array();
	if (!success) success = Array();

	// error
	if (error) for (var i=0; i<error.length; i+=2) write2('',error[i+1]);
	if (local() && answer.mail) document.write(answer.mail.message);
	if (answer.sql) createText(document.body,'','',answer.sql);
	if (data && data.id && (error || info)){ $('.info2').remove(); $(data).before(createText(false,'','info2',(error)?error[1]:info[1])); } 
	
	// request array
	if (isArray(modul)) for (var i=0; i<modul.length; i++){
				
		if (info[modul[i]]) write(info[modul[i]]);	
		if (success[modul[i]] || info[modul[i]]){			
			if (data && data[modul[i]]) window[modul[i]](answer,data[modul[i]]);	
			else if (window[modul[i]]) window[modul[i]](answer);
		}
	} 
	
	// normal request
	else if (answer.modul && window[answer.modul]) window[answer.modul](answer);
	else if (success[modul] || info[modul]){
		if (info[modul] && obj(modul)) write2(modul,info[modul]); 
		if (window[modul] && data) window[modul](answer,data);
		else if (window[modul]) window[modul](answer);
	}
}
function answerPHP(json)
{
	var answer = eval('(' + json + ')');
	answerAjax(answer,answer.modul);
}
function phpVariable(variable,json)
{
	window[variable] = eval('(' + json + ')');
}
function sendEvt(element,data)
{
	if (isArray(data)){
		modul = data[0];
		send(modul,data[1],data[2]);
	} 
	else send(data);
}
function write(text,textSmall)
{
	var frame = info(false,text);
	setTimeout(function(){$(frame).remove();},15000);
}
function write2(id,text)
{
	$('#info').remove();
	
	var element;
	if (isArray(id)) element = $(id);
	else if (id != '') element = $('#'+id);
	if (!element) element = $('.submit'); 
	if (!element){ write(text); return; } 
	element.after('<span id="info"></span>');
	 
	var cont = obj('info');	
	createBreak(cont,2);
	var box = createBox(cont,'','boxOrange');
	createText(box,'','',text);	
	align(cont);
}
function infoInput(element,type)
{
	var frame = createContainer(document.body,'','info'); 
	positionSet(element,frame,-300);
	var cont = createBox(frame,'','boxOrange')
	createText(cont,'','',labels[element.id+'_box']); createBreak(cont);
	var input = createTextfieldNormal(cont,element.id,'input','',type,true,'submitField'); createBreak(cont);	
	input.select();	
	//$(element).bind('mouseout',function(){$(frame).remove();});
}
function info(element,text)
{	
	var frame = createContainer(document.body,'','info');
	if (element) positionSet(element,frame,-300);
	else positionSet(obj('content'),frame,200,0);
		
	var cont = createBox(frame,'','boxOrange');
	createText(cont,'','',text);	
	return frame;	
}
function infoDelete()
{
	$('.info').remove();
}
function positionSet(element,cont,left,top)
{
	var newLeft = positionLeft(element);
	var newTop = positionTop(element);
	
	if (left) newLeft += left;
	if (top) newTop += top;	
	//if ($.browser.msie || newTop+100 > window.outerHeight) newTop -= 100; // IE doesn't support window.outerHeight
	//else newTop += 50; // so it won't be hidden in the bottom
	
	cont.style.left = newLeft + 'px';
	cont.style.top = newTop + 'px';
}
function positionLeft(inputObj)
{
	var returnValue = inputObj.offsetLeft;
	while((inputObj = inputObj.offsetParent) != null){
		if(inputObj.tagName!='HTML')returnValue += inputObj.offsetLeft;
	}
	return returnValue;
}
function positionTop(inputObj)
{		
	var returnValue = inputObj.offsetTop;
	while((inputObj = inputObj.offsetParent) != null){
		if(inputObj.tagName!='HTML')returnValue += inputObj.offsetTop;
	}
	return returnValue;
}
function evtOver(element)
{
	element.className += '_over';
}
function evtOut(element)
{
	element.className = element.className.split('_')[0];
}
function refresh()
{
	location.reload();
}
function refresh2()
{
	document.location.href = '/';
}
function link(element,href)
{
	window.open(href);
}
function link2(element,href)
{
	document.location.href = href;
}
function isArray(variable)
{
	if (typeof variable == 'object') return true;
	else return false;
}
function isEmpty(object){
	for(var i in object) if(object.hasOwnProperty(i)) return false;
	return true;
}
function substring(string,start,minusEnd)
{	
	return string.substr(start,string.length + minusEnd);
}
function substring2(string,start,end)
{	
	if (end < 0) end = string.length + end - start;
	if (start < 0) start = string.length + start;
	if (end) return string.substr(start,end);
	return string.substr(start);
}
function removeChildren(element,leaveFirst)
{
	var children = element.childNodes;
	for (var i = children.length - 1; i >= 0; i--) { // start with the last
		if (leaveFirst && i == 0) continue;
		element.removeChild(children[i]);
	}
}
function obj(id)
{
	return document.getElementById(id);
}
function objEmpty(id,leaveFirst)
{
	var cont = document.getElementById(id);
	removeChildren(cont,leaveFirst);
	return cont;
}
function value(id)
{
	return document.getElementById(id).value;
}
function cValue(id)
{
	var element = obj(id);
	if (!element) return false;
	return element.checked;
}
function cgValue(id) // checkgroup
{
	var value = '';
	
	$('input[@name='+id+']').each(function(i){
		if (this.checked) value += 'x';
		else value += '-';
	});
	
	return value;
}
function pValid()
{
	var path = window.location.pathname;
	var index = path.lastIndexOf('/')+1;
	if (path.substr(index) != '') return true;
	return false;
}
function pValue()
{
	var path = window.location.pathname;
	var index = path.lastIndexOf('/')+1;
	return path.substr(index);
}
function sValue(element)
{
	var index = element.options.selectedIndex;
	var value = element.options[index].value;
	return value;
}
function rValue(id)
{
	var value;
	$('#'+id).children().each(function(i){ if (this.checked) value = $(this).next().html(); });	
	return value;
}
function lValue(id)
{
	return labels[id];
}
function xValue(id,value) // -x-xxxx
{
	var fields = labels[id+'_fields'];
	if (!fields) return;
	var spots = value.split('');	
	var texts = fields.split(',');
	var result = new Array();
	
	for (var i=0; i<spots.length; i++)	if (spots[i] == 'x') result.push(texts[i]);
	return result.join(', ');
}
function oValue(id,value) // object0
{
	var fields = labels[id+'_fields'];
	if (!fields) return;
	var texts = fields.split(',');
	var index = value.substr(id.length);
	return texts[index];
}
function adminLogin()
{
	var cont = createContainer(document.body,'admin');	
	if (window.adminLogged){
		createText(cont,'admin_txt'); createBreak(cont);
		createLink(cont,'adminLogout','link','','sendEvt','adminLogout')
	} 
	else createInput(cont,'adminLogin','','','password','submitField','enter'); 
}
function cookieSave(varArray,valueArray)
{
	var expires = 'Sat, 31 Dec 2050 20:00:00 GMT';

	document.cookie = 'name='+labels['title']+'; expires=' + expires + ';'; // add expires to every single variable
    for (var i=0; i<varArray.length; i++) document.cookie = varArray[i]+'='+valueArray[i]+'; expires='+expires+';';	 
}
function cookieLoad(fields)
{
	var content = new Object();	
	for (var i=0; i<fields.length; i++){
				
		var field = fields[i];
		var start = document.cookie.indexOf(field);
		if (start == -1) continue;
		start = start + field.length + 1;
		var value = document.cookie.substr(start);
		var end = value.indexOf(';');
		if (end != -1) content[field] = value.substr(0,end);
		else content[field] = value.substr(0);
	}	
	return content;
}
function cookieExists(fields)
{
	if(!document.cookie) return false;
	for (var i=0; i<fields.length; i++)	if (document.cookie.indexOf(fields[i]) == -1) return false;
	return true;
}
function cookieDelete(fields)
{
	var expires = 'Fri, 02 Jan 1970 00:00:00 UTC;';
	document.cookie = 'name=; expires=' + expires + ';';
	for (var i=0; i<fields.length; i++)	document.cookie = fields[i]+'=; expires=' + expires + ';';
}
function browserAlign(element,width)
{
	var browserWidth = window.innerWidth || (document.documentElement.clientWidth || document.body.clientWidth);
	var margin = (browserWidth-width)/2;
	if (margin < 0) margin = 0;
	element.style.marginLeft = margin+'px';
	element.style.width = width+'px';
	window.onresize = function(){browserAlign(element,width)};
}
function align(element)
{
	var parent = element.parentNode;
	var widthParent = parent.clientWidth;
	var width = element.clientWidth;
	var margin = (widthParent-width)/2;
	element.style.marginLeft = margin+'px';
}
function ucfirst(str)
{
    str += '';
    var f = str.charAt(0).toUpperCase();
    return f + str.substr(1, str.length-1);
}
function submitForm(element,formId)
{
	var data = new Object();
	
	if (isArray(formId)){
		var modul = formId[1];
		var children = obj(formId[0]).childNodes;
		data.id = formId[0];
	}
	else if (formId){
		var modul = formId;
		var children = obj(formId).childNodes;
	}
	else{		
		var modul = element.parentNode.id;
		var children = element.parentNode.childNodes;
	}
	
	// get the values of the textfields
	for (var i=0; i<children.length; i++){
		
		//if (formId){ // two container in between
			var children2 = children[i].childNodes;
			for (var j=0; j<children2.length; j++) data = submitElement(data,children2[j]);
		//} 
		data = submitElement(data,children[i]);
	} 
	
	// false input?
	if (data.error) write2(element,labels.errorUncomplete);
	else send(modul,data,element);
}
function submitField(element,fieldId)
{
	if (fieldId) var element = obj(fieldId);
	$(element).trigger('blur');
	if (!element.value || element.name == 'error') return;
	send(element.id,object(element.id,element.value));
}
function submitImageUpload(element,param)
{
	$('#loading').show();
	var form = param.form;
	if (param.data){
		form.action += '&'+param.data[0]+'=';
		if (isArray(param.data[1])) form.action += param.data[1].value; // input object
		else form.action += param.data[1];
	} 
	form.submit();
}
function asci(string)
{
	while (string.search(/ä/) != -1) string = string.replace(/ä/,'&auml;');
	while (string.search(/Ä/) != -1) string = string.replace(/Ä/,'&Auml;');
	while (string.search(/ö/) != -1) string = string.replace(/ö/,'&ouml;');
	while (string.search(/Ö/) != -1) string = string.replace(/Ö/,'&Ouml;');
	while (string.search(/ü/) != -1) string = string.replace(/ü/,'&uuml;');
	while (string.search(/Ü/) != -1) string = string.replace(/Ü/,'&Uuml;');
	while (string.search(/ß/) != -1) string = string.replace(/ß/,'&szlig;');
	while (string.search(/€/) != -1) string = string.replace(/€/,'&#x80;'); // euro sign
	return string;
}
function asciDecode(str)
{
	str = str.replace(/&#x27;/g,'\'');
	return str;
}
function submitElement(data,element)
{
	// trigger the check event	
	if (element.tagName == 'INPUT' && element.type != 'submit' && element.type != 'radio') $(element).trigger('blur');
	else if (element.tagName == 'TEXTAREA') $(element).trigger('keyup');
	else if (element.tagName == 'SELECT') $(element).trigger('change');	
	else if (element.className == 'selection') $(element).trigger('click');	
	else return data; // no form field
	
	// get the data or an error
	if (element.name == 'error') data.error = true; // error
	else if (element.type == 'checkbox'){
		if (element.name == 'mandatory' && !element.checked) data.error = true;
		else if (element.name) data[element.name] = cgValue(element.name);
		else data[element.id] = element.checked;	
	}
	else if (element.className == 'selection') data[element.id] = rValue(element.id);
	else if (element.tagName == 'SELECT') data[element.id] = sValue(element);
	else if (element.tagName == 'TEXTAREA') data[element.id] = asci(element.value);
	else data[element.id] = asci(element.value);
	return data;
}
function checkElement(element,param)
{
	var result = false;
	var type = param[0];
	var optional = param[1];	
	if (optional != 'second' && optional && element.value == '') return;

	if (optional == 'second'){
		var first = obj(substring(element.id,0,-1)); // delete the 2 in the end of id
		if (element.value == first.value) result = true;
		else result = false;
	}
	else if (type == 'selection'){ if (rValue(element.id)) result = true; } // radio
	else if (type == 'selectbox'){ if (element.options.selectedIndex != 0) result = true; }
	else result = check(element.value,type); 
	if (type == 'logon' && !result) result = check(element.value,'mail'); 
	
	if (result){
		element.style.borderColor = 'blue';
		element.name = '';
		$('#'+element.id+'_error').hide();
		if (type == 'selection' || type == 'selectbox') return true;
		$(element).unbind('keyup');
		return true;
	}
	else if (element.name != 'error'){ // not if it's wrong already
	
		element.style.borderColor = 'red';
		element.name = 'error';
		$('#'+element.id+'_error').show();
		if (type == 'selection' || type == 'selectbox') return false;
		eventBind(element,'checkElement','keyup',param); // now not just blur
		return false;
	}	
}
function check(text,type)
{
	var reg;
	switch(type)
	{	
		case 'mail':		reg = eval('/^([a-zA-Z0-9_\.\-])+[\@]([a-zA-Z0-9\-])+([\.]+[a-zA-Z0-9]{2,})*$/'); break;
		case 'website':		reg = eval('/^(([a-zA-Z0-9\-])+[\.])+[a-zA-Z0-9]{2,4}$/'); break;
		case 'password':	reg = eval('/^[a-zA-Z0-9§(\x20-\x7E)]{3,20}[^\"\']$/i'); break; // x20-x7E special characters, without stringbreaker 
		case 'prenumber':	reg = eval('/^0[0-9]{1,20}$/i'); break;
		case 'number':		reg = eval('/^[0-9]{1,20}$/i'); break;
		case 'postcode':	reg = eval('/^[0-9]{5}$/i'); break;
		case 'date':		reg = eval('/^[0-9]{1,2}[\.][0-9]{1,2}[\.][0-9]{4,4}$/i'); break;
		case 'birthdate':	reg = eval('/^[0-9]{1,2}[\.][0-9]{1,2}[\.][0-9]{4,4}$/i'); break;
		case 'message':		reg = eval('/^.{1,300}$/i'); break;
		case 'tags':		reg = eval('/^[a-z0-9\-äöüß ]{1,300}$/i'); break;
		case 'user':		reg = eval('/^[a-z0-9\-\.äöüß ]{3,10}$/i'); break;
		default:			reg = eval('/^[a-zA-Z0-9äöüß§(\x20-\x7E)]{0,100}[^\"\']$/i'); break;
	}

	if (type == 'message') text = nl2br(text);
	result = reg.test(text);
	if (type == 'birthdate' && result) result = checkDate(text);
	return result;
}
function checkDate(date)
{
	date = date.split('.');
	if (date[0] == 0 || date[0] > 31) return false;
	if (date[1] == 0 || date[1] > 12) return false;
	var now = new Date().getFullYear();
	if (date[2] < 1900 || date[2] > now-16) return false;
	return true;
}
function wrong(element)
{
	if (element.style.borderBottomColor == 'red') return true;
	return false;
}
function decodeUrl(str)
{
	var histogram = {}, histogram_r = {}, code = 0, str_tmp = [];
	var ret = str.toString();
	
	var replacer = function(search, replace, str){
		var tmp_arr = [];
		tmp_arr = str.split(search);
		return tmp_arr.join(replace);
	};
	
	// The histogram is identical to the one in urlencode.
	histogram['!'] = '%21';
	histogram['%20'] = '+';
	
	for (replace in histogram) {
		search = histogram[replace]; // Switch order when decoding
		ret = replacer(search, replace, ret) // Custom replace. No regexing   
	}
	
	// End with decodeURIComponent, which most resembles PHP's encoding functions
	//ret = decodeURIComponent(ret); // just utf-8
	ret = unescape(ret); // also iso but obsolet
	
	return ret;
}
function display(element,id)
{
	$('#'+id).toggle('slow');
}
function decodeAscii(string)
{
	// special german chars
	while (string.search(/&auml;/) != -1) string = string.replace(/&auml;/,'ä');
	while (string.search(/&Auml;/) != -1) string = string.replace(/&Auml;/,'Ä');
	while (string.search(/&ouml;/) != -1) string = string.replace(/ouml;/,'ö');
	while (string.search(/&Ouml;/) != -1) string = string.replace(/&Ouml;/,'Ö');
	while (string.search(/&uuml;/) != -1) string = string.replace(/&uuml;/,'ü');
	while (string.search(/&Uuml;/) != -1) string = string.replace(/&Uuml;/,'Ü');
	while (string.search(/&szlig;/) != -1) string = string.replace(/&szlig;/,'ß');
	return string;
}
function decodeObject(answer)
{
	$.each(answer,function(field1,value1){
		
		if (isArray(value1)) $.each(value1,function(field2,value2){

			if (isArray(value2)) $.each(value2,function(field3,value3){
				
				if (isArray(value3)) $.each(value3,function(field4,value4){
					answer[field1][field2][field3][field4] = decodeUrl(value4);
				});
				else answer[field1][field2][field3] = decodeUrl(value3);
			});
			else answer[field1][field2] = decodeUrl(value2);

		});
		else answer[field1] = decodeUrl(value1);
		
	});
	return answer;	
}
function nl2br(str) 
{
    return (str + '').replace(/([^>]?)\n/g, '$1<br>');
}
function thickboxAfterClose(id)
{
	if (id == 'menuContact') removeChildren(obj(id));
}
function thickboxClose()
{
	tb_remove();
}
function object(key1,value1,key2,value2,key3,value3,key4,value4,key5,value5)
{
	var object = new Object();
	object[key1] = value1;
	if (key2) object[key2] = value2;
	if (key3) object[key3] = value3;
	if (key4) object[key4] = value4;
	if (key5) object[key5] = value5;
	return object;
}
function in_array(item,arr){
	
	for(i=0;i<arr.length;i++) if (item == arr[i]) return true;
	return false;
}
function local()
{
	if (document.location.host == 'localhost') return true;
	return false;
}
function array_search( needle, haystack, strict ) {

    var strict = !!strict;
 
    for(var key in haystack){
        if( (strict && haystack[key] === needle) || (!strict && haystack[key] == needle) ){
            return key;
        }
    }
 
    return false;
}
Array.prototype.remove = function(s){
	var index = this.indexOf(s);
	if (this.indexOf(s) != -1) this.splice(index, 1);
}