window.addEvent('domready',function(){
	MooTools.lang.setLanguage("de-DE");
	//Leider Fehlen ein MooTools ein paar Übersetzungen
	MooTools.lang.set('de-DE', 'Form.Validator', $merge(MooTools.lang.get('Form.Validator'),{
		'validate-email': 'Bitte geben Sie eine gültige E-Mail Adresse an.',
		'validate-digits': 'Bitte geben Sie nur Ziffern ein.',
		'validate-numeric': 'Bitte geben Sie nur Ziffern und höchstens ein Komma ein.',
		'validate-one-required': 'Bitte geben Sie mindestens einen Wert an.',
		'validate-required-check': 'Dieser Haken muss gesetzt sein.',
		'validate-date-parts': 'Bitte geben Sie ein gültiges Datum an oder lassen Sie das Feld leer.',
		'validate-required-date-parts': 'Bitte geben Sie ein gültiges Datum an.'
	}));
	Form.Validator.add('validate-numeric', { //Überschreibe en-Validator für deutsche Zahlen
		errorMsg: Form.Validator.getMsg.pass('numeric'),
		test: function(element){
			return Form.Validator.getValidator('IsEmpty').test(element) ||
			(/^-?(?:0$0(?=\d*,)|[1-9]|0)\d*(,\d+)?$/).test(element.get('value'));
		}
	});

	Form.Validator.add('validate-date-parts',{
		errorMsg: 'Please enter a valid Date or leave blank.',
		test: function(element){
			if (!element.id){
				return true;
			}
			var fieldId=element.id.replace(/_[dmy]$/,'');
			var parentForm=element.getParents('form')[0];
			if (fieldId==element.id){
				return (element.value!='');
			}else{
				var valid=true;
				if (($(fieldId+'_d') && $(fieldId+'_d').value!="") && $(fieldId+'_m').value==""){
					valid=false;
				}else if (($(fieldId+'_d') && $(fieldId+'_d').value!="") && ($(fieldId+'_y') && $(fieldId+'_y').value=="")){
					valid=false;
				}else if ($(fieldId+'_m').value!="" && ($(fieldId+'_y') && $(fieldId+'_y').value=="")){
					valid=false;
				}else if ($(fieldId+'_m').value!="" && ($(fieldId+'_d') && $(fieldId+'_d').value=="")){
					valid=false;
				}else if (($(fieldId+'_y') && $(fieldId+'_y').value!="") && $(fieldId+'_m').value==""){
					valid=false;
				}else if (($(fieldId+'_y') && $(fieldId+'_y').value!="") && ($(fieldId+'_d') && $(fieldId+'_d').value=="")){
					valid=false;
				}
				if ($(fieldId+'_d')){
					valid=valid && parentForm.Validator.test('validate-digits',fieldId+'_d');
					if ($(fieldId+'_d').value!='' && ($(fieldId+'_d').value<1 || $(fieldId+'_d').value>31)){
						valid=false;
					}else if ($(fieldId+'_d').value.length==1){
						$(fieldId+'_d').value='0'+$(fieldId+'_d').value;
					}
				}
				valid=valid && parentForm.Validator.test('validate-digits',fieldId+'_m');
				if ($(fieldId+'_m').value!='' && ($(fieldId+'_m').value<1 || $(fieldId+'_m').value>12)){
					valid=false;
				}else if ($(fieldId+'_m').value.length==1){
					$(fieldId+'_m').value='0'+$(fieldId+'_m').value;
				}
				if ($(fieldId+'_y')){
					valid=valid && parentForm.Validator.test('validate-digits',fieldId+'_y');
					if (parseInt($(fieldId+'_y').value)<70){
						$(fieldId+'_y').value=2000+parseInt($(fieldId+'_y').value);
					}else if (parseInt($(fieldId+'_y').value)>0 && parseInt($(fieldId+'_y').value)<100){
						$(fieldId+'_y').value=1900+parseInt($(fieldId+'_y').value);
					}
				}
				if (!valid){
					parentForm.Validator.fireEvent('onElementFail',[$(fieldId+'_d'),['validate-date-parts']]);
					parentForm.Validator.fireEvent('onElementFail',[$(fieldId+'_m'),['validate-date-parts']]);
					parentForm.Validator.fireEvent('onElementFail',[$(fieldId+'_y'),['validate-date-parts']]);
				}else{
					//K�nnte Probleme geben wenn auch andere validatoren auf den Feldern liegen, sollte bei Datumsfeldern aber nicht vorkommen
					parentForm.Validator.fireEvent('onElementPass',$(fieldId+'_d'));
					$(fieldId+'_d').removeClass('validation-failed');
					parentForm.Validator.fireEvent('onElementPass',$(fieldId+'_m'));
					$(fieldId+'_m').removeClass('validation-failed');
					parentForm.Validator.fireEvent('onElementPass',$(fieldId+'_y'));
					$(fieldId+'_y').removeClass('validation-failed');

				}
				return valid;
			}
		}
	});

	Form.Validator.add('validate-required-date-parts',{
		errorMsg: 'Please enter a valid Date.',
		test: function(element){
			if (!element.id){
				return true;
			}
			var fieldId=element.id.replace(/_[dmy]$/,'');
			var parentForm=element.getParents('form')[0];
			if (fieldId==element.id){
				return (element.value!='');
			}else{
				var valid=true;
				if ($(fieldId+'_d')){
					valid=valid && parentForm.Validator.test('required',fieldId+'_d');
					valid=valid && parentForm.Validator.test('validate-digits',fieldId+'_d');
					if (valid && ($(fieldId+'_d').value<1 || $(fieldId+'_d').value>31)){
						valid=false;
					}else if ($(fieldId+'_d').value.length==1){
						$(fieldId+'_d').value='0'+$(fieldId+'_d').value;
					}
				}
				valid=valid && parentForm.Validator.test('required',fieldId+'_m');
				valid=valid && parentForm.Validator.test('validate-digits',fieldId+'_m');
				if (valid && ($(fieldId+'_m').value<1 || $(fieldId+'_m').value>12)){
					valid=false;
				}else if ($(fieldId+'_m').value.length==1){
					$(fieldId+'_m').value='0'+$(fieldId+'_m').value;
				}
				if ($(fieldId+'_y')){
					valid=valid && parentForm.Validator.test('required',fieldId+'_y');
					valid=valid && parentForm.Validator.test('validate-digits',fieldId+'_y');
					if (parseInt($(fieldId+'_y').value)<70){
						$(fieldId+'_y').value=2000+parseInt($(fieldId+'_y').value);
					}else if (parseInt($(fieldId+'_y').value)>0 && parseInt($(fieldId+'_y').value)<100){
						$(fieldId+'_y').value=1900+parseInt($(fieldId+'_y').value);
					}
				}
				if (!valid){
					parentForm.Validator.fireEvent('onElementFail',[$(fieldId+'_d'),['validate-required-date-parts']]);
					parentForm.Validator.fireEvent('onElementFail',[$(fieldId+'_m'),['validate-required-date-parts']]);
					parentForm.Validator.fireEvent('onElementFail',[$(fieldId+'_y'),['validate-required-date-parts']]);
				}else{
					//K�nnte Probleme geben wenn auch andere validatoren auf den Feldern liegen, sollte bei Datumsfeldern aber nicht vorkommen
					parentForm.Validator.fireEvent('onElementPass',$(fieldId+'_d'));
					$(fieldId+'_d').removeClass('validation-failed');
					parentForm.Validator.fireEvent('onElementPass',$(fieldId+'_m'));
					$(fieldId+'_m').removeClass('validation-failed');
					parentForm.Validator.fireEvent('onElementPass',$(fieldId+'_y'));
					$(fieldId+'_y').removeClass('validation-failed');
				}
				return valid;
			}
		}
	});
});

