bostonTime = function() {
   var bostonTimeRegex = /^(\d{0,2})(\:{0,1})(\d{2})\s{0,1}(a|p)(m){0,1}$/;
   var laganTimeRegex = /^\d{1,2}(\:)\d{2}$/;
   var sAm = "am";
   var sPm = "pm";

   function isLaganTime(time) {
      return (time != null && time != "" && laganTimeRegex.test(time));
   }

   function makeFullBostonDate(hours, minutes, ampm) {
      return padOutDate(hours) + ":" + minutes + " " + ampm;
   }

   function convertLaganToBostonTime(time) {
      if (!isLaganTime(time)) {
	 return time;
      }

      var parts = time.split(":");
      var sHours = parts[0];
      var iHours = parseInt(sHours, 10);
      var sMinutes = parts[1];
      var sAmpm = sAm;

      if (iHours == 0) {
	 iHours = 12;
      } else if (iHours > 12) {
	 iHours = iHours - 12;
	 sAmpm = sPm;
      }
      return makeFullBostonDate(String(iHours), sMinutes, sAmpm);
   }

   function convertBostonToLaganTime(time) {
      var match = bostonTimeRegex.exec(time);
      var sHours = match[1];
      var iHours = parseInt(sHours, 10);
      var sMinutes = match[3];
      var sAmpm = match[4];

      if (sAmpm == "a") {
	 if (iHours == 12) {
	    iHours = 0;
	 }
      } else {
	 if (iHours < 12) {
	    iHours = iHours + 12;
	 }
      }
      return padOutDate(String(iHours)) + ":" + sMinutes;
   }

   function validateBostonTime(timeField) {
      var dString = timeField.value.toLowerCase();
      
      //  no point in checking an empty string
      if ((dString == null) || (dString == "")) {
	 return true;
      }
      
      if (bostonTimeRegex.test(dString)) {
	 var match = bostonTimeRegex.exec(dString)
	 var hours = match[1];
	 var sep = match[2];
	 var minutes = match[3];
	 var ampm = (match[4] == "a") ? sAm : sPm;
	 
	 if (hours == 0 || hours > 12) {
	    alert('Hour must be between 1 and 12');
	    timeField.focus();
 	    return false;
	 }
	 
	 if (minutes > 59) {
	    alert('Minutes must be between 0 and 59');
	    timeField.focus();
	    return false;
	 }
	 
	 timeField.value = makeFullBostonDate(hours, minutes, ampm);
      } else {
	 alert('Not a valid time, please make sure the time is in the following format: HH:MM am or pm');
	 timeField.focus();
	 return false;
      }
      return true;
   }

   function intermediateBostonTimeValidation(event) {
      var code = null;
      if (event == null) { event = window.event; }
      if (event.which) { code = event.which; }
      else if (event.keyCode) { code = event.keyCode; }
      if (code == 13) { YAHOO.util.Event.stopEvent(event); }
      return true;
   }

   function isLaganTimeField(field) {
      return field.onblur != null
	 && field.onblur.toString().match("isValidTime") != null;
   }

   function makeBostonTime(field) {
      if (isLaganTimeField(field)) {
	 if (isLaganTime(field.value)) {
	    field.value = convertLaganToBostonTime(field.value);
	 }
	 field.onblur = function() {
	    validateBostonTime(this);
	 };
	 field.onkeypress = intermediateBostonTimeValidation;
	 field.size = 8;
	 field.maxLength = 8;
	 // Add classname so we can find it later
	 addClassName("bostonTime");
      }
   }

   function findAndConvertTimeFieldsToBostonTime() {
      inputs = document.getElementsByTagName("input");
      for (ii = 0; ii < inputs.length; ii++) {
	 makeBostonTime(inputs[ii]);
      }
   }

   function findAndConvertTimeFieldsToLaganTime() {
      var timeFields = getElementsByClassName(".bostonTime");
      for (ii = 0; ii < timeFields.length; ii++) {
	 if (timeFields[ii].value != null && timeFields[ii].value != "") {
	    timeFields[ii].value =
	       convertBostonToLaganTime(timeFields[ii].value);
	 }
      }
      return true;
   }

   // Public functions
   var pub = { };

   pub.activateBostonTime = function() {
      YAHOO.util.Event.addListener(window, "load", function() {
	 findAndConvertTimeFieldsToBostonTime();
	 YAHOO.util.Event.addListener(document.forms[0], "submit", function(event) {
	    if (!findAndConvertTimeFieldsToLaganTime()) {
	       YAHOO.util.Event.stopEvent(event);
	    }
	 }, true);
      }, true);
   }

   return pub;
}();

bostonTime.activateBostonTime();
