/*  Copyright © 2001, 2002 OGMA Consulting Corp. */

//
// JavaScript Calendar Component
// Author: Robert W. Husted  (robert.husted@iname.com)
// Date:   8/22/1999
// Modified Date: 11/30/1999
// Modified By:   Robert W. Husted

var selectedLanguage;
var toChange;
var setChangedCall;

function setLanguage(p_language) {

  if ((p_language == null) || (p_language == '')) {
    selectedLanguage = document.forms[0].language.value;
  } else {
    selectedLanguage = p_language;
  };

  if ((selectedLanguage != null) && (selectedLanguage != '')) {
    selectedLanguage = selectedLanguage.toUpperCase();
  }

  buildCalParts();
}

// SET THE INITIAL VALUE OF THE GLOBAL DATE FIELD
function setDateField(dateField, change, setChanged) {

  toChange       = change
  setChangedCall = setChanged
  calDateField   = dateField;
  inDate         = dateField.value;

  calDate = new Date(inDate);

  if (isNaN(calDate)) {
    calDate = new Date();
  }

  calDay  = calDate.getDate();
  calDate.setDate(1);

  calDocTop    = buildTopCalFrame();
  calDocBottom = buildBottomCalFrame();
}

// POPUP A WINDOW WITH THE CALENDAR IN IT
function showCalendar(dateField) {

  setDateField(dateField);

  calDocFrameset =
      "<HTML><HEAD><TITLE>JavaScript Calendar</TITLE></HEAD>\n" +
      "<FRAMESET ROWS='70,*' FRAMEBORDER='0'>\n" +
      "  <FRAME NAME='topCalFrame' SRC='javascript:parent.opener.calDocTop' SCROLLING='no'>\n" +
      "  <FRAME NAME='bottomCalFrame' SRC='javascript:parent.opener.calDocBottom' SCROLLING='no'>\n" +
      "</FRAMESET>\n";

  newWin = window.open("javascript:parent.opener.calDocFrameset", "calWin", winPrefs);
  newWin.focus();
}

// CREATE THE TOP CALENDAR FRAME
function buildTopCalFrame() {

  var todayStr

  if (selectedLanguage == "FR") {
    todayStr = "Aujourd'hui"
  } else {
    todayStr = "Today"
  }

  var calDoc =
      "<HTML><HEAD></HEAD><BODY BGCOLOR='white' onload='window.focus()'>\n" +
      "<FORM NAME='calControl' onSubmit='return false;'>\n" +
      "<CENTER>\n" +
      "<TABLE CELLPADDING=0 CELLSPACING=1 BORDER=0>\n" +
      "<TR><TD COLSPAN=7><CENTER>\n" +
      getMonthSelect() +
      "<INPUT NAME='year' VALUE='" + calDate.getFullYear() + "'TYPE=TEXT SIZE=4 MAXLENGTH=4 onChange='parent.opener.setYear()'>" +
      "</CENTER></TD></TR><TR>\n" +
      "<TD COLSPAN=7>\n" +
      "<INPUT TYPE=BUTTON NAME='previousYear' VALUE='<<'   onClick='parent.opener.setPreviousYear()'><INPUT " +
      "TYPE=BUTTON NAME='previousMonth' VALUE=' < ' onClick='parent.opener.setPreviousMonth()'><INPUT " +
      'TYPE=BUTTON NAME="Today" VALUE="' + todayStr + '"       onClick="parent.opener.setToday()"><INPUT ' +
      "TYPE=BUTTON NAME='nextMonth' VALUE=' > '     onClick='parent.opener.setNextMonth()'><INPUT " +
      "TYPE=BUTTON NAME='nextYear' VALUE='>>'       onClick='parent.opener.setNextYear()'>" +
      "</TD></TR></TABLE></CENTER></FORM></BODY></HTML>";
  return calDoc;
}

