// Form Guard

// Copyright Xin Yang 2003, 2004
// Web Site: www.yxScripts.com
// EMail: m_yangxin@hotmail.com
// Last Updated: APR-22-2004

// This script is free as long as the copyright notice remains intact.

var reNonBlank=/[\S]/;
var reHexColor=/^#[0-9a-fA-F]{6}$/;
var reInt=/^\d+$/;
var reSignedInt=/^(\+|-)?\d+$/;
var reFloat=/^\d+(\.\d+)?$/;
var reSignedFloat=/^(\+|-)?\d+(\.\d+)?$/;
var reChar=/^[\w\-]+$/;
var reEMail=/^\w[\w\-\.\']+\@[\w\-]+(\.[\w\-]+)+$/;
var reIP=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
var rePostalCA=/^(\w\d){3}$/;

function rpChar(f) {
  var df=f;

  df=df.replace(/\\/g, '\\\\');
  df=df.replace(/\//g, '\\\/');
  df=df.replace(/\[/g, '\\\[');
  df=df.replace(/\]/g, '\\\]');
  df=df.replace(/\(/g, '\\\(');
  df=df.replace(/\)/g, '\\\)');
  df=df.replace(/\{/g, '\\\{');
  df=df.replace(/\}/g, '\\\}');
  df=df.replace(/\</g, '\\\<');
  df=df.replace(/\>/g, '\\\>');
  df=df.replace(/\|/g, '\\\|');
  df=df.replace(/\*/g, '\\\*');
  df=df.replace(/\?/g, '\\\?');
  df=df.replace(/\+/g, '\\\+');
  df=df.replace(/\^/g, '\\\^');
  df=df.replace(/\$/g, '\\\$');

  return df;
}

function rePhone(f) {
  var df=rpChar(f);

  df=df.replace(/d/gi, '\\d');
  df=df.replace(/w/gi, '(\\w|\\d)');

  return new RegExp('^'+df+'$');
}

function reDate(f) {
  var df=rpChar(f);

  df=df.replace(/dd/gi, '\\d\\d');
  df=df.replace(/mm/gi, '\\d\\d');
  df=df.replace(/yyyy/gi, '\\d\\d\\d\\d');

  return new RegExp('^'+df+'$');
}

function reCharNM(n,m) {
  return new RegExp("\^[\\w\\-]{"+n+","+m+"}\$");
}

function reNumberN(n,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{1,"+n+"}\$");
}

function reNumberN2(n,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{"+n+"}\$");
}

function reNumberNM(n,m,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{1,"+n+"}(\\.\\d{1,"+m+"})?\$");
}

function reNumberNM2(n,m,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{"+n+"}\\.\\d{"+m+"}\$");
}

function _checkIt(re, field, msg, iNotFocused) {
  if (typeof(field.length)!="undefined") {
    if (field.length==0) {
      return true;
    }
    if (typeof(field.options)!="undefined") {
      if (re.test(field.value)) {
        return true;
      }
    }
    else {
      for (var i=0; i<field.length; i++) {
        if (field[i].checked) {
          return true;
        }
      }
    }
  }
  else {
    if (field.type=="checkbox" || field.type=="radio") {
      if (field.checked) {
        return true;
      }
    }
    else if (re.test(field.value)) {
      return true;
    }
  }
	if (msg) {
  		alert(msg);
	}
	if (!iNotFocused)
	{
		  if (typeof(field.select)!="undefined") {
		    field.select();
		  }
		  if (typeof(field.focus)!="undefined") {
		    field.focus();
		  }
	}
  return false;
}

function goodPhone(pf, field, msg) {
  return _checkIt(rePhone(pf), field, msg);
}

function goodPostalCA(field, msg) {
  return _checkIt(rePostalCA, field, msg);
}

function goodDate(df, field, msg, iNotFocused) {
	
  if (_checkIt(reDate(df), field, msg, iNotFocused)) {
  	
    var di=field.value;
    var y4=df.search(/yyyy/i), y=di.substring(y4, y4+4)-0;
    var m2=df.search(/mm/i), m=di.substring(m2, m2+2)-1;
    var d2=df.search(/dd/i), d=di.substring(d2, d2+2)-0;

    var dd=new Date(y, m, d);
	
	if (y==dd.getFullYear() && m==dd.getMonth() && d==dd.getDate()) {
      return true;
    }
	else if ((dd.getFullYear()==2005 && dd.getMonth()==2 && dd.getDate()==26 && y==2005 && m==2 && d==27) || (dd.getFullYear()==2004 && dd.getMonth()==2 && dd.getDate()==27 && y==2004 && m==2 && d==28) || (dd.getFullYear()==2006 && dd.getMonth()==2 && dd.getDate()==25 && y==2006 && m==2 && d==26))
	{
		  return true;
	}
    else {	
	      if (msg) {
	      	alert(msg);
	      }
	      if (!iNotFocused) {
		      field.select();
		      field.focus();
	      }
    }
  }

  return false;
}

function goodIP(field, msg) {
  return _checkIt(reIP, field, msg);
}

function goodChar(field, msg) {
  return _checkIt(reChar, field, msg);
}

function goodEMail(field, msg) {
  return _checkIt(reEMail, field, msg);
}

function goodInt(field, msg) {
  return _checkIt(reInt, field, msg);
}

function goodSignedInt(field, msg) {
  return _checkIt(reSignedInt, field, msg);
}

function goodFloat(field, msg)
{
//alert(field.value)	
  return _checkIt(reFloat, field, msg);
}

function goodSignedFloat(field, msg) {
  return _checkIt(reSignedFloat, field, msg);
}

function goodIntLen(n, field, msg) {
  return _checkIt(reNumberN(n,0), field, msg);
}

function goodSignedIntLen(n, field, msg) {
  return _checkIt(reNumberN(n,1), field, msg);
}

function goodIntLen2(n, field, msg) {
  return _checkIt(reNumberN2(n,0), field, msg);
}

function goodSignedIntLen2(n, field, msg) {
  return _checkIt(reNumberN2(n,1), field, msg);
}

function goodCharLen(n, m, field, msg) {
  return _checkIt(reCharNM(n,m), field, msg);
}

function goodFloatLen(n, m, field, msg) {
  return _checkIt(reNumberNM(n,m,0), field, msg);
}

function goodSignedFloatLen(n, m, field, msg) {
  return _checkIt(reNumberNM(n,m,1), field, msg);
}

function goodFloatLen2(n, m, field, msg) {
  return _checkIt(reNumberNM2(n,m,0), field, msg);
}

function goodSignedFloatLen2(n, m, field, msg) {
  return _checkIt(reNumberNM2(n,m,1), field, msg);
}

function _rangeIt(field, r1, r2, msg) {
  if (field.value>=r1 && field.value<=r2) {
    return true;
  }
  else {
    alert(msg);

    field.select();
    field.focus();

    return false;
  }
}

function rangeInt(field, r1, r2, msg) {
  if (goodInt(field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeSignedInt(field, r1, r2, msg) {
  if (goodSignedInt(field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeFloat(field, r1, r2, msg) {
  if (goodFloat(field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeSignedFloat(field, r1, r2, msg) {
  if (goodSignedFloat(field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeIntLen(n, field, r1, r2, msg) {
  if (goodIntLen(n, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeSignedIntLen(n, field, r1, r2, msg) {
  if (goodSignedIntLen(n, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeIntLen2(n, field, r1, r2, msg) {
  if (goodIntLen2(n, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeSignedIntLen2(n, field, r1, r2, msg) {
  if (goodSignedIntLen2(n, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeFloatLen(n, m, field, r1, r2, msg) {
  if (goodFloatLen(n, m, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeSignedFloatLen(n, m, field, r1, r2, msg) {
  if (goodSignedFloatLen(n, m, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeFloatLen2(n, m, field, r1, r2, msg) {
  if (goodFloatLen2(n, m, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function rangeSignedFloatLen2(n, m, field, r1, r2, msg) {
  if (goodSignedFloatLen2(n, m, field, msg)) {
    return _rangeIt(field, r1, r2, msg);
  }

  return false;
}

function _dd(n) {
  return (n<10)?"0"+n:""+n;
}

function _getOffset(n) {
  var d=new Date();
  if (n!=0) {
    d.setTime(d.getTime()+n*86400000);
  }
  return d.getFullYear()+""+_dd(d.getMonth()+1)+""+_dd(d.getDate())+"";
}

function _stringIt(df, d) {
  var y4=df.search(/yyyy/i), m2=df.search(/mm/i), d2=df.search(/dd/i);
  return d.substring(y4, y4+4)+d.substring(m2, m2+2)+d.substring(d2, d2+2);
}

function rangeDate(df, field, r1, r2, msg) {
  if (goodDate(df, field, msg)) {
    var d=_stringIt(df, field.value);

    var r1x="", r2x="";
    if (r1.search(/^\d+$/)!=-1) {
      r1x=_getOffset(r1-0);
    }
    else {
      r1x=_stringIt(df, r1);
    }
    if (r2.search(/^\d+$/)!=-1) {
      r2x=_getOffset(r2-0);
    }
    else {
      r2x=_stringIt(df, r2);
    }

    if (d<r1x || d>r2x) {
      alert(msg);

      field.select();
      field.focus();
    }
    else {
      return true;
    }
  }

  return false;
}

function goodDateRange(df, field1, field2, msg) {
  if (goodDate(df, field1, msg) && goodDate(df, field2, msg)) {
    if (_stringIt(df, field1.value)>_stringIt(df, field2.value)) {
      alert(msg);
      field1.focus();
    }
    else {
      return true;
    }
  }

  return false;
}

function goodDateRange2(df, field1, field2, msg) {
  if (goodDate(df, field1, msg) && goodDate(df, field2, msg)) {
    if (_stringIt(df, field1.value)>=_stringIt(df, field2.value)) {
      alert(msg);
      field1.focus();
    }
    else {
      return true;
    }
  }

  return false;
}

function goodHexColor(field, msg) {
  return _checkIt(reHexColor, field, msg);
}

function nonBlank(field, msg) {
  return _checkIt(reNonBlank, field, msg);
}

function goodRadioedFields(form, fn, re, msgs, msg) {
  for (var i=0; i<form[fn].length; i++) {
    if (form[fn][i].checked) {
      return _checkIt(re, form[form[fn][i].value], msgs[i]);
    }
  }

  alert(msg);
  return false;
}

function goodRadioedFields2(form, fn, re, msgs, msg) {
  for (var i=0; i<form[fn].length; i++) {
    if (form[fn][i].checked) {
      return _checkIt(re[i], form[form[fn][i].value], msgs[i]);
    }
  }

  alert(msg);
  return false;
}

function noBadWords(field, strict, words, msg) {
  var lw=[], nwb=strict?'':'\\b';
  for (var i=0; i<words.length; i++) {
    lw[i]=nwb+words[i].toLowerCase()+nwb;
  }

  var re=new RegExp(lw.join("|"), "i");
  if (re.test(field.value)) {
    alert(msg);
    return false;
  }
  else {
    return true;
  }
}

function formValidator(a){
	
	var i,j, leni, lenj, field, fieldCaption, matchValue, isSelect, tdObj, arrFields, sArticle; 
	for(i=0, leni=a.elements.length; i<leni; i++){
		field = a.elements[i];
				
		// if is a radio, chckbox, or select
		if (typeof(field.length)!="undefined") {
			
			try{
				
			// if is select
			if (typeof(field.options)!="undefined") {
				
				//if(field.required == "true"){
				if(field.getAttribute("required") == "true"){	
					tdObj = field.parentNode;
					while (tdObj.tagName != "TD"){
						tdObj = tdObj.parentNode;
					}
					
					 if (navigator.userAgent.toLowerCase().indexOf('msie') > -1){
					 	fieldCaption = tdObj.previousSibling.innerText.split(":")[0];
					 }else{
						fieldCaption = tdObj.previousSibling.textContent.split(":")[0]; 
					 }
					

					switch(fieldCaption.charAt(0).toLowerCase()){
						case "a" : 
						case "e" :
						case "i" :
						case "o" :
						case "u" : sArticle = "an"; break;
						default	 : sArticle = "a";
					}
					if(field.type == "select-one"){
						if(field.disabled == false && field.selectedIndex <= 0){
							alert("Please choose " + sArticle + " '" + fieldCaption + "'!");
							  if (typeof(field.focus)!="undefined") {
							    field.focus();
							  }
							return false;
						}
					}else if(field.type == "select-multiple"){
						isSelect = 0;
						for(j=1, lenj = field.length; j < lenj; j++){
							if(field.options[j].selected == true){
								isSelect = 1;
							}
						}
						
						if(isSelect == 0){
							alert("Please choose " + sArticle + " '" + fieldCaption + "'!");
							  if (typeof(field.focus)!="undefined") {
							    field.focus();
							  }
							return false;
						}
					}
				}
			}// if is radio or checkbox
			else {
				for (j=0, lenj=field.length; j<lenj; j++) {
					if(field[j].required == "true" && field[j].checked == false){
						alert("This option is mandatory!");
						 if (typeof(field[j].focus)!="undefined") {
						    field[j].focus();
						  }
						return false;
					}
				}
			}
			
			}catch(e){
					alert(fieldCaption);
				}
		}
		else {
			

			if(field.type == "hidden" || field.type == "button" || field.type == "submit" || field.type == "textarea")
				continue;
		
			if (field.type=="checkbox" || field.type=="radio") {
				//if(field.required == true && field.checked == false){
				if(field.getAttribute("required") == "true" && field.checked == false) {
					alert("This option is mandatory!");
					 if (typeof(field.focus)!="undefined") {
					    field.focus();
					  }
					return false;
				}
			}
			else {
				
				tdObj = field.parentNode;
				while (tdObj.tagName != "TD"){
					tdObj = tdObj.parentNode;
				}
				if(field.caption) {
					fieldCaption = field.caption;
				} else {
					if (navigator.userAgent.toLowerCase().indexOf('msie') > -1){
					 	fieldCaption = tdObj.previousSibling.innerText.split(":")[0];
					 }else{
						fieldCaption = tdObj.previousSibling.textContent.split(":")[0]; 
					 }
				}
				
				if(field.getAttribute("required") == "true"){
					if(!nonBlank(field, "Field '" + fieldCaption + "' must not be empty!")){									 
						return false;
					}
				}
				
				/*
				if(field.required == "true"){
					if(!nonBlank(field, "Field '" + fieldCaption + "' must not be empty!")){									 
						return false;
					}
				}
				*/
				
				if(field.validator){
					if(field.value){
						if(field.validator == "Int"){
							if(!goodInt(field, "Field '" + fieldCaption + "' must be an integer!"))
								return false;
						}else if(field.validator == "SignedInt"){
							if(!goodSignedInt(field, "Field '" + fieldCaption + "' must be valid number!"))
								return false;
						}else if(field.validator == "Float"){
							if(!goodFloat(field, "Field '" + fieldCaption + "' must be valid number!"))
								return false;
						}else if(field.validator == "SignedFloat"){
							if(!goodSignedFloat(field, "Field '" + fieldCaption + "' must be valid number!"))
								return false;
						}
						else if(field.validator == "Percent"){
							if(field.value.length > 0){
								if(!goodFloat(field, "Field '" + fieldCaption + "' must be valid number!"))
									return false;
							}
							if(parseFloat(field.value) > 100){
								alert("You cannot put in values greater than 100%");
								if (typeof(field.focus)!="undefined") {
								    field.focus();
								  }
								return false;
							}
						}
						else if(field.validator == "EMail"){
							if(!goodEMail(field, "Field '" + fieldCaption + "' must be valid e-mail address!"))
								return false;
						}
						else if(field.validator == "Date"){
							
							if(!goodDate("mm/dd/YYYY", field, "Field '" + fieldCaption + "' must be in a valid date format!"))
								return false;
						}
					}
				}
				if(field.matchWith){
					arrFields = document.getElementsByName(field.matchWith);
					for(j=0, len = arrFields.length; j < len; j++){
						if(arrFields[j].type != "hidden"){
							matchValue = arrFields[j].value;
							break;
						}
					}
					
					if(field.value != matchValue){
						alert("Please confirm " + fieldCaption + "!");
						if (typeof(field.focus)!="undefined") {
						    field.focus();
						  }
						return false;
					}
				}
					
					
			}
						
		}
	}
	
	return true;
}