/*
 * Validate a form using array of fields
 *
 * fields: Array of fields
 *   id: the id of the element
 *   type: the type of the value (string, mail, number, btw, pass)
 *   mandatory: true/false
 */
function validateForm(fields) {
	var retval = true;

	for (var i=0;i<fields.length;i++) {
		var element = document.getElementById(fields[i]['id']);

		if(element) {
			var elemVal = trim(element.value);
	
			validateClear(fields[i]['id']);
	
			if(fields[i]['mandatory'] && elemVal=='') {
				validateNotifyMand(fields[i]['id']);
				retval = false;
			}
			else if(elemVal!='') {
				var isValid = false;
	
				switch(fields[i]['type']) {
					case 'mail':
						isValid = validateMail(element.value);
						break;
					case 'number':
						isValid = validateNumber(element.value);
						break;
					case 'btw':
						isValid = validateBTWNr(element.value);
						break;
					case 'pass':
						isValid = validatePass(fields[i]['id']);
						break;
					case 'date':
						isValid = validateDate(element.value);
						break;
					case 'userfunc':
						isValid = fields[i]['eval'](element.value);
						break;
					default:
						isValid = true;
				}
	
				if(!isValid) {
					validateNotifyInvalid(fields[i]['id']);
					retval = false;
				}
			}
		}
	}
	
	return retval;
}

/*
 * Trim a srtring
 */
function trim(str) {
   return str.replace(/^\s*|\s*$/g,"");
}

/*
 * Notify form mandatory
 */
function validateNotifyMand(id) {
	var mand = document.getElementById(id + '_mandatory');
	if(mand)
		mand.style.display = 'inline';
}


/*
 * Notify form invalid
 */
function validateNotifyInvalid(id) {
	var invalid = document.getElementById(id + '_invalid');
	if(invalid)
		invalid.style.display = 'inline';
}

/*
 * Clear notifications
 */
function validateClear(id) {
	var mand = document.getElementById(id + '_mandatory');
	if(mand)
		mand.style.display = 'none';

	var invalid = document.getElementById(id + '_invalid');
	if(invalid)
		invalid.style.display = 'none';
}

/*
 * Validate an e-mail address
 */
function validateMail(input) {
	var filter = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
	return filter.test(input);
}

/*
 * Validate a number
 */
function validateNumber(input) {
	var filter = /^\d+$/;
	return filter.test(input);
}

/*
 * Validate BTW
 */
function validateBTWNr(strNummer) {
	var retVal = false;
	value = document.getElementById('invoicecountry').value;

	switch(value) {
		case '2':
			retVal = isBTWNetherlands(strNummer)
			break;
		default:
			retVal = isBTWBelgium(strNummer)
	}
	
	return retVal;
}

/*
 * Is valid BTW number The Neterlands
 */
function isBTWNetherlands(strNummer) {
	i = 0;

	strNummer = strNummer.replace(' ','');
	strNummer = strNummer.replace('.','');
	strNummer = strNummer.toUpperCase();
	strNummer = strNummer.replace('NL','');
	
	b = strNummer.substr(9,1);
	
	if(b != 'B') {
		retVal = false;
	} else {
		i = 0 
			+ (9*strNummer.substr(0,1))
			+ (8*strNummer.substr(1,1))
			+ (7*strNummer.substr(2,1))
			+ (6*strNummer.substr(3,1))
			+ (5*strNummer.substr(4,1))
			+ (4*strNummer.substr(5,1))
			+ (3*strNummer.substr(6,1))
			+ (2*strNummer.substr(7,1));
		i = i % 11;

		if(i == 10) {
			retVal = false;
		} else {
			if(strNummer.substr(8,1) == i) {
				retVal = true;
			}
		}
	}
	
	return retVal;
}

/*
 * Is valid BTW number Belgium
 */
