/**
* ecw_datetime.js
*
* This file contains javascript functions used by mPower-suite
*
* 'Revision: $'
*
* $Header: /JavaScript/dateValid.js 9     31/01/06 10:38 Ts $
*
* $History: dateValid.js $
 * 
 * *****************  Version 9  *****************
 * User: Ts           Date: 31/01/06   Time: 10:38
 * Updated in $/JavaScript
 * 2030170
 * 
 * *****************  Version 8  *****************
 * User: Aa           Date: 23/11/05   Time: 10:42
 * Updated in $/JavaScript
 * 2024533
 * 
 * *****************  Version 7  *****************
 * User: Aa           Date: 24/10/05   Time: 15:05
 * Updated in $/JavaScript
 * 2025772
 * 
 * *****************  Version 6  *****************
 * User: Gc           Date: 4/08/05    Time: 16:39
 * Updated in $/JavaScript
 * 2023039
 * 
 * *****************  Version 5  *****************
 * User: Gc           Date: 13/04/05   Time: 17:24
 * Updated in $/JavaScript
 * 2019665
 * 
 * *****************  Version 4  *****************
 * User: Gc           Date: 7/01/05    Time: 9:35
 * Updated in $/JavaScript
 * 
 * *****************  Version 3  *****************
 * User: Sf           Date: 18/10/04   Time: 11:37
 * Updated in $/JavaScript
 * 
 * *****************  Version 2  *****************
 * User: Gc           Date: 2/08/04    Time: 15:21
 * Updated in $/JavaScript
 * 
 * *****************  Version 1  *****************
 * User: Gc           Date: 2/08/04    Time: 14:42
 * Created in $/JavaScript
 * 
 * *****************  Version 7  *****************
 * User: Gc           Date: 8/04/04    Time: 17:16
 * Updated in $/Master/Common/JavaScript
 * 2003218
 * 
 * *****************  Version 6  *****************
 * User: Gc           Date: 8/04/04    Time: 16:02
 * Updated in $/Master/Common/JavaScript
 * 2003218
*
*
* Functions on this file are concerned with date-time handling
*
* This file is deliverable to clients. 
*
*  Amendment History
*
*  Who  When        Why
*  GC   13-06-02    1007344 : Added check for timezones in isDate allowing month to be entered before day.
*  MM   18-09-02    1006072 : IsDate - ensure displays 02 for day if 2 is typed in
*  GC   08-04-04    2003218 : Modified isDate to allow datetimes
*  GC   13-04-05    2019665 : Modified isDate to allow error messages to be suppressed
*  GC   04-08-05    2023039 : Added dateToStr
*  AA   24-10-05    2025772 : Various issues with the calendar screen
*  AA   23-11-05    2024533 : Transfered strToDate function into here.
*  TS   31-01-06    2030170 : Bugfix isDate() function: pass correct string to checkTime()
*###################################################
*/

// extract front part of string prior to searchString
function getFront(mainStr,searchStr){
  foundOffset = mainStr.indexOf(searchStr)
  if (foundOffset == -1) {
    return null
  }
  return mainStr.substring(0,foundOffset)
}

// extract back end of string after searchString
function getEnd(mainStr,searchStr) {
  foundOffset = mainStr.indexOf(searchStr)
  if (foundOffset == -1) {
    return null
  }
  return mainStr.substring(foundOffset+searchStr.length,mainStr.length)
}

// insert insertString immediately before searchString
function insertString(mainStr,searchStr,insertStr) {
  var front = getFront(mainStr,searchStr)
  var end = getEnd(mainStr,searchStr)
  if (front != null && end != null) {
    return front + insertStr + searchStr + end
  }
  return null
}

// remove deleteString
function deleteString(mainStr,deleteStr) {
  return replaceString(mainStr,deleteStr,"")
}

// replace searchString with replaceString
function replaceString(mainStr,searchStr,replaceStr) {
  var front = getFront(mainStr,searchStr)
  var end = getEnd(mainStr,searchStr)
  if (front != null && end != null) {
    return front + replaceStr + end
  }
  return null
}

function getMonthNum(sMonth){
  var months = new Array(12)
  months[getTerm("{JAN}").toLowerCase()] = 1; months[getTerm("{FEB}").toLowerCase()] = 2; 
  months[getTerm("{MAR}").toLowerCase()] = 3; months[getTerm("{APR}").toLowerCase()] = 4; 
  months[getTerm("{MAY}").toLowerCase()] = 5; months[getTerm("{JUN}").toLowerCase()] = 6;
  months[getTerm("{JUL}").toLowerCase()] = 7; months[getTerm("{AUG}").toLowerCase()] = 8; 
  months[getTerm("{SEP}").toLowerCase()] = 9; months[getTerm("{OCT}").toLowerCase()] = 10; 
  months[getTerm("{NOV}").toLowerCase()] = 11; months[getTerm("{DEC}").toLowerCase()] = 12;

  return months[sMonth.toLowerCase()];

}