var logger = new Log;
function log(msg){
	logger.enableLog().log(msg);
}

function init(){
	MooTools.lang.setLanguage("de-DE");
	ajaxInit();
}

function ajaxInit(){
	initSubmitEvents();
	initValidators();
	initToolTips();
	initSortables();
	initBoxSliders(true);
}

function createFormRequest(form){
	if ($defined(form) && !form.Request){
		form=$(form);
		form.Request=new Request({
			method: 'post',
			url: document.location.href,
			evalScripts: true,
			noCache: true,
			onRequest: function() {
				var placeholder=new Element('div',{
					id: 'placeholder_'+form.id,
					style: 'ajaxloader'
				});
				placeholder.set('class','ajaxloader');
				placeholder.setStyle('height',form.offsetHeight);
				form.empty().appendChild(placeholder);
				if (typeof AIM!='undefined'){
					return AIM.submit(this, {
						'onStart' : startCallback,
						'onComplete' : completeCallback
					});
				}else{
					return true;
				}
			},
			onComplete: function(response) {
				form.empty().set('html',response);
				ajaxInit();
				try{
					box=form.parentNode.parentNode.parentNode;
					if (box.className.search('slideBox')!=-1){
						form.parentNode.setStyle('height', 'auto');
						box.getElement('*.shead').slider.show();
					}
					if (box.Accordion){
						form.parentNode.setStyle('height', 'auto');
					}
				}catch(e){
					console.log('catched',e);
				}
				if ($defined(form.id) && eval('typeof onAjaxComplete_'+form.id)=='function'){
					eval('onAjaxComplete_'+form.id+'()');
				}
			}
		});
		if (form.tagName=='FORM'){
			form.addEvent("submit", function(event) {
				event.stop();
				if (!this.Validator || this.Validator.validate()){
					var data=getFormData(this);
					data.ajaxFormName=this.get('name');
					if (typeof submitButtonUsed != 'undefined'){
						data['submitButtonUsed']=submitButtonUsed;
					}
					this.Request.send({
						data: data
					});
				}
			});
		}else{
			form.submit=function(extraData) {
				if (!this.Validator || this.Validator.validate()){
					var data=getFormData(this);
					data.ajaxFormName=this.get('id');
					if (typeof extraData != 'undefined'){
						for(i in extraData){
							data[i]=extraData[i];
						}
					}
					if (typeof submitButtonUsed != 'undefined'){
						data.submitButtonUsed=submitButtonUsed;
					}
					this.Request.send({
						data: data
					});
				}
			};
		}
	}
}

