// MM_validateForm('NAME','','R',...)
function MM_validateForm() { //v3.0
  var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;
  for (i=0; i<(args.length-2); i+=3) { 
		test=args[i+2]; 
		//alert(test+' '+args[i]);
		if((test == 'MESSAGE') && args[i]) {
			errors+='- '+args[i]+'\n';
			continue
		}
		val=MM_findObj(args[i]); 
    if (val && !elementIsHidden(val)) { nm=args[i]; if ((val=elementValue(val))!="") {

      var neg = args[i+1].toUpperCase() == "NOT";
      if (test.indexOf('isEmail')!=-1) {
        if (!validEmail(val)) errors+='- '+prettyName(nm)+' must contain an e-mail address.\n';
      }
      else if(test.indexOf('isDate')!=-1) {
        if(!validateUSDate(val)) errors+='- '+prettyName(nm)+' must contain a date in the form MM/DD/YYYY.\n';
      }
      else if(test.indexOf('isPastDate')!=-1) {
        if(neg) {if(isPastDate(val)) errors+='- '+prettyName(nm)+' must be a future date or today.\n';}
        else if(!isPastDate(val)) errors+='- '+prettyName(nm)+' must be a date before today.\n';
      }
      else if(test.indexOf('isFutureDate')!=-1) {
        if(neg) {if(isFutureDate(val)) errors+='- '+prettyName(nm)+' must be a past date or today.\n';}
        else if(!isFutureDate(val)) errors+='- '+prettyName(nm)+' must be a date after today.\n';
      }
      else if(test.indexOf('datesInOrder')!=-1) {
        val2=MM_findObj(args[i+1]);
        if(val2) val2 = val2.value;
        if(!datesInOrder(val, val2)) errors+='- '+prettyName(nm)+' must be earlier or the same as '+prettyName(args[i+1])+'.\n';
      }
      else if(test.indexOf('EQ')!=-1) {
        val2=MM_findObj(args[i+1]);
        if(val2) val2 = val2.value;
        if(val != val2) errors+='- '+prettyName(nm)+' and '+prettyName(args[i+1])+' must be the same.\n';
      }
      else if(test.indexOf('PHONE')!=-1) {
        val2=args[i+1];
        if(!isValidPhoneForm(val,val2)) {
					var constraint = 'at least '+val2+' digits long';
					if(val2 == 'FULL_US') constraint = 'including the area code';
					errors+='- '+prettyName(nm)+' must be a phone number '+constraint+'.\n';
				}
      }
      else if(test.indexOf('MINLEN')!=-1) {
        val2=args[i+1];
        if(val.length < val2) errors+='- '+prettyName(nm)+' must be at least '+val2+' characters long.\n';
      }
      else if(test.indexOf('MAXLEN')!=-1) {
        val2=args[i+1];
        if(val.length > val2) errors+='- '+prettyName(nm)+' must be at MOST '+val2+' characters long.\n';
      }
      else if(test.indexOf('validPassword')!=-1) {
        if(!validPasswordForm(val))
          errors+='- '+prettyName(nm)+' must be between 6 and 12 characters, with at least one letter and one digit.\n';
      }
      else if (test.charAt(0) != 'R') { num = parseFloat(val);
        if (val!=''+num && (val!=''+num+'.0')) errors+='- '+prettyName(nm)+' must contain a number.\n';
        if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
          min=test.substring(8,p); max=test.substring(p+1);
          if (num<min || max<num) errors+='- '+prettyName(nm)+' must contain a number between '+min+' and '+max+'.\n';
    } } 
    }
    else if ((test == 'RIFF') && args[i+1]) errors += '- '+prettyName(nm)+' is required.\n';
    else if (test == 'R') errors += '- '+prettyName(nm)+' is required.\n'; }

  } if (errors) alert('Warning:\n'+errors);
  document.MM_returnValue = (errors == '');
  return (errors == '');
}

