var checkArray=Array();
// format checkarray
//
// 
var currentPage=0;

/*
#
# Check complete Form
# frm = form elementen
#
*/
function check(frm) {
	  returnValue=true;

	  for (var flds in checkArray)  {
		  if (returnValue)		  {
			  returnValue = returnValue && checkPage(frm, flds);
		  }
		  else {
			break;
		  }

	  }
return returnValue!=0;
}

/*
	# Check pagina
	# frm = form elementen
	# hPage = the page to be checked
	# return true or false
*/
function checkPage(frm, hPage){
    returnValue=true;

	cPage=checkArray[hPage];

	for (var flds in cPage)  {
		if (returnValue)		{
			if (cPage[flds][0]=='special') {
				switch(	cPage[flds][1] ) {
					case  'dateArray': 
						returnValue = returnValue && checkDateArray(frm,flds,cPage[flds][2], hPage);
						break;
					case  'smartyDateArray': 
						returnValue = returnValue && checkSmartyDateArray(frm,flds,cPage[flds][2], hPage);
						break;
					case  'eval':
						eval (returnEval(frm,cPage[flds][2]));
						break;
					}
			}
			else {
				returnValue = returnValue && checkVeld(frm[flds], hPage);
			}
		}
		else {
			break;
		}
	}
return returnValue!=0;
}


function returnEval(frm,evalString) {

	if (evalString.search(/@/gi) != -1)	{
		evalString=evalString.replace(/@/gi, 'document.FRM.'); 
	}
	return (evalString);
}

function checkDateArray(frm, field, msg, pagenr) {
	  day   = frm[field + '[d]'].value;
	  month = frm[field + '[m]'].value;
	  year  = frm[field + '[y]'].value;
	  if (isDate(day, month, year))	  {
		  return true;
	  }
	  else {
		  if (!pagenr)	{
			pagenr=currentPage;
		  }
		  if (pagenr!=currentPage)		  {
			  eval("gotoPage"+pagenr+"();");
		  }
		  display(msg);
		  return false;
	  }
}

function checkSmartyDateArray(frm, field, msg, pagenr) {
	  day   = frm[field + 'Day'].value;
	  month = frm[field + 'Month'].value;
	  year  = frm[field + 'Year'].value;
	  if (isDate(day, month, year))	  {
		  return true;
	  }
	  else {
		  if (!pagenr)	{
			pagenr=currentPage;
		  }
		  if (pagenr!=currentPage)		  {
			  eval("gotoPage"+pagenr+"();");
		  }
		  display(msg);
		  return false;
	  }
}

function checkVeld(fld, pagenr) {
	if (!pagenr)	{
		pagenr=currentPage;
	}
	try
	{
		if (!checkArray[pagenr] || !checkArray[pagenr][fld.name])	{
			return true;
		}
	}
	catch (e)	{
		return true;
	}

	switch (checkArray[pagenr][fld.name][0]) {
		case 'text':
				return checkText(fld,checkArray[pagenr][fld.name][1],checkArray[pagenr][fld.name][2], pagenr);
		case 'number':
				return checkNumber(fld,checkArray[pagenr][fld.name][1],checkArray[pagenr][fld.name][2], pagenr);
		case 'phone':
				return checkPhone(fld,checkArray[pagenr][fld.name][2], pagenr);
		case 'postcode':
				return checkPostcode(fld,checkArray[pagenr][fld.name][1],checkArray[pagenr][fld.name][2], pagenr);
		case 'regexp':
				return checkPostcode(fld,checkArray[pagenr][fld.name][1],checkArray[pagenr][fld.name][2], pagenr );
		case 'email':
				return checkEmail(fld,checkArray[pagenr][fld.name][2], pagenr);
		case 'nocheck':
				return true;
		default: 
				alert('Cannot check: ' + fld.name);
				return true;
	}
}


function display(v) {
	alert(v);
}

function putFocus(veld, pagenr) {
	if (pagenr != currentPage)	{
		eval("gotoPage"+pagenr +"();");
	}
	veld.focus();
}
function checkText(veld,minLength,errorMsg, pagenr) {
	if (veld.value.length < minLength || !isAlphanumeric(veld.value))	{
		putFocus(veld, pagenr);
/*		
		// Explain what wend wrong
		if (veld.value.length < minLength) {
			display(errorMsg + "\nError:\nMinimum length has not been reached (minimum length is " + minLength + ")");
		}
		else {
			display(errorMsg + "\nError:\nOnly numbers and letters are premitted. No  leestekens!");
		}
		*/
		display(errorMsg);
		return false;
	}
	else  {
		return true;
	}
}

function checkNumber(veld,minLength,errorMsg, pagenr) {
	if (veld.value.length < minLength || !isNumeric(veld.value))	{
		putFocus(veld, pagenr);
/*		
		// Explain what wend wrong
		if (veld.value.length < minLength) {
			display(errorMsg + "\nError:\nMinimum length has not been reached (minimum length is " + minLength + ")");
		}
		else {
			display(errorMsg + "\nError:\nOnly numbers are allowed");
		}
		*/
		display(errorMsg);
		return false;
	}
	else  {
		return true;
	}
}

function checkEmail(veld, errorMsg , pagenr) {
	if (veld.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]{2,}$/) != -1)
        return true;
    else {
		/*		
		// Explain what wend wrong
		display(errorMsg + "\nError:\nNo valid email adres found");
		*/
		display(errorMsg);
		putFocus(veld, pagenr);
		return false;
	}
}



function isNumeric(s)
{
	for (i = 0; i < s.length; i++) {   
        // Check that current character is number or letter.
        var c = s.charAt(i);
        if (!_isDigit(c) )
        return false;
    }
    return true;
}

function _isDigit (c)
{  
	return ((c >= "0") && (c <= "9"))
}

function _isLetter (c)
{
	return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z") || c==' ') )
}

function _isSpecial (c) {
	return c=="\n" || c=="\r" || c=="ü" || c=="Ü" || c=="-" || c=="Ä" || c=="ä" || c=="Ö" || c=="ö" || escape(c) == "%DF" || c=="/" || c=="\\" || c=="." || c==":" || c=="(" || c==")";
}
function isAlphanumeric(s)
{
	for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if (! (_isLetter(c) || _isDigit(c) || _isSpecial(c) ) )
        return false;
    }
    return true;
}

function isAlpha(s)
{
	for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number or letter.
        var c = s.charAt(i);
        if (!_isLetter(c) )
        return false;
    }

    // All characters are numbers or letters.
    return true;
}

function y2k(number) { return (number < 1000) ? number + 1900 : number; }

function isDate (day,month,year) {
// checks if date passed is valid
// will accept dates in following format:
// isDate(dd,mm,ccyy), or
// isDate(dd,mm) - which defaults to the current year, or
// isDate(dd) - which defaults to the current month and year.
// Note, if passed the month must be between 1 and 12, and the
// year in ccyy format.

    var today = new Date();
    year = ((!year) ? y2k(today.getYear()):year);
    month = ((!month) ? today.getMonth():month-1);
    if (!day) return false
    var test = new Date(year,month,day);
    if ( (y2k(test.getYear()) == year) &&
         (month == test.getMonth()) &&
         (day == test.getDate()) )
        return true;
    else
        return false
}

