var FORM_VALIDATION_ERROR_COLOR = '#F9966B'; 
var FORM_VALIDATION_CORRECT_COLOR = '#C3FDB8'; 
var FORM_VALIDATION_MIN_YEAR = "2000";
var FORM_VALIDATION_MAX_YEAR = "3000";


function validateEmpty(fld) {
    var error = "";
    fld.style.background = FORM_VALIDATION_CORRECT_COLOR;

    if (fld.value.length == 0) {
        fld.style.background = FORM_VALIDATION_ERROR_COLOR; 
        error = "The required field " +  getLabel(fld) +", has not been filled in.</br>"
    }

    return error;   
}

function validateLength(fld,maxLenght) {
    var error = "";
    fld.style.background = FORM_VALIDATION_CORRECT_COLOR;

    if (fld.value.length > maxLenght) {
        fld.style.background = FORM_VALIDATION_ERROR_COLOR; 
        error = "The text in field " +  getLabel(fld) +" is too long.</br>"
    }

    return error;   
}

function validateInteger(fld,min,max) {
    var error = "";
    fld.style.background = FORM_VALIDATION_CORRECT_COLOR;
	
	if (fld.value == '') return ""; //An empty integer is valid, use the validateEmpty function to enforce it
		
	var numberRegularExp = /^[-+]?\b\d+\b$/

	if(!numberRegularExp.test(fld.value)){
		 fld.style.background = FORM_VALIDATION_ERROR_COLOR; 
	     error = "Insert a valid number in field " +  getLabel(fld) +"</br>";
	     return error;
	}
	
	var number = parseInt(fld.value, 10);
    
	if(min == null && max == null) return error;
	
	if(min ==null){
		if (number > max) {
	        fld.style.background = FORM_VALIDATION_ERROR_COLOR; 
	        error = "Number in field "+  getLabel(fld) +" should be smaler than "+max+".</br>";
	    }
		return error;
	}
	
	if(max ==null){
		if (number < min) {
	        fld.style.background = FORM_VALIDATION_ERROR_COLOR; 
	        error = "Number in field " +  getLabel(fld) +" should be bigger than "+min+".</br>";
	    }
		return error;
	}
	
	if (number < min || number > max) {
        fld.style.background = FORM_VALIDATION_ERROR_COLOR; 
        error = "Number in field " +  getLabel(fld) +" should be bigger then "+min+" and smaler than "+max+".</br>";
    }

    return error;   
}


function validateEmail(fld) {
    var error="";
    fld.style.background = FORM_VALIDATION_CORRECT_COLOR;

	if (fld.value == '') return ""; //An empty e-mail is valid, use the validateEmpty function to enforce it
   
    var tfld = trim(fld.value);                        // value of field with whitespace trimmed off
    var emailFilter = /^[^@]+@[^@.]+\.[^@]*\w\w$/ ;
    var illegalChars= /[\(\)\<\>\,\;\:\\\"\[\]]/ ;
    
   if (!emailFilter.test(tfld)) {              //test email for illegal characters
        fld.style.background = FORM_VALIDATION_ERROR_COLOR;
        error = "Please enter a valid email address for field "+getLabel(fld)+".</br>";
    } else if (fld.value.match(illegalChars)) {
        fld.style.background = FORM_VALIDATION_ERROR_COLOR;
        error = "The email address in field "+getLabel(fld)+" contains illegal characters.</br>";
    }
          
    return error;
}


function validatePhone(fld, maxLenght) {
    var error = "";
	fld.style.background = FORM_VALIDATION_CORRECT_COLOR;
	
	if (fld.value == '') return ""; //An empty phone number is valid, use the validateEmpty function to enforce it    

	var phonereg = '[^0-9]';     	

   if (fld.value == "") {
		error = "Please enter a valid phone number for field "+getLabel(fld)+".</br>";
        fld.style.background = FORM_VALIDATION_ERROR_COLOR;    
    } else if (fld.value.match(phonereg)) {
        error = "The phone number in field "+ getLabel(fld)+" contains illegal characters.</br>";
        fld.style.background = FORM_VALIDATION_ERROR_COLOR;
    } 
    
// check for length        
    if (fld.value.length > maxLenght) {
        fld.style.background = FORM_VALIDATION_ERROR_COLOR; 
        error = "The text in field " +  getLabel(fld) +" is too long.</br>"
    }
    
    return error;
}

function validateDate(fld) {
	var error ="";
	fld.style.background = FORM_VALIDATION_CORRECT_COLOR;

	if (fld.value == '') return ""; //An empty date is valid, use the validateEmpty function to enforce it
	
	
	var dateRegularExp = /^(\d{4})\/(\d{1,2})\/(\d{1,2})$/
	var dateParts = fld.value.match(dateRegularExp);
	if(dateParts == null ){
		error= getLabel(fld) +" field format should be: yyyy/mm/dd</br>";
		fld.style.background = FORM_VALIDATION_ERROR_COLOR;
	} 
	else{
		
		var daysInMonth = DaysArray(12);
		var year = parseInt(dateParts[1], 10);
		var month = parseInt(dateParts[2], 10);
		var day = parseInt(dateParts[3], 10);
		
		//Year
		if(year <FORM_VALIDATION_MIN_YEAR || year >FORM_VALIDATION_MAX_YEAR){
			error= getLabel(fld) +" field year should be between " + minYear + " and " + maxYear+"</br>";
			fld.style.background = FORM_VALIDATION_ERROR_COLOR;
		}
		//month
		if(month  <1 || month >12){
			error= "Please enter a valid month for "+getLabel(fld)+"</br>";
			fld.style.background = FORM_VALIDATION_ERROR_COLOR;
		}
		//day
		if(day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
			error= "Please enter a valid day for "+getLabel(fld)+" d "+dateParts[3]+"</br>";
			fld.style.background = FORM_VALIDATION_ERROR_COLOR;
		}
	}

return error;
}

//Utility Functions

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}

function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function trim(s)
{
  return s.replace(/^\s+|\s+$/, '');
}

function getLabel(fld){
	
	var labels=document.getElementsByTagName("label");
	for( i=0; i<labels.length;i++ )
	if(labels[i].htmlFor==fld.id) return labels[i].title;
	return "";

}


