var CN_ARRAY     = new Array();
var MSG_ARRAY    = new Array();
var MSGMAP_ARRAY = new Array();


var CN_NOTEMPTY  = 0;
var CN_ISINTEGER = 1;
var CN_ISFLOAT   = 2;
var CN_ISEMAIL   = 3;
var CN_ISDATE    = 4;

CN_ARRAY[CN_NOTEMPTY]  = 'ffIsMandatory';
CN_ARRAY[CN_ISINTEGER] = 'ffInteger';
CN_ARRAY[CN_ISFLOAT]   = 'ffFloat';
CN_ARRAY[CN_ISEMAIL]   = 'ffEmail';
CN_ARRAY[CN_ISDATE]    = 'ffDate';

MSG_ARRAY[CN_NOTEMPTY]  = 'darf nicht leer sein.';
MSG_ARRAY[CN_ISINTEGER] = 'muss eine Zahl sein.';
MSG_ARRAY[CN_ISFLOAT]   = '';
MSG_ARRAY[CN_ISEMAIL]   = 'ist keine gültige E-Mail.';
MSG_ARRAY[CN_ISDATE]    = 'ist kein gültiges Datum.';
MSG_HEAD = "Bitte beachten Sie";
 

MSG_SEP = " ";

var errorBox = null;


var ff = new Array();
for(var i=0;i<CN_ARRAY.length;i++){
	ff[i] = new Array();
}

var al = new Array();

function initiateFormularValidation(errorBoxId){
	var allInputFields = document.getElementsByTagName('input');
	var allSelectFields = document.getElementsByTagName('select');
	var allTextareass = document.getElementsByTagName('textarea');
	//this is faster than joining the arrays
	for(var i=0;i<allInputFields.length;i++){
		prepareFieldForValidation(allInputFields[i]);
	}
	for(var i=0;i<allSelectFields.length;i++){
		prepareFieldForValidation(allSelectFields[i]);
	}
	for(var i=0;i<allTextareass.length;i++){
		prepareFieldForValidation(allTextareass[i]);
	}
}

function prepareFieldForValidation(el){
	var elClasses = el.className.split(' ');
	for(var i=0;i<elClasses.length;i++){
		setArrayForField(el,elClasses[i]);
	}
	if(elClasses.length==0){
		setArrayForField(el,el.className);
	}
}

function setArrayForField(el,cln){
	for(var y=0;y<CN_ARRAY.length;y++){
		if(cln==CN_ARRAY[y]){
			ff[y][ff[y].length]=el;
		}
	}
}

function isValidDate(dateValue){
	var sepChars = new Array('.',',','/');
	var sepChar = '.';
	var prevChar = null;
	var DAYS = new Array(31,31,29,31,30,31,30,31,31,30,31,30,31);
	var day   = null;
	var month = null;
	var year  = null;
	for(var i=0;i<dateValue.length;i++){
			var chr = dateValue.charAt(i);
			for(var c in sepChars){
					if(sepChars[c] == chr){
						if((prevChar) && (prevChar == dateValue.charAt(i))){
							sepChar = dateValue.charAt(i);
						}
						prevChar = dateValue.charAt(i);
					}
			}
	}
	var splitDate = dateValue.split(sepChar);
	if (splitDate.length != 3) {
		return false;
	}
	try{
		if(splitDate[0].length==4){
			year  = simpleParseInt(splitDate[0]);
			month = simpleParseInt(splitDate[1]);
			day   = simpleParseInt(splitDate[2]);		
		} else if(splitDate[2].length==4){
			day   = simpleParseInt(splitDate[0]);
			month = simpleParseInt(splitDate[1]);
			year  = simpleParseInt(splitDate[2]);		
		} 
		else if(splitDate[2].length==2){
			day   = simpleParseInt(splitDate[0]);
			month = simpleParseInt(splitDate[1]);
			year  = simpleParseInt(splitDate[2]);
		}
		/*else{
			day   = simpleParseInt(splitDate[0]);
			month = simpleParseInt(splitDate[1]);
			alert('option4_b4_parse'+year);
			year  = simpleParseInt(splitDate[2]);
			alert('option4_after_parse'+year);
			year = (new Date().getFullYear()).subString(0,year.length-1) + year;
			alert('option4: '+day+'.'+month+'.'+year);	
		}*/
		
	}catch(err){
		return false;
	}
	
	if (year%4!=0 && day==29 && month==02) {
		alert(year+' ist kein Schaltjahr');
		DAYS[2] = 28;
		return false;
	}
	
	if(month<13){
		if((day<=DAYS[month]) && (day!=0)){	
		}else{
			return false;
		}
	}else{
		return false;
	}	
	if(year==0){
		return false;
	}
	if(month==0){
		return false;
	}
	if(day==0){
		return false;
	}
	return true;
}