// date field validation (called by other validation functions that specify minYear/maxYear)
function isDate(gField, validateTime, suppressErrors) {
  var dd, mm;
  var inputStr = gField.value;
  var timeStr = "";
  if (validateTime){
    var timePos = inputStr.lastIndexOf(" ");
    if (timePos > 0){
      timeStr = inputStr.substr(timePos+1);
      inputStr = inputStr.substring(0, timePos);
    }
  }

  if (suppressErrors){
    alertErrors = false;
  }else{
    alertErrors = true;
  }
  
  var dispMonths = new Array("", getTerm("{JAN}"),getTerm("{FEB}"),getTerm("{MAR}"),getTerm("{APR}"),
                                 getTerm("{MAY}"),getTerm("{JUN}"),getTerm("{JUL}"),getTerm("{AUG}"),
                                 getTerm("{SEP}"),getTerm("{OCT}"),getTerm("{NOV}"),getTerm("{DEC}"));

  var DDMMYYYY = 1;
  var MMDDYYYY = 2;
  var timezones = new Array(41);
  timezones["UTC-1200"] = MMDDYYYY;
  timezones["UTC-1100"] = MMDDYYYY;
  timezones["UTC-1000"] = MMDDYYYY;
  timezones["UTC-0900"] = MMDDYYYY;
  timezones["UTC-0800"] = MMDDYYYY;
  timezones["PDT"]      = MMDDYYYY;
  timezones["PST"]      = MMDDYYYY;
  timezones["MDT"]      = MMDDYYYY;
  timezones["MST"]      = MMDDYYYY;
  timezones["CDT"]      = MMDDYYYY;
  timezones["CST"]      = MMDDYYYY;
  timezones["EDT"]      = MMDDYYYY;
  timezones["EST"]      = MMDDYYYY;
  timezones["UTC-0400"] = MMDDYYYY;
  timezones["UTC-0300"] = MMDDYYYY;
  timezones["UTC-0330"] = MMDDYYYY;
  timezones["UTC-0200"] = DDMMYYYY;
  timezones["UTC-0230"] = MMDDYYYY;
  timezones["UTC-0100"] = DDMMYYYY;
  timezones["UTC"]      = DDMMYYYY;
  timezones["UTC+0100"] = DDMMYYYY;
  timezones["UTC+0200"] = DDMMYYYY;
  timezones["UTC+0300"] = DDMMYYYY;
  timezones["UTC+0400"] = DDMMYYYY;
  timezones["UTC+0430"] = DDMMYYYY;
  timezones["UTC+0500"] = DDMMYYYY;
  timezones["UTC+0530"] = DDMMYYYY;
  timezones["UTC+0545"] = DDMMYYYY;
  timezones["UTC+0600"] = DDMMYYYY;
  timezones["UTC+0630"] = DDMMYYYY;
  timezones["UTC+0645"] = DDMMYYYY;
  timezones["UTC+0700"] = DDMMYYYY;
  timezones["UTC+0730"] = DDMMYYYY;
  timezones["UTC+0800"] = DDMMYYYY;
  timezones["UTC+0900"] = DDMMYYYY;
  timezones["UTC+0930"] = DDMMYYYY;
  timezones["UTC+1000"] = DDMMYYYY;
  timezones["UTC+1030"] = DDMMYYYY;
  timezones["UTC+1200"] = DDMMYYYY;
  timezones["UTC+1300"] = DDMMYYYY;
  timezones["UTC+1400"] = DDMMYYYY;
  

  var timezoneDate = new Date(Date.UTC(2002,2,12,12,0,0));
  var timezone = timezoneDate.toString();
  var timezoneEnd = timezone.indexOf(" ", 20);
  timezone = timezone.substring(20, timezoneEnd);
  var dateFormat = timezones[timezone];
  
  if (isNaN(dateFormat)){
    dateFormat = DDMMYYYY;
  }
  
  if(inputStr == "" || inputStr == " ") {
    return true;
  }
  
  // Check for "today", and replace with today's date
  if (inputStr.substring(0,3) == "tod") {
    var today = new Date() ;
    gField.focus() ;
    gField.select() ;
    gField.value = (today.getDate()<10?"0":"") + today.getDate() + "-" + dispMonths[today.getMonth()+1] + "-" + today.getYear() ;
    if (validateTime){
      var todayHours = today.getHours();
      var todayMins  = today.getMinutes();
      
      gField.value += " " + (todayHours<10?"0":"") + todayHours + ":" + (todayMins<10?"0":"") + todayMins;
    }
    return true ;
  }
  
  // convert space delimiters to slashes
  while (inputStr.indexOf(" ") != -1) {
    inputStr = replaceString(inputStr," ","/")
  }
  // convert hyphen delimiters to slashes
  while (inputStr.indexOf("-") != -1) {
    inputStr = replaceString(inputStr,"-","/")
  }
  // convert period delimiters to slashes
  while (inputStr.indexOf(".") != -1) {
    inputStr = replaceString(inputStr,".","/")
  }
  var delim1 = inputStr.indexOf("/")
  var delim2 = inputStr.lastIndexOf("/")
  if (delim1 != -1 && delim1 == delim2) {
    if (alertErrors){
      // there is only one delimiter in the string
      alertDialog("[JS-008$"+((dateFormat == DDMMYYYY)?"ddmm":"mmdd")+"@"+((dateFormat == DDMMYYYY)?"dd-mm":"mm-dd")+"@"+gField.value+"]")
      gField.focus()
      gField.select()
      gField.value = "";
    }
    return false
  }
  if (delim1 != -1) {
    // there are delimiters; extract component values
    if (dateFormat == MMDDYYYY){
      mm = parseInt(inputStr.substring(0,delim1),10)
      dd = parseInt(inputStr.substring(delim1 + 1,delim2), 10)
      if (isNaN(dd)){
        dd = parseInt(inputStr.substring(0,delim1),10)
        mm = inputStr.substring(delim1 + 1,delim2)
      }
    }else{
      dd = parseInt(inputStr.substring(0,delim1),10)
      mm = inputStr.substring(delim1 + 1,delim2)
    }
    var yyyy = parseInt(inputStr.substring(delim2 + 1, inputStr.length),10)
  } else {
    // there are no delimiters; extract component values
    if (dateFormat == MMDDYYYY){
      mm = parseInt(inputStr.substring(0,2),10)
      dd = parseInt(inputStr.substring(2,4),10)
    }else{
      dd = parseInt(inputStr.substring(0,2),10)
      mm = parseInt(inputStr.substring(2,4),10)
    }
    var yyyy = parseInt(inputStr.substring(4,inputStr.length),10)
  }
  
  if (isNaN(dd) || isNaN(yyyy)) {
    if (alertErrors){
      // there is a non-numeric character in one of the component values
      alertDialog("[JS-008$"+((dateFormat == DDMMYYYY)?"ddmm":"mmdd")+"@"+((dateFormat == DDMMYYYY)?"dd-mm":"mm-dd")+"@"+gField.value+"]")
      gField.focus()
      gField.select()
      gField.value = "";
    }
    return false
  }
  if( isNaN(mm) ) {
    var mon = new String(mm);
    mm = getMonthNum(mon);
    if (!mm) {
      if (alertErrors){
        alertDialog("[JS-008$"+((dateFormat == DDMMYYYY)?"ddmm":"mmdd")+"@"+((dateFormat == DDMMYYYY)?"dd-mm":"mm-dd")+"@"+gField.value+"]")
        gField.focus()
        gField.select()
        gField.value = "";
      }
      return false;
    }
  }

  if (mm < 1 || mm > 12) {
    if (alertErrors){
      // month value is not 1 thru 12
      alertDialog("[JS-009]")
      gField.focus()
      gField.select()
      gField.value = "";
    }
    return false
  }
  if (dd < 1 || dd > 31) {
    if (alertErrors){
      // date value is not 1 thru 31
      alertDialog("[JS-010]")
      gField.focus()
      gField.select()
      gField.value = "";
    }
    return false
  }

  // validate year, allowing for checks between year ranges
  // passed as parameters from other validation functions
  if (yyyy < 100) {
    // entered value is two digits, which we allow for 1930-2029
    if (yyyy >= 30) {
      yyyy += 1900
    } else {
      yyyy += 2000
    }
  }

  var today = new Date()

  if (!checkMonthLength(mm,dd, alertErrors)) {
    if (alertErrors){
      gField.focus()
      gField.select()
      gField.value = "";
    }
    return false
  }
  if (mm == 2) {
    if (!checkLeapMonth(mm,dd,yyyy, alertErrors)) {
      if (alertErrors){
        gField.focus()
        gField.select()
        gField.value = "";
      }
      return false
    }
  }
  
  if (validateTime){
    if (timeStr == ""){
      timeStr = ' 00:00';
    }else{
            
      timeStr = checkTime(timeStr);
      if (timeStr == ""){
        if(alertErrors){
          alertDialog("[JS-011]");
          gField.focus()
          gField.select()
          gField.value = "";
        }
        return false;
      }
    }
  }
  
  
  // put the Oracle-friendly format back into the field
  var iMon = parseInt(""+mm,10);

  if (dd<10) {
    gField.value = "0" + dd + "-" + dispMonths[iMon] + "-" + yyyy + timeStr;
  } else {
    gField.value = dd + "-" + dispMonths[iMon] + "-" + yyyy + timeStr;
  }
  return true
}