function initSubmitEvents(){
	var forms;
	try{
		forms = $$('form.ajaxForm');
	}catch(e){
		forms=$A(document.getElementsByTagName('form'));
	}
	forms.each(createFormRequest);
}

function getFormData(form){
	if (typeof form=="undefined" || $(form).tagName!="FORM"){
		return {};
	}
	elements=$(form);
	var data={};
	for (i=0;i<elements.length;i++){
		if (elements[i].type=='checkbox'){
			if (elements[i].checked){
				data[elements[i].name]=elements[i].value;
			}
		}else if (elements[i].type=='radio'){
			if (elements[i].checked){
				data[elements[i].name]=elements[i].value;
			}
		}else{
			data[elements[i].name]=elements[i].value;
		}
	}
	return data;
}

function initAccordion(boxId,active){
	if (!$type(active)) active=0;
	var elem;
	if ($type(boxId)=='element'){
		elem=boxId;
	}else{
		elem=$('box_'+boxId);
	}
	elem.Accordion=new Accordion(elem, 'ul.navi li', 'div.navip', {
		opacity: false,
		show: parseInt(active),
		onActive: function(toggler, element) {
			if (toggler){
				toggler.addClass('act');
			}
		},
		onBackground: function(toggler, element) {
			if (toggler){
				toggler.removeClass('act');
			}
		}
	});
}

var submitButtonUsed;

function setUsedButton(nam){
	submitButtonUsed = nam;
}


function submitForm(formName){
	if (!$(formName).Validator || $(formName).Validator.validate()){
		if ($(formName).Request){
			createFormRequest($(formName));
		}
		var data=getFormData($(formName));
		data['ajaxFormName']=$(formName).get('name');
		if (typeof submitButtonUsed != 'undefined'){
			data['submitButtonUsed']=submitButtonUsed;
		}
		$(formName).Request.send({
			data: data
		});
	}
}

function ajaxRefresh(elementId,data){
	var placeholder=new Element('div',{
		id: 'placeholder_'+elementId
	});
	placeholder.set('class','ajaxloader');

	new Request({
		method: 'post',
		url: document.location.href,
		data: data,
		evalScripts: true,
		noCache: true,
		onRequest: function() {
			placeholder.setStyle('height',$(elementId).offsetHeight);
			$(elementId).empty().appendChild(placeholder);
			if (typeof AIM!='undefined'){
				return AIM.submit(this, {
					'onStart' : startCallback,
					'onComplete' : completeCallback
				});
			}else{
				return true;
			}
		},
		onComplete: function(response) {
			$(elementId).empty().set('html',response);
			//alert(elementId);
			//alert(response);
			//alert(document.getElementById(elementId).innerHTML);
			//document.getElementById(elementId).innerHTML=response;
			ajaxInit();
			try{
				slideBox=$(elementId).parentNode.parentNode.parentNode;
				if (slideBox.className.search('slideBox')!=-1){
					slideBox.getElement('*.shead').slider.show();
				}
			}catch(e){}

			if (eval('typeof onAjaxComplete_'+elementId)=='function'){
				eval('onAjaxComplete_'+elementId+'()');
			}
		}
	}).send();
}

