// Set of functions to check email addresses, numbers strings,
//   dates and format these things
// Also includes some prototypes to expand javascript String
//   methods with trim(), startsWith(str) and endWith(str)


// Gets current system time and format for use on form.
// Delivers in yyyymmdd.hhmmss format
function getTime() {
  var now = new Date();
  var year = now.getFullYear();
  var month = now.getMonth() + 1;
  var daym = now.getDate();
  var hours = now.getHours();
  var minutes = now.getMinutes();
  var seconds = now.getSeconds();
  var timeValue = "" + year;
  timeValue += ((month < 10) ? "0" : "") + month;
  timeValue += ((daym < 10) ? "0" : "") + daym + ".";
  timeValue += ((hours < 10) ? "0" : "") + hours;
  timeValue += ((minutes < 10) ? "0" : "") + minutes;
  timeValue += ((seconds < 10) ? "0" : "") + seconds;
  return (timeValue);
}


// Gets current system date.
// Delivers in mmm dd, yyyy format
function getDateText() {
  var monthName = [
    "Jan", "Feb", "Mar", "Apr", "May", "Jun", 
    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];

  var now = new Date();
  var year = now.getFullYear();
  var month = now.getMonth();
  var daym = now.getDate();
  return (monthName[month] + " " + daym + ", " + year);
}


function isEmpty(s) {
  if (s == null || s.length == 0 || s.match(/^\s+$/)) return true;
  return false;
}


function isEmail(str) {
  // Test to see if regular expressions supported?
  if (window.RegExp) {
    var r1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/;
    var r2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;
    return (!r1.test(str) && r2.test(str));
  }
  return (str.indexOf(".") > 2) && (str.indexOf("@") > 0);
}


// isNumber - Checks to see if the value passed is a number, that is, not
// containing non-numeric characters.
function isNumber(inputStr) {
  if (isEmpty(inputStr) || isNaN(inputStr)) return false;
  return true;
}


// Returns number formated with given decimal places
function formatNumber(expr, decplaces) {
  if (isNumber(expr)) return (Number(expr.valueOf()).toFixed(decplaces))
  else return ("0");
}


function isDate(dateStr) {
  // Check for valid date on mm/dd/yyyy format
  // Will accept single digit day and month
  // and 2 or 4 digit years
  var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{2}|\d{4})$/;
  var matchArray = dateStr.match(datePat);
  if (matchArray == null) return false;

  var v_month = matchArray[1];
  var v_day = matchArray[3];
  var v_year = matchArray[5];

  // Creating array of months 1 - 12. Also compensating for leap years
  var MonthArr = new Array(12);
  MonthArr["1"] = MonthArr["01"] = 31;
  if (((v_year % 4 == 0) && (v_year % 100 != 0)) || (v_year % 400 == 0))
       MonthArr["2"] = MonthArr["02"] = 29;
  else MonthArr["2"] = MonthArr["02"] = 28;
  MonthArr["3"] = MonthArr["03"] = 31;
  MonthArr["4"] = MonthArr["04"] = 30;
  MonthArr["5"] = MonthArr["05"] = 31;
  MonthArr["6"] = MonthArr["06"] = 30;
  MonthArr["7"] = MonthArr["07"] = 31;
  MonthArr["8"] = MonthArr["08"] = 31;
  MonthArr["9"] = MonthArr["09"] = 30;
  MonthArr["10"] = 31;
  MonthArr["11"] = 30;
  MonthArr["12"] = 31;

  // Check valid values now
  if (v_day < 1 || v_day > MonthArr[v_month] || isNaN(v_day)) {
    return false;
  } else {
    if (MonthArr[v_month] == null) {
      return false;
    } else {
      if (isNaN(v_year) || v_year == "" || (v_year.length != 4 && v_year.length != 2) || v_year == 0) {
        return false;
      }
    }
  }
  return true;
}


function isCombinedDate(day, month, year) {
  // day, month and year are trimed of white space
  day = day.replace(/^\s+|\s+$/g,"");
  month = month.replace(/^\s+|\s+$/g,"");
  year = year.replace(/^\s+|\s+$/g,"");
  // Will check any values given for day month and year
  // and validate as much as possible. Uses defaults
  // for any values given so that validation can take
  // place on the values given
  if (day == "" || day == null) day = "1"; 
  if (month == "" || month == null) month = "1"; 
  if (year == "" || year == null) year = "1999"; 
  return (isDate(month + "/" + day + "/" + year));
}


function formatDate(dateStr) {
  // 20100812 Add test for mm/dd or m/d string and if found then
  // add current year beforw passing to normal test
  var datePat = /^(\d{1,2})(\/|-)(\d{1,2})$/;
  var matchArray = dateStr.match(datePat);
  if (matchArray != null)
    dateStr = dateStr + "/" +(new Date()).getFullYear();

  // Will take mm/dd/yyyy or m/d/yy date str and format to
  // mm/dd/yyyy date string with zero filled day and month.
  // For 2 digit year, xx between 00 and current year becomes
  // 20xx and all other become 19xx
  // Will accept a single digit day or month
  datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{2}|\d{4})$/;
  matchArray = dateStr.match(datePat);
  if (matchArray == null) return ("");
  
  var v_month = matchArray[1];
  var v_day = matchArray[3];
  var v_year = matchArray[5];
  // alert(" formatDate() " + v_day + ", " + v_month + ", " + v_year);

  if (v_month.length == 1) v_month = "0" + v_month;
  if (v_day.length == 1) v_day = "0" + v_day;
  if (v_year.length == 2) {
    var t_yeary = (new Date()).getFullYear() % 100;
    var v_yeary = Number(v_year);
    if (v_yeary <= t_yeary) v_year = "20" + v_year;
    else v_year = "19" + v_year;
  }
  return (v_month + "/" + v_day + "/" + v_year);
}


