function doValidateEvent(frm) {
   var NoSave = "\n\nEvent not saved!";
   if (!confirm("Validate and submit form?")) {
      alert("Form validation/submit cancelled\n" + NoSave);
      return false;
   }

   frm.ShDesc.value = alltrim(frm.ShDesc.value);
   if (isEmpty(frm.ShDesc.value)) {
      alert("You must enter an event description" + NoSave);
      frm.ShDesc.focus();
      return false;
   }

   frm.BegYear.value = alltrim(frm.BegYear.value);
   if (isEmpty(frm.BegYear.value)) {
      alert("You must enter a Year value" + NoSave);
      frm.BegYear.focus();
      return false;
   }  else if (! isPosInteger(frm.BegYear.value)) {
         alert("Year must be a positive integer value" + NoSave);
         frm.BegYear.focus();
         frm.BegYear.select();
         return false;
   }  else if (frm.BegYear.value.length == 3) {
         alert("Invalid year length. Year may be of length 4, 2 or 1" + NoSave);
         frm.BegYear.focus();
         frm.BegYear.select();
         return false;
   }
   frm.BegYear.value = FixYear(frm.BegYear.value);

   frm.BegMon.value = alltrim(frm.BegMon.value);
   if (isEmpty(frm.BegMon.value)) {
      alert("You must enter a Beginning Month value" + NoSave);
      frm.BegMon.focus();
      return false;
   }  else if (! isPosInteger(frm.BegMon.value)) {
         alert("Month must be a positive integer value" + NoSave);
         frm.BegMon.focus();
         frm.BegMon.select();
         return false;
   }  else if ((frm.BegMon.value < 1) || (frm.BegMon.value > 12)) {
         alert("Month must be a integer value from 1 to 12" + NoSave);
         frm.BegMon.focus();
         frm.BegMon.select();
         return false;
   }
   frm.BegMon.value = ZeroPad(frm.BegMon.value,2);

   frm.BegDay.value = alltrim(frm.BegDay.value);
   if (isEmpty(frm.BegDay.value)) {
      alert("You must enter a Beginning Day value" + NoSave);
      frm.BegDay.focus();
      return false;
   }  else if (! isPosInteger(frm.BegDay.value)) {
         alert("Day must be a positive integer value" + NoSave);
         frm.BegDay.focus();
         frm.BegDay.select();
         return false;
   }  else if ((frm.BegDay.value < 1) ||
               (frm.BegDay.value > month_len(frm.BegMon.value,frm.BegYear.value))) {
         alert("Day must be a integer value from 1 to " +
               month_len(frm.BegMon.value,frm.BegYear.value) + NoSave);
         frm.BegDay.focus();
         frm.BegDay.select();
         return false;
   }
   frm.BegDay.value = ZeroPad(frm.BegDay.value,2);

   frm.BegHour.value = alltrim (frm.BegHour.value);
   if (isEmpty(frm.BegHour.value)) {
      if (!confirm("Did you mean to leave the Begin Time field empty?")) {
         frm.BegHour.focus();
         return false;
      } else {
         frm.BegHour.value = '00';
         frm.BegMin.vaue = '00';
      }
   }  else if (! isPosInteger(frm.BegHour.value)) {
         alert("Hour must be a positive integer value" + NoSave);
         frm.BegHour.focus();
         frm.BegHour.select();
         return false;
   }  else if (! inIntRange(frm.BegHour.value, 0, 12)) {
         alert("Hour must be in the integer range 0 - 12" + NoSave);
         frm.BegHour.focus();
         frm.BegHour.select();
         return false;
      }
   frm.BegHour.value = ZeroPad(frm.BegHour.value,2);

   frm.BegMin.value = alltrim(frm.BegMin.value);
   if (isEmpty(frm.BegMin.value)) {
      frm.BegMin.value = '00';
   }  else if (! isPosInteger(frm.BegMin.value)) {
      alert("Minutes field must be a positive integer value" + NoSave);
      frm.BegMin.focus();
      frm.BegMin.select();
      return false;
   }  else if (! inIntRange(frm.BegMin.value, 0, 59)) {
      alert("Minutes value  must be in the integer range 0 - 59" + NoSave);
      frm.BegMin.focus();
      frm.BegMin.select();
      return false;
   }
   frm.BegMin.value = ZeroPad(frm.BegMin.value,2);

   frm.EndYear.value = alltrim(frm.EndYear.value);
   if (! isEmpty(frm.EndYear.value)) {
      if (! isPosInteger(frm.EndYear.value)) {
         alert("Year must be blank or a positive integer value" + NoSave);
         frm.EndYear.focus();
         return false;
      }  else if (frm.EndYear.value.length == 3) {
         alert("Invalid year length. Year may be of length 4, 2 or 1" + NoSave);
         frm.EndYear.focus();
         frm.EndYear.select();
         return false;
      }
      frm.EndYear.value = FixYear(frm.EndYear.value);
   }

   frm.EndMon.value = alltrim(frm.EndMon.value);
   if (! isEmpty(frm.EndMon.value)) {
      if (! isPosInteger(frm.EndMon.value)) {
         alert("Month must be blank or a positive integer value" + NoSave);
         frm.EndMon.focus();
         return false;
      }  else if ((frm.EndMon.value < 1) || (frm.EndMon.value > 12)) {
            alert("Month must be blank or a integer from 1 to 12" + NoSave);
            frm.EndMon.focus();
            frm.EndMon.select();
            return false;
      }
      frm.EndMon.value = ZeroPad(frm.EndMon.value,2);
   }

   frm.EndDay.value = alltrim(frm.EndDay.value);
   if (! isEmpty(frm.EndDay.value)) {
      if (! isPosInteger(frm.EndDay.value)) {
         alert("Day must be blank or a positive integer value" + NoSave);
         frm.EndDay.focus();
         return false;
      }  else if (isEmpty(frm.EndYear.value)) {
	    alert("If the day value is not blank you must enter a year value" +
		   NoSave);
	    frm.EndYear.focus();
	    return false;
      }  else if (isEmpty(frm.EndMon.value)) {
	    alert("If the day value is not blank you must enter a month value" +
		  NoSave);
	    frm.EndMon.focus();
	    return false;
      }  else if ((frm.EndDay.value < 1) ||
            (frm.EndDay.value > month_len(frm.EndMon.value,frm.EndYear.value))) {
            alert("Day must be a integer value from 1 to " +
                  month_len(frm.EndMon.value,frm.EndYear.value) + NoSave);
            frm.EndDay.focus();
            frm.EndDay.select();
            return false;
      }
      frm.EndDay.value = ZeroPad(frm.EndDay.value,2);
   }

   frm.EndHour.value = alltrim(frm.EndHour.value);
   if (! isEmpty(frm.EndHour.value)) {
      if (! isPosInteger(frm.EndHour.value)) {
	 alert("The hour field must be a positive integer" + NoSave);
	 frm.EndHour.focus();
	 frm.EndHour.select();
	 return false;
      }  else if (! inIntRange(frm.EndHour.value, 1, 12)) {
      alert("Hour must be in the integer range 1 - 12" + NoSave);
      frm.EndHour.focus();
      frm.EndHour.select();
      return false; 
      }
      frm.EndHour.value = ZeroPad(frm.EndHour.value,2);
   }

   frm.EndMin.value = alltrim(frm.EndMin.value);
   if (! isEmpty(frm.EndMin.value)) {
      if (isEmpty(frm.EndHour.value)) {
            alert("If you give ending minutes, you must give ending hours" +
		   NoSave);
            frm.EndHour.focus();
            return false;
      }  else if (! isPosInteger(frm.EndMin.value)) {
	    alert("The minutes field must be a positive integer" + NoSave);
	    frm.EndMin.focus();
	    frm.EndMin.select();
	    return false;
      }  else if (! inIntRange(frm.EndMin.value, 0, 59)) {
	    alert("Minutes value  must be in the integer range 0 - 59" + NoSave);
	    frm.EndMin.focus();
	    frm.EndMin.select();
	    return false;
      }
      frm.EndMin.value = ZeroPad(frm.EndMin.value,2);
   }  else {
	 if (! isEmpty(frm.EndHour.value)) {
	    frm.EndMin.value = '00';
	 }
   }

   frm.ConTel3.value = alltrim(frm.ConTel3.value);
   if (isEmpty(frm.ConTel3.value)) {
      frm.ConTel1.value = "";
      frm.ConTel2.value = "";
   }  else if (! isPosInteger(frm.ConTel3.value)) {
	 alert("The third phone field should be a positive integer" + NoSave);
	 frm.ConTel3.focus();
	 frm.ConTel3.select();
	 return false;
   }  else if (frm.ConTel3.value.length != 4) {
         alert("The third phone field must be 4 digits long" + NoSave);
         frm.ConTel3.focus();
         frm.ConTel3.select();
         return false;
   }

   frm.ConTel2.value = alltrim(frm.ConTel2.value);
   if (isEmpty(frm.ConTel2.value)) {
      frm.ConTel1.value = "";
      if (! isEmpty(frm.ConTel3.value)) {
	 alert("The second phone field cannot be blank" + NoSave);
	 frm.ConTel2.focus();
	 frm.ConTel2.select();
	 return false;
      }
   } else if (! isPosInteger(alltrim(frm.ConTel2.value))) {
	alert("The second phone field should be a positive integer" + NoSave);
 	frm.ConTel2.focus();
	frm.ConTel2.select();
	return false;
   } else if (frm.ConTel2.value.length == 2) {
	alert("The second phone field should be 1 or 3 digits long" + NoSave);
	frm.ConTel2.focus();
	frm.ConTel2.select();
	return false;
   } else if (frm.ConTel2.value.length == 1) {
        frm.ConTel2.value = "  " + frm.ConTel2.value;
   }

   frm.ConTel1.value = alltrim(frm.ConTel1.value);
   if (! isEmpty(frm.ConTel1.value)) {
      if (frm.ConTel1.value.length != 3) {
	 alert("The first phone field must be 3 digits long or blank" + NoSave);
	 frm.ConTel1.focus();
	 frm.ConTel1.select();
	 return false;
      }  else if (! isPosInteger(frm.ConTel1.value)) {
	 alert("The first phone field must be an integer value");
	 frm.ConTel1.focus();
	 frm.ConTel1.select();
	 return false;
      }
   }
   
   frm.Loc.value = alltrim(frm.Loc.value);
   frm.Sponsor.value = alltrim(frm.Sponsor.value);
   frm.Contact.value = alltrim(frm.Contact.value);
   frm.URL.value = alltrim(frm.URL.value);

   var PhoneNo = frm.ConTel1.value + frm.ConTel2.value + frm.ConTel3.value;
   frm.ConEmail.value = alltrim(frm.ConEmail.value);
   if (! isEmpty(frm.ConEmail.value)) {
      if (frm.ConEmail.value.indexOf('@') == -1) {
	 alert("Valid E-mail addresses contain an '@' symbol" + NoSave);
	 frm.ConEmail.focus();
	 frm.ConEmail.select();
	 return false;
      }
   }

   frm.LongDesc.value = alltrim(Strip_CrLf(frm.LongDesc.value));
   if (frm.LongDesc.value.length > 1024) {
	 alert("The Details field is longer than 1024 bytes.\n" +
	       "It has been truncated to 1024 bytes." + NoSave);
	 frm.LongDesc.value = frm.LongDesc.value.substr(0,1024);
	 frm.LongDesc.focus();
	 frm.LongDesc.select();
	 return false;
   }

   return true;
}