// CREATE THE BOTTOM CALENDAR FRAME
// (THE MONTHLY CALENDAR)
function buildBottomCalFrame() {

  var calDoc = calendarBegin;

  month   = calDate.getMonth();
  year    = calDate.getFullYear();
  day     = calDay;
  var i   = 0;
  var days = getDaysInMonth();

  if (day > days) {
      day = days;
  }

  var firstOfMonth = new Date (year, month, 1);

  var startingPos  = firstOfMonth.getDay();
  days += startingPos;

  var columnCount = 0;

  for (i = 0; i < startingPos; i++) {
    calDoc += blankCell;
    columnCount++;
  }
  
  var currentDay = 0;
  var dayType    = "weekday";
  // Easter
  var year1=year;
  var  a=year1%19;
  var b=Math.floor(year1/100);
  var     c=year1%100;
  var    d=Math.floor(b/4);
  var     e=b%4;
  var     f=Math.floor((b+8)/25);
  var    g=Math.floor((b-f+1)/3);
  var    h=(19*a+b-d-g+15)%30;
  var   i=Math.floor(c/4);
  var    k=c%4;
  var    l=(32+2*e+2*i-h-k)%7;
  var     m=Math.floor((a+11*h+22*l)/451);
  var    EasterMonth =Math.floor((h+l-7*m+114)/31); 
  var   p=(h+l-7*m+114)%31;
  var EasterDate=p+1;
      // end of Easter
      //  Victoria Day
   var  VictoriaMonth = 4;
   var  VictoriaOriginal = new Date(year, 4, 24);
   var  VictoriaDayOfWeek = VictoriaOriginal.getDay();
   var VictoriaDay; 
   if (VictoriaDayOfWeek ==0){
      VictoriaDay = 18;
   } else  {
	VictoriaDay = 25-VictoriaDayOfWeek;
   }
      // End of Victoria Day
   // Canada Day
   var CanadaMonth = 6;
   var CanadaDay = 1;
   var  CanadaOriginal = new Date(year, 6, 1);
   var  CanadaDayOfWeek = CanadaOriginal.getDay();
   var CanadaDayAdd; 
   if (CanadaDayOfWeek == 0)  {
       CanadaDayAdd = CanadaDay+1; 
   }else if (CanadaDayOfWeek == 6){
        CanadaDayAdd = CanadaDay+2;
     }	 else {
         CanadaDayAdd = CanadaDay;
    }     
     // end of Canada Day
     // Civic Holiday
    var CivicMonth =7;
    var CivicDay =1; 
    var CivicOriginal = new Date(year, 7, 1);
     var CivicDayOfWeek = CivicOriginal.getDay();
     
     if  (CivicDayOfWeek == 0){
          CivicDay =  CivicDay+ 1;
     }  else if (CivicDayOfWeek > 1){
          CivicDay =  CivicDay +8 - CivicDayOfWeek;
     }     
     // end of Civic Holiday
     // LAbour day
    var LabourMonth =8;
    var LabourDay =1; 
    var LabourOriginal = new Date(year, 8, 1);
     var LabourDayOfWeek = LabourOriginal.getDay();
     
     if  (LabourDayOfWeek == 0){
          LabourDay =  LabourDay+ 1;
     }  else if (LabourDayOfWeek > 1){
          LabourDay =  LabourDay +8 - LabourDayOfWeek;
     }     
     // end of Labour Day
      // Thanksgiving day
    var ThanksMonth =9;
    var ThanksDay =1; 
    var ThanksOriginal = new Date(year, 9, 1);
     var ThanksDayOfWeek = ThanksOriginal.getDay();
     
     if  (ThanksDayOfWeek == 0){
          ThanksDay =  ThanksDay+ 8;	  
     } else if (ThanksDayOfWeek == 1){
          ThanksDay = ThanksDay+ 7;
     }
     else if (ThanksDayOfWeek > 1){
          ThanksDay =  ThanksDay +15 - ThanksDayOfWeek;
     }     
     // end of Thanksgiving Day
     // Remeberance Day
   var RememberMonth = 10;
   var RememberDay = 11;
   var  RememberOriginal = new Date(year, 10, 11);
   var  RememberDayOfWeek = RememberOriginal.getDay();
   var RememberDayAdd; 
   if (RememberDayOfWeek == 0)  {
       RememberDayAdd = RememberDay+1; 
   }else if (RememberDayOfWeek == 6){
        RememberDayAdd = RememberDay+2;
     }	 else {
         RememberDayAdd = RememberDay;
    }     
     // end of Remeberance Day
     // Christmas 
   var ChristmasMonth = 11;
   var ChristmasDay = 25;
   var  ChristmasOriginal = new Date(year, 11, 25);
   var  ChristmasDayOfWeek = ChristmasOriginal.getDay();
   var ChristmasDayAdd; 
   if (ChristmasDayOfWeek == 0)  {
       ChristmasDayAdd = ChristmasDay+2; 
   }else if (ChristmasDayOfWeek == 6){
        ChristmasDayAdd = ChristmasDay+2;
     }	 else {
         ChristmasDayAdd = ChristmasDay;
    }
    // End of Christmas    
    // Boxing Day 
   var BoxingMonth = 11;
   var BoxingDay = 26;
   var  BoxingOriginal = new Date(year, 11, 26);
   var  BoxingDayOfWeek = BoxingOriginal.getDay();
   var BoxingDayAdd; 
   if (BoxingDayOfWeek == 0)  {
       BoxingDayAdd = BoxingDay+2; 
   }else if (BoxingDayOfWeek == 6){
        BoxingDayAdd = BoxingDay+2;
     }	 else {
         BoxingDayAdd = BoxingDay;
    }     
     // end of Boxing Day
     // New Year 
   
   var  NewYearOriginal = new Date(year, 0, 1);
   var  NewYearDayOfWeek = NewYearOriginal.getDay();
   var NewYearDayAdd; 
   if (NewYearDayOfWeek == 0)  {
       NewYearDayAdd = 2; 
   }else if (NewYearDayOfWeek == 6){
        NewYearDayAdd = 3;
     }	 else {
         NewYearDayAdd = 1;
    }
    // End of Christmas
  for (i = startingPos; i < days; i++) {

    var paddingChar = "&nbsp;";

    if (i-startingPos+1 < 10) {
      padding = "&nbsp;&nbsp;";
    } else {
      padding = "&nbsp;";
    }

    currentDay = i-startingPos+1;

    if (currentDay == day) {
//      dayType = "focusDay";
      dayType = "weekDay";
    } else {
      dayType = "weekDay";
    }
    // Good Friday
    if ((currentDay == (EasterDate-2))&&(month==(EasterMonth-1)) ){
      dayType = "holiday";   
    } else if ((currentDay == (EasterDate+1))&&(month==(EasterMonth-1)) ){
       dayType = "holiday";
    } else if ((currentDay == NewYearDayAdd)&&(month== 0) ){
        dayType = "holiday";  // New Year
    }   else if ((month == VictoriaMonth)&&(currentDay == VictoriaDay)){
        dayType = "holiday";
    } else if ((month == CanadaMonth)&&(currentDay == CanadaDayAdd)){
        dayType = "holiday";
    } else if ((month == CivicMonth)&&(currentDay == CivicDay)){
        dayType = "holiday";
    } else if ((month == LabourMonth)&&(currentDay == LabourDay)){
        dayType = "holiday";
    } else if ((month == ThanksMonth)&&(currentDay == ThanksDay)){
        dayType = "holiday";
    } else if ((month == RememberMonth)&&(currentDay == RememberDayAdd)){
        dayType = "holiday";
     } else if ((month == ChristmasMonth)&&(currentDay == ChristmasDayAdd)){
        dayType = "holiday";
    } else if ((month == BoxingMonth)&&(currentDay == BoxingDayAdd)){
        dayType = "holiday";
    }
    
    
    calDoc += "<td align=center bgcolor='lightgrey'>" +
              "<a class='" + dayType + "' href='javascript:parent.opener.returnDate(" +
              currentDay + ")'>" + padding + currentDay + paddingChar + "</a></td>";

    columnCount++;

    if (columnCount % 7 == 0) {
        calDoc += "</tr><tr>";
    }
  }

  for (i=days; i<42; i++)  {

    calDoc += blankCell;
    columnCount++;

    if (columnCount % 7 == 0) {
      calDoc += "</tr>";
      if (i<41) {
        calDoc += "<tr>";
      }
    }
  }

  calDoc += calendarEnd;
  
  return calDoc;
}