function refreshBoxlist(listName){
	data=new Object();
	data['boxlist']=listName;
	ajaxRefresh('boxlist_'+listName,data);
}

function boxlistAdd(list){
//var element= [create element]
//element.inject(list);
//initBoxSliders(true);
}

var boxSliderContainer=Object();
var boxSliderSingle=true;

function initBoxSliders(force,buttonClass,contClass,statusClass) {
	if (typeof buttonClass=='undefined'){
		buttonClass='slideBoxButton';
	}
	if (typeof contClass=='undefined'){
		contClass='slideBoxContent';
	}
	if (typeof statusClass=='undefined'){
		statusClass='slideBoxStatus';
	}
	//var box=$('box_'+boxName);

	//var boxes=document.body.getElements('*.slideBox');
	var boxes = $(document.body).getElements('*.slideBox');
	var button;
	var cont;

	for (i in boxes){
		if ($type(boxes[i])=='element' && (!boxSliderContainer[i] || force)){
			button=boxes[i].getElement('*.'+buttonClass);
			cont=boxes[i].getElement('*.'+contClass);
			if (button && cont){
				button.slider = new Fx.Slide(cont);
				button.statusOpen=boxes[i].getElement('*.'+statusClass+'Open');
				button.statusClosed=boxes[i].getElement('*.'+statusClass+'Closed');
				button.cont=cont;
				button.contHeight=cont.getStyle('height');
				button.addEvent('click', function(e){
					e.stop();
					if (boxSliderSingle){
						for (j in boxSliderContainer){
							if (boxSliderContainer[j].open){
								boxSliderContainer[j].slideOut();
							}
						}
					}
					this.cont.setStyle('height',this.contHeight);
					this.slider.toggle();
					this.cont.setStyle('height','');
					if (this.statusOpen){
						this.statusOpen.style.display=(this.slider.open)?'':'none';
					}
					if (this.statusClosed){
						this.statusClosed.style.display=(this.slider.open)?'none':'';
					}
				});
				button.slider.hide();
				cont.setStyle('height',button.contHeight);
				if (button.statusOpen){
					button.statusOpen.style.display='none';
				}
				if (button.statusClosed){
					button.statusClosed.style.display='';
				}
				boxSliderContainer[i]=button.slider;
			}
		}
	}
}

function createSlider(buttonId,contId){
	var button=$(buttonId);
	button.slider = new Fx.Slide($(contId));
	button.addEvent('click', function(e){
		e.stop();
		this.slider.toggle();
	});
	button.slider.hide();
}

/**
 * @todo: use MooDialog
 */
function mooConfirm(msg){
	return confirm(msg);
}

/**
 * @todo: use MooDialog
 */
function mooAlert(msg){
	alert(msg);
}

function initSortables(){
	//	document.ondragstart = function() { return false; };
	if ($$('ul.sortable').length==0){
		return;
	}
	var sortablesOrder;
	if ($('sortablesOrder')){
		sortablesOrder=$('sortablesOrder');
	}else{
		console.log('input with id "sortablesOrder" had to be created!');
		sortablesOrder = new Element('input', {
			'type': 'hidden',
			'id': 'sortablesOrder'
		}).inject(document.body);
	}
	var SortablesObject=new Sortables($$('ul.sortable'),{
		revert: true,
		clone: false,
		constrain: true,
		onComplete: function(){
			$('sortablesOrder').value=this.serialize(false,sortableSerializer);
		}
	});
	sortablesOrder.value=SortablesObject.serialize(false,sortableSerializer);
}

function sortableSerializer(element, index){
	return element.getProperty('id')+'=' + index;
}

var toolTips;
function initToolTips(){
	toolTips = new Tips.blau($$(".mooToolTip"),{
		onShow: function(tip, hovered){
			if(hovered.retrieve('tip:title')){
				tip.setStyle('display', 'block');
			}
		}
	});
}