function isEmpty(inputStr) {
   // general purpose function to see if an input value has been
   // entered at all
   if (inputStr == null || inputStr == "") {
      return true;
   }
   return false;
}

function isPosInteger(inputVal) {
   // general purpose function to see if a suspected numeric input
   // is a positive integer
   inputStr = inputVal.toString();
   for (var i = 0; i < inputStr.length; i++) {
      var oneChar = inputStr.charAt(i);
      if (oneChar < "0" || oneChar > "9") {
         return false;
      }
   }
   return true;
}


function isNumber(inputVal) {
   // general purpose function to see if a suspected numeric input
   // is a positive or negative number
   oneDecimal = false;
   inputStr = inputVal.toString();
   for (var i = 0; i < inputStr.length; i++) {
      var oneChar = inputStr.charAt(i);
      if (i == 0 && oneChar == "-") {
         continue;
      }
      if (oneChar == "." && !oneDecimal) {
         oneDecimal = true;
         continue;
      }
      if (oneChar < "0" || oneChar > "9") {
         return false;
      }
   }
   return true;
}


function inIntRange(inputStr, MinVal, MaxVal) {
   // function to determine if value is in the acceptable
   // Integer range for this application
   // Be sure to specify base 10 as the second argument
   num = parseInt(inputStr,10);
   if (num < MinVal || num > MaxVal) {
      return false;
   }
   return true;
}