// WRITE THE MONTHLY CALENDAR TO THE BOTTOM CALENDAR FRAME
function writeCalendar() {

    calDocBottom = buildBottomCalFrame();

    newWin.frames['bottomCalFrame'].document.open();
    newWin.frames['bottomCalFrame'].document.write(calDocBottom);
    newWin.frames['bottomCalFrame'].document.close();
}


// SET THE CALENDAR TO TODAY'S DATE AND DISPLAY THE NEW CALENDAR
function setToday() {

    calDate = new Date();

    var month = calDate.getMonth();
    var year  = calDate.getFullYear();
    calDay    = calDate.getDate();

    newWin.frames['topCalFrame'].document.calControl.month.selectedIndex = month;
    newWin.frames['topCalFrame'].document.calControl.year.value          = year;

    writeCalendar();
}

// SET THE GLOBAL DATE TO THE NEWLY ENTERED YEAR AND REDRAW THE CALENDAR
function setYear() {

  var year  = newWin.frames['topCalFrame'].document.calControl.year.value;

  if (isFourDigitYear(year)) {
      calDate.setFullYear(year);
      writeCalendar();
  } else {
      newWin.frames['topCalFrame'].document.calControl.year.focus();
      newWin.frames['topCalFrame'].document.calControl.year.select();
  }
}

