
function trim(s)
{
   return s.replace(/^\s*|\s*$/g,"");
}

function validChars(s, chars)
{
	for (i = 0; i < s.length; i++) 
	{ 
		if (chars.indexOf(s.charAt(i)) == -1) 
		{
			return false;
		}
	}
	return true;
}

function isEmail(s, b)
{
	if (!b && trim(s) == '') return true;
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if (!filter.test(s)) return false;
	return true;
}

function isAlpha(s)
{
	var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	for (i = 0; i < s.length; i++) 
	{ 
		if (chars.indexOf(s.charAt(i)) == -1) 
		{
			return false;
		}
	}
	return true;
}

function isNumeric(s)
{
	if (!s) return false;
	return validChars(s, "0123456789");
}

function isPostcode(s)
{
	if (trim(s) == '') return true;
	if (s.length < 6) return false;
	var nums = s.substring(0,4);
	var chars = trim(s.substring(4));
	if (!isNumeric(nums)) return false;
	if (chars.length != 2) return false;
	if (!isAlpha(chars)) return false;
	return true;
}

function formatPostCode(o, b)
{
	if (!isPostcode(o.value)) 
	{ 
		if (b)
		{
			alert(o.value + ' is geen geldige postcode'); 
			o.select(); o.focus(); 
		}
	} 
	else 
	{ 
		var nums = o.value.substring(0,4);
		var chars = trim(o.value.substring(4)).toUpperCase();
		o.value = trim(nums + " " + chars); 
	}
}

function isSofi(o)
{ 
	if (trim(o.value) == '') return true;
	if (o.value.length == 8 && isNumeric(o.value))
	{
		o.value = "0" + o.value;
	}
	if (o.value.length != 9)
	{ 
		alert("Het BSN-nummer " + o.value + " is geen geldig BSN-nummer."); 
		o.select(); o.focus();
		return false;
	} 
	else
	{ 
	 	checksum = 0; 
		for(i = 0; i < 8; i++)
		{ 
			checksum += (o.value.charAt(i)*(9-i)); 
		} 
		checksum -= o.value.charAt(8); 
		if (checksum % 11 != 0)
		{ 
			alert("Het BSN-nummer " + o.value + " is geen geldig BSN-nummer."); 
			o.select(); o.focus();
			return false;
		} 
		return true;
	} 
} 

function dateFocus(obj)
{
	if (obj.value == 'dd-mm-jjjj')
	{
		obj.value = '';
		obj.select();
	}
}	

function formatDate(obj)
{
	if (obj.value == '')
		return true;
	else
		isDate(obj);

}

function isDate(obj, mustexist)
{			
	if (obj.value == 'dd-mm-jjjj')
		return false;
		
	if (!obj.value)
	{
		if (mustexist)
		{
			selectFocus(obj, 'De datum moet ingevuld worden.');
			return false;
		}
		else
		{		
			obj.value = 'dd-mm-jjjj';
			return false;
		}
	}					
	var msg = 'Dit is geen complete datum';
	var val = obj.value;
	if (val.length == 0)
		return false;
		
	if (val.indexOf('-') == -1)
	{
		if (val.length == 8)
		{
			var d = obj.value.charAt(0) + obj.value.charAt(1);
			var m = obj.value.charAt(2) + obj.value.charAt(3);
			var y = obj.value.charAt(4) + obj.value.charAt(5) + obj.value.charAt(6) + obj.value.charAt(7);
			if (!checkDate(obj,d,m,y))
				return false;
				
			return true;

		}
		else if (val.length < 8)
		{
			selectFocus(obj,msg);
			return false;
		}
		else
		{
			selectFocus(obj,msg);
			return false;
		}			
	}
	else
	{			
		var d = val.split('-');
		if (d.length == 3)
		{
			
			if (!checkDate(obj,d[0],d[1],d[2]))
				return false;
		}
		else
		{
			selectFocus(obj,msg);
			return false;				
		}

	}
	
}

function checkDate(obj,d,m,y)
{
	// Day
	d = formatDigits(d,2);
	if (!checkNumber(d,1,31,2))
	{
		selectFocus(obj,'Deze maand heeft geen '+d+' dagen.');				
		return false;
	}
	// Month
	m = formatDigits(m,2);
	if (!checkNumber(m,1,12,2))
	{
		selectFocus(obj,'Een jaar heeft geen '+m+' maanden.');				
		return false;
	}
	// Year						
	if (y.length < 4)
	{
		selectFocus(obj,'Een jaartal moet uit 4 cijfers bestaan.');
		return false;
	}
	if (!isNumeric(y))
	{
		selectFocus(obj,'Een jaartal moet uit 4 cijfers bestaan.');
		return false;
	}		
	if (Number(y) < 1900 | Number(y) > 2100)
	{
		selectFocus(obj,'Jaartal '+y+' is onwaarschijnlijk.');				
		return false;				
	}
	// Check day month combination
	var dat = new Date(y,m-1,d);
	if (dat.getMonth() != m-1)
	{
		selectFocus(obj,'Deze maand heeft geen '+d+' dagen.');	
		return false;			
	}
	
	var val = d+'-'+m+'-'+y;
	if (val.length != 10)
	{
		alert('failed to convert date');
		return false;
	}

	obj.value = val;
	return true;		

}

function formatDigits(val, len)
{
	for (var i=1; i <= len; i++)
	{
		if (val.length < i)
			val = '0'+val;
	}	
	return (val);
}

function checkNumber(val,lower,upper,len)
{
	if (!isNumeric(val))
		return false;
	if (val.length > len | Number(val) < lower | Number(val) > upper)	
		return false;
	
	return true;
}

function selectFocus(obj, msg)
{
	obj.select();
	obj.focus();
	
	if (msg)
		alert(msg);
		
}
