var CHECK_PATTERNS={
	asName: /^\w+( \w+)+$/,
	asEmail: /^\w[-.\w_]+@[a-z0-9][-.a-z0-9]+\.[a-z]+$/i,
	asPhone: /^\+?\d+( \d+)+$/,
	asURL: /^(http:\/\/)?[a-z0-9][-a-z0-9.]+\.[a-z]+(\/[\S]*)?$/i,
	asDateDMY: /^([01]\d|2[0-9]|3[01])[-\/](0\d|1[012])[-\/]\d\d\d\d$/,
	asDateYMD: /^\d\d\d\d[-\/](0\d|1[012])[-\/]\d\d$/,
	asInteger: /^\d+$/,
	asNumber: /^\d*(\.\d+)?$/,
	asNoEmpty: /^.+$/
}

// 0 or FALSE means check is OK.
// 1, true or any<>0 is ERROR.
function validateValue(val,patt) {
 if (patt.search(/^!?\/.+\/$/)==0) {
  var NEG;
  if (NEG=(patt.substr(0,1)=='!')) patt=patt.substr(1);
  var exp=new RegExp(patt);
  return (value.search(exp)!=0) ^ NEG;
 }
 switch(patt) {
 	case 'dateYMD':
	case 'date':var test=val.replace(/(\d{4})(\d{2})(\d{2})/,'$1/$2/$3');
			if (!(test=new Date(test))) return 1;
			if (val!=d2s(test)) return 1;
			return 0;
			break;
	case 'email': 	return val.search(CHECK_PATTERNS.asEmail)!=0;
	case 'integer': return val.search(CHECK_PATTERNS.asInteger)!=0;
	case 'number':  return val.search(CHECK_PATTERNS.asNumber)!=0;
	
	default: return 0;
 }
 return 0;
}

// 0 or FALSE means check is OK.
// 1, true or any<>0 is ERROR.
// 2 means message is displayed here.
function validateCtl(me,check) {
 var ERR, msg;
// alert(me.type+' '+me.checked+' '+(me.type=='checkbox')+' '+check);
 if ( (check) || (check=me.getAttribute('validateas')) )
	ERR=validateValue(me.value,check);
 else
 	switch (me.type) {
 		case 'checkbox':
 		case 'radio':
 			ERR=!me.checked; break;
 		default:
			ERR=(me.value=='');
	}

 if ((ERR) && (msg=me.getAttribute('msgonfail'))) {
	alert(msg);
	me.focus();
	ERR=2;
 }
 return ERR;
}

function formmail_validate(me) {
 var s,ctl,reqMsg,ctlName;
 var reqList=me._required ? me._required.value : '';
 
 var ELEMS=me.elements, fail, className;
 var reqMsg=me._reqmsg ? me.reqmsg.value : me.getAttribute('reqFieldMsg');
 if (!reqMsg) reqMsg='Error!\nPor favor, introduzca una valor apropiado para "#FIELD#"';
 var warnMsg=me.getAttribute('warningFieldMsg');
 if (!warnMsg) warnMsg='Se recomienda indicar un valor apropiado par el campo: "#FIELD#"\n\nSeguro que desea dejarlo sin valor?';
 var ERR;
 for (var i=0; i<ELEMS.length; i++) {
	var ctl=ELEMS[i];
	if (!(className=ctl.className) && (reqList.indexOf(ctl.name)>=0)) className='req';
	fail=( (className) && (className=className.match(/^(req|warn)/)) ) && (ERR=validateCtl(ctl)); 
	if ((!fail) && (checkExpr=ctl.getAttribute('check'))) with (ctl) {
		fail=!eval(checkExpr);
	}

	if (fail) switch(className=className?className[1]:'') {
		case 'warn':
			if (confirm(warnMsg.replace('#FIELD#',ctl.title || ctl.name))) break;
			ctl.focus();
			return false;
		case 'req':
		default:
			if (ERR!=2) alert(reqMsg.replace('#FIELD#',ctl.title || ctl.name));
			ctl.focus();
			return false;
	}
 }

/*
 if ((me.customValidate) || (me.customValidate=window[me.name+'_validate']))
	if (!me.customValidate(me,sending)) return false;
*/
// if (sending) { me.submit(); return false; }
 return true;

// ------------- 
/*
 if (s=me._required) {
 	s=s.value.split(',');
 	for (var i in s) if ((ctl=me[s[i]]) && (ctl.value=='')) {
		ctlName=ctl.title || ctl.name;
		alert(reqMsg.replace('#',ctlName))
		ctl.focus();
		return false;
	}
 }
 return true;
*/
}