// SET THE GLOBAL DATE TO THE SELECTED MONTH AND REDRAW THE CALENDAR
function setCurrentMonth() {

    var month = newWin.frames['topCalFrame'].document.calControl.month.selectedIndex;

    calDate.setMonth(month);
    writeCalendar();
}

// SET THE GLOBAL DATE TO THE PREVIOUS YEAR AND REDRAW THE CALENDAR
function setPreviousYear() {

  var year  = newWin.frames['topCalFrame'].document.calControl.year.value;

  if (isFourDigitYear(year) && year > 1000) {
    year--;
    calDate.setFullYear(year);
    newWin.frames['topCalFrame'].document.calControl.year.value = year;
    writeCalendar();
  }
}

// SET THE GLOBAL DATE TO THE PREVIOUS MONTH AND REDRAW THE CALENDAR
function setPreviousMonth() {

  var year  = newWin.frames['topCalFrame'].document.calControl.year.value;
  if (isFourDigitYear(year)) {
    var month = newWin.frames['topCalFrame'].document.calControl.month.selectedIndex;

    if (month == 0) {
      month = 11;
      if (year > 1000) {
          year--;
          calDate.setFullYear(year);
          newWin.frames['topCalFrame'].document.calControl.year.value = year;
      }
    } else {
      month--;
    }
    calDate.setMonth(month);
    newWin.frames['topCalFrame'].document.calControl.month.selectedIndex = month;
    writeCalendar();
  }
}

// SET THE GLOBAL DATE TO THE NEXT MONTH AND REDRAW THE CALENDAR
function setNextMonth() {

  var year = newWin.frames['topCalFrame'].document.calControl.year.value;

  if (isFourDigitYear(year)) {
    var month = newWin.frames['topCalFrame'].document.calControl.month.selectedIndex;

    if (month == 11) {
      month = 0;
      year++;
      calDate.setFullYear(year);
      newWin.frames['topCalFrame'].document.calControl.year.value = year;
    } else {
      month++;
    }
    calDate.setMonth(month);
    newWin.frames['topCalFrame'].document.calControl.month.selectedIndex = month;
    writeCalendar();
  }
}