function isTime(timeStr) {
  // Checks if time is in HH:MM AM/PM format.
  // The AM/PM are optional and time can be
  // entered in military time ie 23:45
  var timePat = /^(\d{1,2}):(\d{2})(\s?(AM|am|PM|pm|A|a|P|p))?$/;
  var matchArray = timeStr.match(timePat);
  if (matchArray == null) return false;

  var hour = matchArray[1];
  var minute = matchArray[2];
  var ampm = "";
  if (matchArray[4]) ampm = matchArray[4];

  //  Hour must be between 1 and 12. (or 0 and 23 for military time)
  if (hour < 0  || hour > 23) return false;
  // You can't specify AM or PM for military time.
  if (hour > 12 && ampm.length > 0) return false;
  // Minute must be between 0 and 59.
  if (minute < 0 || minute > 59) return false;

  return true;
}


function formatTime(timeStr) {
  // Takes a valid time string in format of HH:MM AM/PM format.
  // with AM/PM optional and formats to xx:xx am/pm.
  // Converts military time to standard time.
  var timePat = /^(\d{1,2}):(\d{2})(\s?(AM|am|PM|pm|A|a|P|p))?$/;
  var matchArray = timeStr.match(timePat);
  if (matchArray == null) return ("");

  var hour = matchArray[1];
  var minute = matchArray[2];
  var ampm = "";
  if (matchArray[4]) ampm = matchArray[4].toUpperCase();

  if (ampm.length == 1) ampm = ampm + "M";
  if (ampm.length == 0) {
    if (hour == 0) {ampm = "AM" ; hour = 12}
    else if (hour <= 11) {ampm = "AM"}
    else if (hour == 12) {ampm = "PM"}
    else if (hour >= 13) {ampm = "PM" ; hour -= 12}
  }
  return (hour + ":" + minute + " " + ampm);
}


function formatPhoneNumber(num) {
// Will format a digit string to look like a phone number
// For less than 10 digits X.X-XXX-XXXX
// For 10 digits XXX-XXX-XXXX
// For more than 10 digits X...X-XXX-XXX-XXXX
// If number is 11 digits in the first is a 1 it is removed.

  if (num != "") {
    // Regular expressions used
    // \D means anything except Digits. \d would mean only digits
    // This uses the regular expresion below to replace
    // all characters from the string that are not digits 
    // with "" (nothing)
    num = num.replace(/\D/g,"");

    if ((num.length == 11) && (num.charAt(0) == '1')) {
      num = num.replace(/1/,"");
    } 
    nl = num.length;
    if (nl < 5) return(num);
    if (nl < 8) return(num.substring(0,nl-4) + ' ' + num.substring(nl-4,nl));
    if (nl < 10) return(num.substring(0,nl-7) + ' ' + num.substring(nl-7,nl-4)+ ' ' + num.substring(nl-4,nl));
    if (nl == 10) return(num.substring(0,3) + ' ' + num.substring(3,6) + ' ' + num.substring(6,10))
    if (nl > 10) return(num.substring(0,nl-9) + ' ' + num.substring(nl-9,nl-7) + ' ' + num.substring(nl-7,nl-4)+ ' ' + num.substring(nl-4,nl));
  }
  return("");
}


function formatDateTime(datetimeStr) {
  // Takes a valid time string in format of HH:MM AM/PM format.
  // with AM/PM optional and formats to xx:xx am/pm.
  // Converts military time to standard time.
  var datetimePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{2}|\d{4})(\s?)(\d{1,2}):(\d{2})(\s?(AM|am|PM|pm|A|a|P|p))?$/;
  var matchArray = datetimeStr.match(datetimePat);
  if (matchArray == null) return ("");

  var month = matchArray[1];
  var day = matchArray[3];
  var year = matchArray[5];
  var hour = matchArray[7];
  var minute = matchArray[8];
  var ampm = "";
  if (month.length == 1) month = "0" + month;
  if (day.length == 1) day = "0" + day;
  if (year.length == 2) {
    var t_yeary = (new Date()).getFullYear() % 100;
    var v_yeary = Number(year);
    if (yeary <= t_yeary) year = "20" + year;
    else year = "19" + year;
  }
  if (matchArray[10]) ampm = matchArray[10].toUpperCase();
  if (ampm.length == 1) ampm = ampm + "M";
  if (ampm.length == 0) {
    if (hour == 0) {ampm = "AM" ; hour = 12}
    else if (hour <= 11) {ampm = "AM"}
    else if (hour == 12) {ampm = "PM"}
    else if (hour >= 13) {ampm = "PM" ; hour -= 12}
  }
  if (hour.length == 1) hour = "0" + hour;

  return (month + "/" + day + "/" + year + " " + hour + ":" + minute + " " + ampm);
}


// Enhanced Javascript String methods
String.prototype.trim = function() {
  return (this.replace(/^[\s\xA0]+/, "").replace(/[\s\xA0]+$/, ""));
}

String.prototype.startsWith = function(str) {
  return (this.match("^" + str) == str);
}

String.prototype.endsWith = function(str) {
  return (this.match(str + "$") == str);
}