// check the entered month for too high a value
function checkMonthLength(mm,dd,alertErrors) {
  var months = new Array("",getTerm("{JANUARY}"),getTerm("{FEBRUARY}"),getTerm("{MARCH}"),getTerm("{APRIL}"),
                            getTerm("{MAY}"),getTerm("{JUNE}"),getTerm("{JULY}"),getTerm("{AUGUST}"),
                            getTerm("{SEPTEMBER}"),getTerm("{OCTOBER}"),getTerm("{NOVEMBER}"),getTerm("{DECEMBER}"))
  if ((mm == 4 || mm == 6 || mm == 9 || mm == 11) && dd > 30) {
    if (alertErrors){
      alertDialog("[JS-012$"+months[mm] + "@30]")
    }
    return false
  } else if (dd > 31) {
    if (alertErrors){
      alertDialog("[JS-012$"+months[mm] + "@31]")
    }
    return false
  }
  return true
}

// check the entered February date for too high a value
function checkLeapMonth(mm,dd,yyyy,alertErrors) {
  if (yyyy % 4 > 0 && dd > 28) {
    if (alertErrors){
      alertDialog("[JS-013$"+yyyy + "@28]")
    }
    return false
  } else if (dd > 29) {
    if (alertErrors){
      alertDialog("[JS-013$"+yyyy + "@29]")
    }
    return false
  }
  return true
}