function validEmail(src) {
  //var emailReg = "^[\\w-_\.+]*[\\w-_\.]\@([\\w]+\\.)+[\\w]+[\\w]$";
  //var regex = new RegExp(emailReg);
  //return regex.test(src);
  //var emailFilter=/^.+@.+\..{2,3,4,6}$/;
  //return emailFilter.test(src);
  var regex = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;
  return regex.test(src);

}
	
function elementIsHidden(el) {
	thisEl = el.length ? el[0] : el;
	for(thisEl = el; thisEl; thisEl = thisEl.parentElement) {
	  if (thisEl.style && (thisEl.style.visibility == 'hidden')) return true;
	}
	return false;
}
	

var prettyNames = Array();
function setPrettynames() {
  var i, p=prettyNames.length,args=setPrettynames.arguments;
  for(i=0; i<(args.length-1); i+=2) {
    prettyNames[p] = args[i];
    prettyNames[p+1] = args[i+1];
    p += 2;
  }
}


function elementValue(radioObj) {
	if(!radioObj)
		return "";
	if(typeof radioObj.length == 'undefined' || (radioObj.type == 'select-one'))
	  return radioObj.value;
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}

function prettyName(key) {
  var i;
  for(i=0; i<(prettyNames.length-1); i+=2) {
    if(prettyNames[i] == key) return prettyNames[i+1];
  }
  return key;
}

function isValidPhoneForm(strValue,minDigits) {
	var charsAllowed = "0123456789()-./";
	var numDigits = 0;
	minDigits = minDigits == 'FULL_US' ? 10 : minDigits;
	for(var i=0;i<strValue.length;i++) {
		var index = charsAllowed.indexOf(strValue.charAt(i));
		if(index < 0) return false;
		if(index < 10) numDigits++;
	}
	return (numDigits >= minDigits);
}


function validPasswordForm(strValue) {
  if(strValue.length < 6) return false;
  if(strValue.length > 12) return false;
  var num=0,alpha=0;
 for(i=0;i<strValue.length;i++) {
    var c=strValue.charAt(i);
    if((c>='a' && (c <= 'z')) || (c>='A' && (c <= 'Z'))) alpha++;
    else if(c>='0' && (c <= '9')) num++;
    if(num > 0 && (alpha > 0)) return true;
  }
  return false;

/* at least 6 chars, at least
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,}$
*/
  //var objRegExp = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{4,8}$/
  //return objRegExp.test(strValue);
}

function isPastDate(strValue) {
  var arrayDate = mdy(strValue);
  if(!arrayDate) return false;
  var today = todayArray();
  if(today[2] > arrayDate[2]) return true;
  else if(today[2] < arrayDate[2]) return false;
  if(today[0] > arrayDate[0]) return true;
  else if(today[0] < arrayDate[0]) return false;
  if(today[1] > arrayDate[1]) return true;
  else if(today[1] < arrayDate[1]) return false;
  return false;  // it's today
}


function isFutureDate(strValue) {
  if(isPastDate(strValue)) return false;
  if(""+todayArray() == ""+mdy(strValue)) return false;
  return true;
}

function todayArray() {
  var date = new Date();
  var today = new Array(3);
  today[0] = date.getMonth()+1;
  today[1] = date.getDate();
  today[2] = date.getFullYear();
  return today;
}

function datesInOrder(d1String,d2String) {
  d1 = mdy(d1String);
  d2 = mdy(d2String);
  if(!d1 || !d2) return true;
  if(d2[2] > d1[2]) return true;
  else if(d2[2] < d1[2]) return false;
  if(d2[0] > d1[0]) return true;
  else if(d2[0] < d1[0]) return false;
  if(d2[1] > d1[1]) return true;
  else if(d2[1] < d1[1]) return false;
  return true;
}

