/*
Copyright (c) 2004-2009 Ylab, www.ylab.nl
*/
var debugging = true;
var isOpera = (navigator.userAgent.indexOf("Opera") > -1);
var isNav = ((!isOpera) && (navigator.appName == "Netscape"));
var isIE  = ((!isOpera) && (navigator.appName.indexOf("Explorer") > -1 ));

//Convert id into object
function id2object(el){
	if (typeof(el)=="string"){el = document.getElementById(el);}
	return el;
}

//Set focus on first input element
function setFirstFieldFocus(container){
	var list;
	if(container.tagName == "FORM"){
		list = container.elements;
	}
	else{
		list = container.getElementsByTagName("input");
	}
	for (var i=0; i< list.length; i++){
		try{
			if (list[i].type == "button"){continue;}
			list[i].focus();
			if(list[i].select){list[i].select();}
			break;
		}
		catch (exception){}
	}
}

//enable or disable elements and their children
function setEnabled(on){
	for (var i=1; i<arguments.length; i++){
		var obj = id2object(arguments[i]);
		if (!obj){continue;}
		obj.disabled = !on;
		if(on){
			removeClass(obj, 'disabled');
		}
		else{
			addClass(obj, 'disabled');
		}
		if (obj.hasChildNodes()){
			for (var j=0; j<obj.childNodes.length; j++){
				if (obj.childNodes[j].nodeType == 1){setEnabled(on, obj.childNodes[j]);}
			}
		}
	}
}
function addClass(obj, strClass){
	if(!obj){return;}
	if(!obj.className){
		obj.className = strClass;
	}
	else if(!obj.className.match(strClass)){
		obj.className += ' ' + strClass;
	}
}
function removeClass(obj, strClass){
	if(!obj || !obj.className){return;}
	 obj.className = obj.className.replace(strClass, '');
}

//set a style property or fail gracefully
function setStyle(objectId, prop, value){
	var obj = document.getElementById(objectId);
	if ((obj) && (obj.style[prop] != value)){
		obj.style[prop] = value;
	}
}

/*
Form validation functions
*/
var errormessages = {
	errMissing : "Het veld '%g' moet ingevuld zijn.",
	errEmail   : "Het e-mailadres is onvolledig.",
	errPhone   : "Het telefoonnummer is onvolledig.\nVul een tiencijferig telefoonnummer in.",
	errMinLen  : "Het veld '%g' moet uit minimaal %v karakters bestaan.",
	errMaxLen  : "Het veld '%g' mag uit maximaal %v karakters bestaan.",
	errMinVal  : "Het veld '%g' moet groter zijn dan %v.",
	errMaxVal  : "Het veld '%g' moet kleiner dan of gelijk aan %v zijn.",
	errDate    : "In het veld '%g' is geen geldige datum ingevuld.\nGebruik het formaat dd-mm-jjjj om een datum in te voeren.",
	errLater   : "De datum in het veld '%g' moet na %v liggen.",
	errInvalid : "Het veld '%g' is ongeldig."
};

function errormsg(errorcode, guiName, val){
	var msg = errormessages[errorcode];
	msg = msg.replace(/%g/, guiName);
	msg = msg.replace(/%v/, val);
	alert(msg);
}

function isNotNull(field, guiName, f){
	//validates if a field contains a value
	//field: input element text|hidden
	//guiName: fieldname to communicate with user
	if (!field){debugAlert("Het veld '"+guiName+"' bestaat niet.");}
	if ((!field.value) || (field.value == "")){
		errormsg('errMissing', guiName);
		setFocus(field, f);
		return false;
	}
	return true;
}

function radioIsChecked(field, guiName, f){
	//validates if a field contains a value
	//field: input element radio
	//guiName: fieldname to communicate with user
	if(radioValue(field, guiName, f) !== false){
		return true;
	}
	errormsg('errMissing', guiName);
	setFocus(field[0], f);
	return false;
}

function radioValue(field, guiName){
	//return value of radiogrroup
	//field: input element radio
	//guiName: fieldname to communicate with user
	if (!field){debugAlert("Het veld '"+guiName+"' bestaat niet.");}
	if (!field.length){debugAlert("Het veld '"+guiName+"' is geen radiogroup.");}
	for(var i=0; i< field.length; i++){
		if(field[i].checked){
			return field[i].value;
		}
	}
	return false;
}