// SET THE GLOBAL DATE TO THE NEXT YEAR AND REDRAW THE CALENDAR
function setNextYear() {

  var year  = newWin.frames['topCalFrame'].document.calControl.year.value;
  if (isFourDigitYear(year)) {
    year++;
    calDate.setFullYear(year);
    newWin.frames['topCalFrame'].document.calControl.year.value = year;
    writeCalendar();
  }
}

// GET NUMBER OF DAYS IN MONTH
function getDaysInMonth()  {

  var days;
  var month = calDate.getMonth()+1;
  var year  = calDate.getFullYear();

  if (month==4 || month==6 || month==9 || month==11) {
    days=30;
  } else if (month==2)  {

    if (isLeapYear(year)) {
      days=29;
    } else {
      days=28;
    }
  } else {
    days=31;
  }

  return (days);
}

// CHECK TO SEE IF YEAR IS A LEAP YEAR
function isLeapYear (Year) {

  if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) {
    return (true);
  } else {
    return (false);
  }
}

// ENSURE THAT THE YEAR IS FOUR DIGITS IN LENGTH
function isFourDigitYear(year) {

  if (year.length != 4) {
    newWin.frames['topCalFrame'].document.calControl.year.value = calDate.getFullYear();
    newWin.frames['topCalFrame'].document.calControl.year.select();
    newWin.frames['topCalFrame'].document.calControl.year.focus();
  } else {
    return true;
  }
}

// BUILD THE MONTH SELECT LIST
function getMonthSelect() {

  if (selectedLanguage == "FR") {
      monthArray = new Array('janvier', 'février', 'mars', 'avril', 'mai', 'juin',
                             'juillet', 'aout', 'septembre', 'octobre', 'novembre', 'décembre');
  } else {
      monthArray = new Array('January', 'February', 'March', 'April', 'May', 'June',
                             'July', 'August', 'September', 'October', 'November', 'December');
  }

  var activeMonth = calDate.getMonth();

  monthSelect = "<SELECT NAME='month' onChange='parent.opener.setCurrentMonth()'>";

  for (i in monthArray) {

    if (i == activeMonth) {
        monthSelect += "<OPTION SELECTED>" + monthArray[i] + "\n";
    } else {
        monthSelect += "<OPTION>" + monthArray[i] + "\n";
    }
  }
  monthSelect += "</SELECT>";

  return monthSelect;
}

// PRE-BUILD PORTIONS OF THE CALENDAR (FOR PERFORMANCE REASONS)
function buildCalParts() {

  weekdays = createWeekdayList();

  blankCell = "<TD align=center bgcolor='lightgrey'>&nbsp;&nbsp;&nbsp;</TD>";

  calendarBegin =
      "<HTML><HEAD>" +

      "<STYLE type='text/css'>" +
      "<!--" +
      "TD.heading { text-decoration: none; color:black; font: bold 12pt arial, helvetica; }" +
      "A.focusDay:link { color: #FFFF00; text-decoration: none; font: 12pt arial, helvetica; }" +
      "A.focusDay:visited { color: #FFFF00; text-decoration: none; font: 12pt arial, helvetica; }" +
      "A.focusDay:hover { color: #FFFF00; text-decoration: none; font: 12pt arial, helvetica; }" +
      "A.weekday:link { color: blue; text-decoration: none; font: 12pt arial, helvetica; }" +
      "A.weekday:visited { color: blue; text-decoration: none; font: 12pt arial, helvetica; }" +
      "A.weekday:hover { color: darkred; text-decoration: none; font: 12pt arial, helvetica; }" +
      "A.holiday:link { color: red; text-decoration: none; font: 12pt arial, helvetica; }" +
      "A.holiday:visited { color: red; text-decoration: none; font: 12pt arial, helvetica; }" +
      "A.holiday:hover { color: darkred; text-decoration: none; font: 12pt arial, helvetica; }" +
      "-->" +
      "</STYLE></HEAD>" +
      "<BODY alink=blue vlink=blue link=blue BGCOLOR='white'" +
      "<CENTER>";

  calendarBegin +=
      "<TABLE CELLPADDING=0 CELLSPACING=1 BORDER=0 ALIGN=CENTER BGCOLOR='black'>" + weekdays + "<TR>";

  calendarEnd = "</TABLE></CENTER></BODY></HTML>";
}