function getTheYear() {
  var thisYear = (new Date()).getYear()
  thisYear = (thisYear < 100)? thisYear + 1900: thisYear
  return thisYear
}

function checkDate(Field) {
  var thisYear = getTheYear();
  if (!isDate(Field)) {
    alert("[JS-014$"+Field.value+"]");
  }
}

function dateToStr(p_date, p_exclude_time) {
  var dispMonths = new Array("", getTerm("{JAN}"),getTerm("{FEB}"),getTerm("{MAR}"),getTerm("{APR}"),
                                 getTerm("{MAY}"),getTerm("{JUN}"),getTerm("{JUL}"),getTerm("{AUG}"),
                                 getTerm("{SEP}"),getTerm("{OCT}"),getTerm("{NOV}"),getTerm("{DEC}"));

  var strRet, iMins;
  var d = new Date(p_date); 
  iMins = d.getMinutes(); 
  if (iMins < 10) { sMins = "0"+iMins; }
  else { sMins = ""+iMins; }
  strRet = d.getDate() + "-" + dispMonths[(d.getMonth() + 1)] + "-" + d.getFullYear() + (p_exclude_time?"":" " + d.getHours() + ":" + sMins);
  return strRet;
}

function strToDate(p_datestr) {
  var months = new Array("", getTerm("{JANUARY}"),getTerm("{FEBRUARY}"),getTerm("{MARCH}"),getTerm("{APRIL}"),
                         getTerm("{MAY}"),getTerm("{JUNE}"),getTerm("{JULY}"),getTerm("{AUGUST}"),
                         getTerm("{SEPTEMBER}"),getTerm("{OCTOBER}"),getTerm("{NOVEMBER}"),getTerm("{DECEMBER}"))

  var dispMonths = new Array("", getTerm("{JAN}"),getTerm("{FEB}"),getTerm("{MAR}"),getTerm("{APR}"),
                             getTerm("{MAY}"),getTerm("{JUN}"),getTerm("{JUL}"),getTerm("{AUG}"),
                             getTerm("{SEP}"),getTerm("{OCT}"),getTerm("{NOV}"),getTerm("{DEC}"));


  var date_part = new Array();  
  var sDate = "";  
  var iMonth = 0;  
  var d1 = new Date();  
  var d2 = new Date();  
  if (p_datestr == null || p_datestr.length == 0){
    return d1;
  }else{
    date_part = p_datestr.split("-");  
    for (var ix=1; ix<=12; ix++) { 
      if (dispMonths[ix].toLowerCase() == date_part[1].toLowerCase()) { 
        iMonth = ix; 
      } 
    }
        
    sDate = months[iMonth]+date_part[0]+", "+date_part[2];
    var our_date = new Date(sDate);  
    return our_date; 
  }
} 