function mdy(strValue) {
  //var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
  var objRegExp = /^\d{1,2}(\/)\d{1,2}\1\d{4}$/
  //check to see if in correct format
  if(!objRegExp.test(strValue))
    return null; //doesn't match pattern, bad date
  else{
    var arrayDate = strValue.split(RegExp.$1); //split date into month, day, year
    arrayDate[0] = parseInt(arrayDate[0],10);
    arrayDate[1] = parseInt(arrayDate[1],10);
    arrayDate[2] = parseInt(arrayDate[2],10);
    return arrayDate;
  }
}



function MM_findObj(n, d) { //v3.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); return x;
}

function validateUSDate( strValue ) {
/************************************************
DESCRIPTION: Validates that a string contains only
    valid dates with 2 digit month, 2 digit day,
    4 digit year. Date separator can be ., -, or /.
    Uses combination of regular expressions and
    string parsing to validate date.
    Ex. mm/dd/yyyy or mm-dd-yyyy or mm.dd.yyyy

PARAMETERS:
   strValue - String to be tested for validity

RETURNS:
   True if valid, otherwise false.

REMARKS:
   Avoids some of the limitations of the Date.parse()
   method such as the date separator character.
*************************************************/
  var arrayDate = mdy(strValue);
  //check to see if in correct format
  if(!arrayDate)
    return false; //doesn't match pattern, bad date
  else{
    var intDay = arrayDate[1];
    var intYear = arrayDate[2];
    var intMonth = arrayDate[0];

	//check for valid month
	if(intMonth > 12 || intMonth < 1) {
		return false;
	}

    //create a lookup for months not equal to Feb.
    //var arrayLookup = { 1 : 31,3 : 31, 4 : 30,5 : 31,6 : 30,7 : 31, 8 : 31,9 : 30,10 : 31,11 : 30,12 : 31}
    var arrayLookup = new Array(13);
    arrayLookup[0] = 99 ;
    arrayLookup[1] = 31;
    arrayLookup[3] = 31;
    arrayLookup[4] = 30;
    arrayLookup[5] = 31;
    arrayLookup[6] = 30;
    arrayLookup[7] = 31 ;
    arrayLookup[8] = 31;
    arrayLookup[9] = 30;
    arrayLookup[10] = 31;
    arrayLookup[11] = 30;
    arrayLookup[12] = 31;

    //check if month value and day value agree
    if(arrayLookup[arrayDate[0]] != null) {
      if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
        return true; //found in lookup table, good date
    }

    //check for February
	var booLeapYear = (intYear % 4 == 0 && (intYear % 100 != 0 || intYear % 400 == 0));
    if( ((booLeapYear && intDay <= 29) || (!booLeapYear && intDay <=28)) && intDay !=0)
      return true; //Feb. had valid number of days
  }
  return false; //any other values, bad date
}

/*
(?=\d)^(?:(?!(?:10\D(?:0?[5-9]|1[0-4])\D(?:1582))|(?:0?9\D(?:0?[3-9]|1[0-3])\D(?:1752)))((?:0?[13578]|1[02])|(?:0?[469]|11)(?!/31)(?!-31)(?!\.31)|(?:0?2(?=.?(?:(?:29.(?!000[04]|(?:(?:1[^0-6]|[2468][^048]|[3579][^26])00))(?:(?:(?:\d\d)(?:[02468][048]|[13579][26])(?!\x20BC))|(?:00(?:42|3[0369]|2[147]|1[258]|09)\x20BC))))))|(?:0?2(?=.(?:(?:\d\D)|(?:[01]\d)|(?:2[0-8])))))([-.\/])(0?[1-9]|[12]\d|3[01])\2(?!0000)((?=(?:00(?:4[0-5]|[0-3]?\d)\x20BC)|(?:\d{4}(?!\x20BC)))\d{4}(?:\x20BC)?)(?:$|(?=\x20\d)\x20))?((?:(?:0?[1-9]|1[012])(?::[0-5]\d){0,2}(?:\x20[aApP][mM]))|(?:[01]\d|2[0-3])(?::[0-5]\d){1,2})?$
*/