// SET DAYS OF THE WEEK DEPENDING ON LANGUAGE
function createWeekdayList() {

  if (selectedLanguage == "FR") {
    weekdayList  = new Array('dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi');
    weekdayArray = new Array('Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa');
  } else {
    weekdayList  = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
    weekdayArray = new Array('Su','Mo','Tu','We','Th','Fr','Sa');
  }

  var weekdays = "<tr bgcolor='white'>";

  for (i in weekdayArray) {
    weekdays += "<td class='heading' align=center>" + weekdayArray[i] + "</td>";
  }

  weekdays += "</tr>";
  return weekdays;
}


// REPLACE ALL INSTANCES OF find WITH replace
// inString: the string you want to convert
// find:     the value to search for
// replace:  the value to substitute
function jsReplace(inString, find, replace) {

  var outString = "";

  if (!inString) {
    return "";
  }

  if (inString.indexOf(find) != -1) {
    t = inString.split(find);

    return (t.join(replace));
  } else {
    return inString;
  }
}

// ENSURE THAT VALUE IS TWO DIGITS IN LENGTH
function makeTwoDigit(inValue) {

  var numVal = parseInt(inValue, 10);

  if (numVal < 10) {
    return("0" + numVal);
  } else {
    return numVal;
  }
}

// SET FIELD VALUE TO THE DATE SELECTED AND CLOSE THE CALENDAR WINDOW
function returnDate(inDay) {

  calDate.setDate(inDay);

  var day           = calDate.getDate();
  var month         = calDate.getMonth()+1;
  var year          = calDate.getFullYear();
  var monthString   = monthArray[calDate.getMonth()];
  var monthAbbrev   = monthString.substring(0,3);
  var weekday       = weekdayList[calDate.getDay()];
  var weekdayAbbrev = weekday.substring(0,3);

  calDateFormat = "yyyy/MM/DD";
  outDate       = calDateFormat;


  day = makeTwoDigit(day);
  outDate = jsReplace(outDate, "DD", day);  //replace me with string.replace

  month = makeTwoDigit(month);
  outDate = jsReplace(outDate, "MM", month);

  outDate = jsReplace(outDate, "yyyy", year);


  calDateField.value = outDate;

  calDateField.focus();

  newWin.close();


  if (toChange != '') {
    setChanged(toChange)
  }

  if (setChangedCall == 'setChanged1') {
    setChanged1(toChange)
  }
}

/*
function Run_Calendar
This function is intended to be used in conjuntion with the build_a_field pascal procedure.
It is supplied with a field number that will indicate where the field resides.
*/

function Run_Calendar_ie(fieldnum, fieldName, isChanged, setChanged) {

  if (arguments[0] == '') {

    TargetField         = eval('document.forms[0].' + fieldName)
    TargetIsChangedName = isChanged

  } else {

    TargetField         = eval('document.forms[0].field' + fieldnum)
    TargetIsChangedName = 'field_ischanged' + fieldnum
  }

  setDateField(TargetField, TargetIsChangedName, setChanged)
  newWin = window.open('../html/calendar.html', 'cal', 'dependent=yes, width=210, height=230, screenX=200, screenY=300, titlebar=yes')
}