function setBoxTitle(boxId,newTitle){
	if ($('box_title_'+boxId)){
		if ($('box_title_'+boxId).innerHTML.search(/<div [^>]*class=["']?icon/i)!=-1){
			$('box_title_'+boxId).innerHTML=$('box_title_'+boxId).innerHTML.replace(/(<div [^>]*class=["']?icon.*>).*</gi,"$1"+newTitle+"<");
		}else{
			$('box_title_'+boxId).innerHTML=newTitle;
		}
	}
}

function initValidators(){
	var elems;
	try{
		elems=$$('form')
	}catch(e){
		elems=document.getElementsByTagName('form');
	}
	
	if (elems.length==0){
		return;
	}
	for (i in elems){
		if ($type(elems[i])=='element'){ // && !elems[i].Validator){
			try{ //I hate IE!
				elems[i].Validator=new Form.Validator(elems[i],{
					serial: false,
					stopOnFailure: true,
					onElementPass: function(element){
						if ($type(element.retrieve('tip:native'))!=false){
							element.store('tip:title', element.retrieve('tip:native'));
						}else{
							element.store('tip:title',null);
						}
						element.removeClass('ftext_invalid');
						if ($defined(element.type) && (element.type=='checkbox' || element.type=='radio') && $(element.id+'_label')){
							$(element.id+'_label').store('tip:title', element.retrieve('tip:native'));
							$(element.id+'_label').removeClass('label_invalid');
						}
						toogleSubmitButtons(element.getParents('form')[0]);
					},
					onElementFail: function(element,validators){
						var msg='Fehler:';
						validators.each(function(validator){
							validator=validator.split(':');
							msg=msg+'<br />'+MooTools.lang.get('Form.Validator', validator[0]);
							if (validator[0]=='minLength'){
								msg=msg.replace('{minLength}',validator[1]);
								msg=msg.replace('{length}',element.value.length);
							}else if (validator[0]=='maxLength'){
								msg=msg.replace('{maxLength}',validator[1]);
								msg=msg.replace('{length}',element.value.length);
							}else if (validator[0]=='dateSuchAs'){
								msg=msg.replace('{date}',validator[1]);
							}else if (validator[0]=='match'){
								msg=msg.replace('{matchName}',validator[1]);
							}else { // if (validator[0]=='reqChkByName' || validator[0]=='afterDate' || validator[0]=='beforeDate'){
								msg=msg.replace('{label}',validator[1]);
							}
						});
						element.store('tip:title', msg);
						element.addClass('ftext_invalid');
						if ($defined(element.type) && (element.type=='checkbox' || element.type=='radio') && $(element.id+'_label')){
							$(element.id+'_label').store('tip:title', msg);
							$(element.id+'_label').addClass('label_invalid');
						}
						toogleSubmitButtons(element.getParents('form')[0]);
					}
				});
			}catch(e){}
		}
	}
}

function toogleSubmitButtons(form,disabled){
	if ($type(form)=='element'){
		var submitters=form.getElements('input.fsubmit');
		if (disabled==null){
			disabled=(form.getElements('*.validation-failed').length>0);
		}
		for (i in submitters){
			if ($type(submitters[i])=='element'){
				submitters[i].disabled=disabled;
			}
		}
	}
}

function autoTab(element,event){
	if (!element.getAttribute('maxlength') || element.value.length<element.getAttribute('maxlength')){
		return;
	}
	if (typeof event!="undefined"){
		keycode=65;
		if (event.which){
			keycode = event.which;
		}else if (event.keyCode){
			keycode = event.keyCode;
		}
		if (
			keycode != 32
			&& keycode != 91
			&& keycode != 92
			&& keycode != 93
			&& keycode < 186
			&& (keycode < 48 || keycode > 111)
			){
			return;
		}
	}
	var nextElem=null;;
	var pos;
	for (pos in element.form.elements){
		if (element.form.elements[pos]==element){
			break;
		}
	}
	pos=parseInt(pos)+1;
	while (pos<element.form.elements.length && nextElem==null){
		if (!element.form.elements[pos].type || element.form.elements[pos].type!='hidden'){
			nextElem=element.form.elements[pos];
		}
		pos++;
	}
	if (nextElem && nextElem.focus){
		nextElem.focus();
	}
}