// returns a boolean: is the given year a leap year?
function is_leap_year(TestYear) {
    // rules of the Gregorian calendar:
    // it's a leap year every four years, except the last year of the century
    // except if the year is divisible by four hundred
    // 2000 _is_ a leap year
    return (TestYear % 400 == 0) ||
           ((TestYear % 4 == 0)  &&
           (TestYear % 100 != 100));
}

// how many days are there in TestMonth in TestYear?
// January is 1, February is 2, etc.
function month_len(TestMonth, TestYear) {
    //                    Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
    var MonthLen = new Object();
//    var MonthLen = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    MonthLen[1] = 31;
    MonthLen[2] = 28;
    MonthLen[3] = 31;
    MonthLen[4] = 30;
    MonthLen[5] = 31;
    MonthLen[6] = 30;
    MonthLen[7] = 31;
    MonthLen[8] = 31;
    MonthLen[9] = 30;
    MonthLen[10] = 31;
    MonthLen[11] = 30;
    MonthLen[12] = 31;

    if (TestMonth.charAt(0) == "0") {
       TestMonth = TestMonth.charAt(1);
    }
    if (is_leap_year(TestYear) && TestMonth == 2) {
        return 29;
    }
    // MonthLen contains the length of of the months in days
    return MonthLen[TestMonth];
}

function Strip_CrLf(Tmp) {
    var CR = unescape("%0D");
    var LF = unescape("%0A");
//    var apostrophe = "'";
    var NewArray = Tmp.split(CR+LF);
    Tmp = NewArray.join(" ");
    NewArray = Tmp.split(CR);
    Tmp = NewArray.join(" ");
    NewArray = Tmp.split(LF);
    Tmp = NewArray.join(" ");
//    NewArray = Tmp.split(apostrophe);
//    Tmp = NewArray.join("&acute;");
    return Tmp;
}