function isBTWBelgium(strNummer) {
	var retVal = false;
	var deelwaarde = 0;
	var rechts2 = 0;
		
	strNummer = strNummer.replace(' ','');
	strNummer = strNummer.replace('.','');
	strNummer = strNummer.toUpperCase();
	strNummer = strNummer.replace('BE','');
	
	if(strNummer.length != 9) {
		retVal = false;
	} else {
		if(strNummer.substr(0,1) == 0 || strNummer.substr(0,1) == 1) {
			retVal = false;
		} else {
			deelwaarde = (97-(strNummer.substr(0,7)) % 97);
			rechts2 = strNummer.substr(7,2);
			
			if (deelwaarde != rechts2) {
                   retVal = false;
			} else {
               	retVal = true;
			}
		}
	}
	
	return retVal;
}

/*
 * Is valid BTW number France
 */
function isBTWFrance(strNummer) {
	var retVal = false;
	FRCharTable = new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','J','K','L','M','N',
      						'P','Q','R','S','T','U','V','W','X','Y','Z');
	var i = 0;
	var ic = 0;
	var ic1 = 0;
	var ic2 = 0;
	var x = 0;
	var y = 0;
	
	strNummer = strNummer.replace(' ','');
	strNummer = strNummer.replace('.','');
	strNummer = strNummer.toUpperCase();
	strNummer = strNummer.replace('FR','');
	
	ic1 = FindCharInTable(FRCharTable,strNummer.substr(0,1));
 	ic2 = FindCharInTable(FRCharTable,strNummer.substr(1,1));
 	
	if(ic1 < 10) {
		i = ((ic1 * 24) + ic2) - 10;
	} else {
		i = ((ic1 * 34) + ic2) - 100;
	}
	
	x = i % 11;
	i = (i / 2) + 1;
	y = (strNummer.substr(2,8) + i) % 11;

	if(x == y) {
		retVal = true;
	}
	
	return retVal;
}

function FindCharInTable(table,char) {
	for(i=0;i<33;i++) {
		if(table[i] == char) {
			retVal = i;
		}
	}
	
	return retVal;
}

/*
 * Is valid BTW number Germany
 */
function isBTWGermany(strNummer) {
	var retVal = false;
		
	var a = 0;
	var s = 0;
	var k = 0;
	var b = 0;
	var rechts1 = 0;
	var teller = 0;
		
	strNummer = strNummer.replace(' ','');
	strNummer = strNummer.replace('.','');
	strNummer = strNummer.toUpperCase();
	strNummer = strNummer.replace('DE','');
		
	if (strNummer.length != 9) {
       	retVal = false;
	} else {
		a=10;
		s=(strNummer.substr(0,1) + a) % 10;
		if(s==0) {
			s=10;
		}
		
		for(teller=1;teller<8;teller++) {
		 	k=strNummer.substr(teller,1);
	        a=(2 * s) % 11;
	        if(a==0) {
	        	a=11;
	        }
	        s=(k + a) % 10;
	        if(s==0) {
	        	s=10;
	        }
		}
		a=(2 * s) % 11;
       	if(a==0) {
       		a=11;
       	}
       	b=11-a;
       	if(b==10) {
           	b=0;
       	}
       	rechts1=strNummer.substr(8,1);

       	if(b==rechts1) {
       		retVal = true;
        }
	}
	
	return retVal;
}

/*
 * Validate password
 */
function validatePass(id) {
	pass = document.getElementById(id);
	passRepeat = document.getElementById(id + '_repeat');
	
	return (pass.value == passRepeat.value);
}

/*
 * Validate date
 */
function validateDate(dat) {
	var datSplit = dat.split('-');
	var dteDate;

	//javascript months start at 0 (0-11 instead of 1-12)
	datSplit[1] = datSplit[1]-1;

	dteDate=new Date(datSplit[0],datSplit[1],datSplit[2]);

	return ((datSplit[2]==dteDate.getDate()) && (datSplit[1]==dteDate.getMonth()) && (datSplit[0]==dteDate.getFullYear()));
}