function vfn_date(vfo,elemVal){
	var isValid=false;
	var dateRE=getDefaultRegExp('date');
	var rePosn=0;
	var dd='';
	var mm='';
	var yy='';
	var yyyy='';
	var d=new Date();
	var dx=new Date();
	rePosn=elemVal.search(dateRE);
	if(rePosn == 0){
		// got a rough match - try to convert to date
		dd=elemVal.substr(0,2);
		mm=elemVal.substr(3,2);
		yyyy=elemVal.substr(6,4);
		// convert the input string into integers (mm-1 because zero based JS months)
		d1=parseInt(dd);
		m1=parseInt(mm)-1;
		y1=parseInt(yyyy);
		// setup the date
		d.setDate(d1);
		d.setMonth(m1);
		d.setFullYear(y1);
		// extract back the date values
		d2=d.getDate();
		m2=d.getMonth();
		y2=d.getFullYear();
		//alert('day in=' + dd + ' int=' + d1 + ' out=' + d2);
		//alert('month in=' + mm + ' int=' + m1 + ' out=' + m2);
		//alert('year in=' + yyyy + ' int=' + y1 + ' out=' + y2);
		//alert(d.toLocaleString());
		// compare in and out values
		if(d1 == d2 && m1 == m2 && y1 == y2){
			isValid=true;
			// finally check for minVal and MaxVal (dxm-1 because zero based JS months)
			if(vfo.minVal.length == 10){
				dxd=parseInt(vfo.minVal.substr(0,2));
				dxm=parseInt(vfo.minVal.substr(3,2))-1;
				dxy=parseInt(vfo.minVal.substr(6,4));
				dx.setDate(dxd);
				dx.setMonth(dxm);
				dx.setFullYear(dxy);
				dx.setHours(0);
				dx.setMinutes(0);
				dx.setSeconds(0);
				dt=d.getTime() - dx.getTime();
				if(dt >= 0){isValid=true;}
				else{isValid=false;}
				}
			if(isValid && vfo.maxVal.length == 10){
				dxd=parseInt(vfo.maxVal.substr(0,2));
				dxm=parseInt(vfo.maxVal.substr(3,2))-1;
				dxy=parseInt(vfo.maxVal.substr(6,4));
				dx.setDate(dxd);
				dx.setMonth(dxm);
				dx.setFullYear(dxy);
				dt=d.getTime() - dx.getTime();
				if(dt <= 0){isValid=true;}
				else{isValid=false;}
				}
			}
		}
	return isValid;
	}

function vfn_integer(vfo,elemVal){
	var isValid=false;
	var eVal=0;
	if(vfo.minLen == 0 && elemVal.length == 0){
		// empty optional field
		isValid=true;
		}
	else{
		if(elemVal.length == 0){
			// empty required field
			isValid=false;
			}
		else{
			// non-empty required field

			// covert elemVal to integer
			eVal=parseInt(elemVal);

			if(eVal == elemVal){
				// is an integer - check minVal and maxVal
				isValid=true;
				if(eVal < vfo.minVal){isValid=false;}
				if(eVal > vfo.maxVal){isValid=false;}
				}
			else{
				// not an integer
				isValid=false;
				}
			}
		}
	return isValid;
	}

function vfn_decimal(vfo,elemVal){
	var isValid=false;
	var decimalRE=getDefaultRegExp('decimal');
	var eVal=parseFloat(elemVal);
	var rePosn=0;
	var minVal=parseFloat(vfo.minVal);
	var maxVal=parseFloat(vfo.maxVal);
	if(vfo.minLen == 0 && elemVal.length == 0){
		// empty optional field
		isValid=true;
		}
	else{
		if(elemVal.length == 0){
			// empty required field
			isValid=false;
			}
		else{
			if(eVal != elemVal){
				// can not convert to float
				isValid=false;
				}
			else{
				rePosn=elemVal.search(decimalRE);
				if(rePosn == 0){
					// RegExp matched  - check minVal and maxVal
					isValid=true;
					if(eVal < minVal){isValid=false;}
					if(eVal > maxVal){isValid=false;}
					}
				else{
					// RegExp not matched
					isValid=false;
					}
				}
			}
		}
	return isValid;
	}

function vfn_text(vfo,elemVal){
	var isValid=false;
	if(vfo.minLen == 0 && elemVal.length == 0){
		// empty optional field
		isValid=true;
		}
	else{
		if(elemVal.length == 0){
			// empty required field
			isValid=false;
			}
		else{
			// non-empty field
			isValid=true;
			// shorter than minLen
			if(elemVal.length < vfo.minLen){isValid=false;}
			// longer than maxLen
			if(vfo.maxLen != 0 && (elemVal.length > vfo.maxLen)){isValid=false;}
			if(isValid){
				// correct length non-empty field
				// minVal and maxVal do not apply to text but check for regExp
				if(vfo.regExp.length == 0){
					// no regExp
					isValid=true;
					}
				else{
					// user defined regExp
					alert('user defined regExp');
					isValid=false;
					}
				}
			}
		}
	return isValid;
	}

function vfn_email(vfo,elemVal){
	var isValid=false;
	var reg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/; // not valid
 	var reg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/; // valid
  	if(!reg1.test(elemVal) && reg2.test(elemVal)){isValid=true;}
  	else{isValid=false;}
	return isValid;
	}
