/* Various utilities */

function GetLabelForElement(elem) {
   form = elem.form;
   labels = form.getElementsByTagName('label');
   for (i = 0; i < labels.length; ++i) {
      if (labels.item(i).htmlFor == elem.id) {
         return labels.item(i);
      }
   }
   return false;
}

function GetLabelForContainedElement(elem) {
   return elem.parentNode;
}

/* Gets an element by class name */
function GetElementsByClassName(className, rootNode, tagName) {
   var elemList = new Array();

   if (document.getElementsByTagName) {
      if (!tagName) {
         var tagName = '*';
      }

      if (!rootNode) {
         var rootNode = document;
      }

      var elems = rootNode.getElementsByTagName(tagName);
      if (elems) {
         for (var i = 0; i < elems.length; ++i) {
            if (elems.item(i).className == className) {
               elemList.push(elems.item(i));
            }
         }
      }
   }
   return elemList;
}

/* Removes leading and trailing whitespace from a string */
function trim(str) {
   return str.replace(/^\s+|\s+$/g, '')
}

function IsLeapYear(year) {
   if (year % 4 == 0) {
      if (year % 100 == 0) {
         if (year % 400 == 0) {
            return true;
         } else {
            return false;
         }
      } else {
         return true;
      }
   } else {
      return false;
   }
}

/* Validates a date */
function CheckDate(year, month, day) {
   var monthLengths = [31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
   if (IsLeapYear(year)) {
      monthLengths[1] = 29;
   } else {
      monthLengths[1] = 28;
   }
   
   if (year >= 1900 && year <= 2100 &&
      month >= 1 && month <= 12 &&
      day >= 1 && day <= monthLengths[month - 1]) {
      return true;
   }
   return false;
}

/* Validates an email address */
function ValidateEmail(email) {
   var check = /^\b[a-zA-Z0-9._%-]+@(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,6}\b$/;
   email = trim(email);
   return check.test(email);
}

/* Validates a phone number */
function ValidatePhoneNumber(phoneNumber) {
   var check = /^\s*(?:\+?1)?\s*[-.]?\s*(\(\d{3}\)|\d{3})\s*[-.]?\s*(\d{3})\s*[-.]?\s*(\d{4})\s*$/;
   phoneNumber = trim(phoneNumber);
   return check.test(phoneNumber);
}

/* Validates a password */
function ValidatePassword(password) {
   var check = /^\S{6,}$/;
   return check.test(password);
}

/* Adds an event delegate */
function AddToHandler(obj, oldHandler, newFunction) {
   if (obj[oldHandler]) {
      var oldFunc = obj[oldHandler];
      obj[oldHandler] = function () {
         oldFunc.call(this);
         newFunction();
      };
   } else {
      obj[oldHandler] = newFunction;
   }
}