function simpleParseInt(i) {
	if (i == i*1) {
		return i = i*1;
	}
	throw "Not an integer";
}

function getIdForField(el){
	if(al.length==0){
		al=document.getElementsByTagName('label');
	}
	for(var i=0;i<al.length;i++){
		if(al[i].htmlFor==el.id){
			var labelID = al[i].htmlFor;
			return labelID;
		}
	}
	return null;
}
function validateFormularFields(customErrorBox){
	errorBox = customErrorBox;
	var em = new Array();

	for(var i=0;i<ff[CN_NOTEMPTY].length;i++){
		var el = ff[CN_NOTEMPTY][i];
		if( (el.value=="" || el.value==null) || (el.type == "checkbox" && el.checked == false) ){
			var flabel = getLabelForField(el);
			var id = getIdForField(el);
			addError(em, flabel, CN_NOTEMPTY, id);
		}
	}
	
	for(var i=0;i<ff[CN_ISINTEGER].length;i++){
		var el = ff[CN_ISINTEGER][i];
		if((parseInt(el.value)!=el.value) && (el.value!=null) && (el.value!='')){
			var flabel = getLabelForField(el);
			var id = getIdForField(el);
			addError(em, flabel, CN_ISINTEGER, id);
		}
	}
	
	for(var i=0;i<ff[CN_ISEMAIL].length;i++){
		var el = ff[CN_ISEMAIL][i];
		if(!el.value.match(/^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i) && (el.value!=null) && (el.value!='')){
			var flabel = getLabelForField(el);
			var id = getIdForField(el);
			addError(em, flabel, CN_ISEMAIL, id);
		}
	}
	
	for(var i=0;i<ff[CN_ISDATE].length;i++){
		var el = ff[CN_ISDATE][i];
		if(!isValidDate(el.value)){
			var flabel = getLabelForField(el);
			var id = getIdForField(el);
			addError(em, flabel, CN_ISDATE, id);
		}
	}
	
	
	if(em.length > 0){
		appendErrors(em);
		errorBox = null;
		return false;
	} else {
		with(getErrorBoxElement()){
			style.display = "none";
			innerHTML='';
		}
		errorBox = null;
		return true;
	}
	
}

function addError(container, label, type, id){
	if (label != null) {
		var message = MSGMAP_ARRAY[id] || label + MSG_SEP + MSG_ARRAY[type];
		container[container.length] = message;
	}
}
	

function getLabelForField(el){
	if(al.length==0){
		al=document.getElementsByTagName('label');
	}
	for(var i=0;i<al.length;i++){
		if(al[i].htmlFor==el.id){
			var labelHTML = al[i].innerHTML.replace(/<.*?>/g, "");
			/*var labelHTML = al[i].innerHTML.replace(/<\/?[^>]+(>|$)/g, "");*/
			if(al[i].title){
				labelHTML = al[i].title;
			}
			return labelHTML;
		}
	}
	return null;
}

function getErrorBoxElement(){
	return errorBox ? errorBox : document.getElementById("portletFormError0");
}

function appendErrors(messages) {
	var errContainer = getErrorBoxElement();
	//avoid dom-flickering
	errContainer.innerHTML = '';
	var fragment = document.createDocumentFragment();
	fragment.appendChild(getHeadMessage());
	for (var i = 0; i < messages.length; i++) {
		var messageEl = document.createElement('li');
		messageEl.appendChild(document.createTextNode(messages[i]));
		fragment.appendChild(messageEl);
	}
	errContainer.appendChild(fragment);
	if (errContainer.style.display == "none") {
		errContainer.style.display = "";
	}
}

function getHeadMessage(){
	var el = document.createElement('li');
	el.className='portletErrorHead';
	el.appendChild(document.createTextNode(MSG_HEAD));
	return el;
}


/*var mvvOldOnLoad = window.onload;
if (typeof window.onload != 'function' ){
	window.onload = initiateFormularValidation;
}else{
	window.onload = function (){
	if (mvvOldOnLoad) mvvOldOnLoad ();
		initiateFormularValidation();
	};
}*/

if (window.addEventListener) // W3C standard
{
  window.addEventListener('load', initiateFormularValidation, false); // NB **not** 'onload'
} 
else if (window.attachEvent) // Microsoft
{
  window.attachEvent('onload', initiateFormularValidation);
}