function isEmail(field, guiName, f){
	//validates if a textbox contains a valid email address
	var str = field.value;
	if (!str) return true;
	var at = str.indexOf('@');
	if ( (at < 2) || (str.indexOf('.',at+1) < 4) )
	{
		errormsg('errEmail', guiName)
		setFocus(field, f);
		return false;
	}
	return true;
}

function isPhone(field, guiName, f){
	//validates if a textbox contains a valid ten digit phone number
	var str = field.value;
	var i, ar, num = "";

	if (!str) return true;

	if(ar = str.match(/\d+/g)){
		for (var i=0; i< ar.length; i++){
			num += ar[i];
		}
	}

	if (num.charAt(0)!="0" || num.charAt(1)=="0" || num.length != 10) {
		errormsg('errPhone', guiName)
		setFocus(field, f);
		return false;
	}
	return true;
}

function isDate(field, guiName, f){
	if (!field.value) return true;
	d = strToDate(field.value);
	if (!d){
		errormsg('errDate', guiName);
		setFocus(field, f);
		return false;
	}
	return true;
}

function isFuture(field, guiName, refDate, guiDate, f){
	if (!isAfterDate(field, refDate)){
		errormsg('errLater', guiName, guiDate);
		setFocus(field, f);
		return false;
	}
	return true;
}

function isAfterDate(field, refDate){
	if (!field.value) return false;//don't validate empty fields
	d = strToDate(field.value);
	return (d > refDate);
}

function strToDate(s){
	//dates are expected as dd-mm-yyyy or yyyy-dd-mm
	var dmY = new RegExp("([0-3]?[0-9]{1})[^[0-9]]*([0-1]?[0-9]{1})[^[0-9]]*([0-9]{4})");
	var Ymd = new RegExp("([0-9]{4})[^[0-9]]*([0-1]?[0-9]{1})[^[0-9]]*([0-3]?[0-9]{1})");
	if (result = s.match(dmY)){
		if (result[1] > 31){return false;}
		if (result[2] > 12){return false;}
		return (new Date(result[3], result[2]-1, result[1]));
	}
	else if (result = s.match(Ymd)){
		if (result[3] > 31){return false;}
		if (result[2] > 12){return false;}
		return (new Date(result[1], result[2]-1, result[3]));
	}
	return false;
}

function strToTime(s){
	//time is expected as hh:mm
	if (!isNaN(s) && s <= 24){s += ":00";}
	if (s == "24:00"){return (new Date(0,0,0,24,0));}
	var r = new RegExp("([0-2]?[0-9]{1})[^[0-9]]*([0-5]?[0-9]{1})");
	var result = s.match(r);
	if (!result){
		var r = new RegExp("([0-2]?[0-9]{1})([0-5]?[0-9]{1})");
		var result = s.match(r);
	}
	if (!result){return false;}
	if (result[1] > 23){return false;}
	if (result[2] > 59){return false;}
	return (new Date(0,0,0,result[1], result[2]));
}

function leadingZero(s){
	return ((s < 10) ? "0" : "") + s;
}

function setFocus(field, f){
	try{
		if (f){f = new Function(f); f();}
		field.focus();
	}
	catch(ex){}
}

function ignoreNonNumKey(e){
	//keypress
	//opera: keycode: 0, charcode= ascii
	//other: keycode: ascii, charcode= null
	var evt = e || window.event;

	if(evt.charCode != undefined){
		//opera
		if(evt.charCode == 0){
			return true;//no character key
		}
		cde = evt.charCode;
	}
	else{
		cde = evt.keyCode;
	}
	//accept 0::9
	if (cde < 48 || cde > 57){
		//suppres
		if(window.event){
			window.event.returnValue = false;
		}
		return false;
	}
}

//DEBUGGING
function debugAlert(){
	if (!debugging){return;}
	var code = "";
	for(var i=0; i < arguments.length; i++){
		code += arguments[i] + "\n";
	}
	window.status = code;
	alert(code);
}
