/********************************************************************************
* class:	Khronos Calendar Class
* author:	Christopher Sheldon [MicroAge Solutions e-Business Developer]
* notes:	Do not remove, reproduce or use this code without express written permission.
*			Copyright © 2004 MicroAge Solutions. 
*			www.microagesolutions.com
*****/
function CreateKhronos() {
   this.version = '2.0.090804';
   this.views = new Array();
   this.createDatePicker = function () {};
   this.createMonthView = function (sName, sData, sDivider, iTop, iLeft, sPrint, sClose, sHome, sPrevious, sNext, sDetailsPrint, sDetailsClose) {
      asViews[asViews.length] = sName;
      this.views[sName] = new View('month', sData, sDivider, iTop, iLeft, sPrint, sClose, sHome, sPrevious, sNext, sDetailsPrint, sDetailsClose);
   };
   this.createWeekView = function (sName, sData, sDivider, iTop, iLeft, sPrint, sClose) {
      asViews[asViews.length] = sName;
      this.views[sName] = new View('week', sData, sDivider, iTop, iLeft, sPrint, sClose);
   };
   this.createDayView = function () {};
   this.createMinimizedView = function (sName, sData, sDivider, iTop, iLeft, sPrint, sClose, sHome, sPrevious, sNext, sDetailsPrint, sDetailsClose, sMinimized) {
      asViews[asViews.length] = sName;
      this.views[sName] = new View('minimized', sData, sDivider, iTop, iLeft, sPrint, sClose, sHome, sPrevious, sNext, sDetailsPrint, sDetailsClose, sMinimized);
   };
   function fPrintData() {
      this.year = 0;
      this.month = 0;
      this.name = '';
      this.index = 0;
   }
   this.printData = new fPrintData();
   this.printPage = '';
   this.closeView = fCloseView;
   this.createView = fCreateView;
   this.printView = fPrintView;
   this.refreshView = fRefreshView;
   this.load = fLoad;
   var aiDaysPerMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
   var abEmbedded = new Array();
   var asViews = new Array();
   var dToday = new Date();
   var iCurrentDay = dToday.getDate();
   var iCurrentMonth = dToday.getMonth();
   var iCurrentYear = dToday.getFullYear();
   function View(sType, sData, sDivider, iTop, iLeft, sPrint, sClose, sHome, sPrevious, sNext, sDetailsPrint, sDetailsClose, sMinimized) {
      this.type = sType;
      this.data = sData;
      this.divider = sDivider;
      this.top = iTop;
      this.left = iLeft;
      this.days = new Array('S', 'M', 'T', 'W', 'R', 'F', 'S');
      this.months = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
      this.currentStyle = 'font-weight: bold; text-decoration: underline;';
      if (sType == 'week') {
         this.detailPrint = sPrint;
      } else {
         this.detailPrint = sDetailsPrint;
      }
      this.holiday = fHoliday;
      this.print = sPrint;
      this.close = sClose;
      this.dataIndex = 0;
      this.home = sHome;
      this.previous = sPrevious;
      this.next = sNext;
      this.day = iCurrentDay;
      this.month = iCurrentMonth;
      this.year = iCurrentYear;
      this.detailClose = sDetailsClose;
      if (sType == 'minimized') {
         this.minimized = sMinimized ? sMinimized : '^';
      }
   }
   function fHoliday(iYear, iMonth, iDay) {
      var sEvent = '';
      var a = iYear % 19;
      var b = Math.floor(iYear / 100);
      var c = (b - Math.floor(b / 4) - Math.floor((8 * b + 13) / 25) + 19 * a + 15) % 30;
      var d = (c - Math.floor(c / 28) * (1 - Math.floor(c / 28) * Math.floor(29 / (c + 1) * Math.floor((21 - a) / 11))));
      var e = (iYear + Math.floor(iYear / 4) + d + 2 - b + Math.floor(b / 4)) % 7;
      var f = d - e + 28;
      var iEasterDay = f;
      var iEasterMonth = 3;
      if (f > 31) {
         iEasterDay = f - 31;
      } else {
         iEasterMonth = 2;
      }
      if (iMonth == 0 && iDay == 1) {
         sEvent = 'New Year\'s Day';
      }
      if (iMonth == 1 && iDay == 14) {
         sEvent = 'St. Valentine\'s Day';
      }
      if (iMonth == 4) {
         var iThisDate = new Date(iYear, 4, 25);
         var iWeekday = iThisDate.getDay();
         var iThisDay = 25;
         switch ( iWeekday )
                {
                // Monday preceeding May 25
                case 0:
                    iThisDay += -6;
                    break;
                case 1:/* Monday */
                    iThisDay += -7;
                    break;
                case 2:/* Tuesday */
                    iThisDay += -1;
                    break;
                case 3:/* Wednesday */
                    iThisDay += -2;
                    break;
                case 4:/* Thursday */
                    iThisDay += -3;
                    break;
                case 5:/* Friday */
                    iThisDay += -4;
                    break;
                case 6:/* Saturday */
                    iThisDay += -5;
                    break;
                }
         if (iDay == iThisDay) {
            sEvent = 'Victoria Day';
         }
      }
      if (iMonth == iEasterMonth && iDay == iEasterDay - 2) {
         sEvent = 'Good Friday';
      }
      if (iMonth == iEasterMonth && iDay == iEasterDay) {
         sEvent = 'Easter Sunday';
      }
      if (iMonth == 6 && iDay == 1) {
         sEvent = 'Canada Day';
      }
      if (iMonth == 7) {
         var iThisDate = new Date(iYear, 7, 1);
         var iWeekday = iThisDate.getDay();
         var iThisDay = (iWeekday == 1 ? 1 : (iWeekday > 1 ? 9 - iWeekday : 2));
         if (iDay == iThisDay) {
            sEvent = 'Civic Holiday';
         }
      }
      if (iMonth == 8) {
         var iThisDate = new Date(iYear, 8, 1);
         var iWeekday = iThisDate.getDay();
         var iThisDay = (iWeekday == 1 ? 1 : (iWeekday > 1 ? 9 - iWeekday : 2));
         if (iDay == iThisDay) {
            sEvent = 'Labour Day';
         }
      }
      if (iMonth == 9) {
         var iThisDate = new Date(iYear, 8, 1);
         var iWeekday = iThisDate.getDay();
         var iThisDay = (iWeekday == 1 ? 8 : (iWeekday > 1 ? 14 - iWeekday : 9));
         if (iDay == iThisDay) {
            sEvent = 'Thanksgiving';
         }
      }
      if (iMonth == 10 && iDay == 11) {
         sEvent = 'Remembrance Day';
      }
      if (iMonth == 11 && iDay == 25) {
         sEvent = 'Christmas Day';
      }
      if (iMonth == 11 && iDay == 26) {
         sEvent = 'Boxing Day';
      }
      return sEvent;
   }
   function fCreateViews() {
      for (var iCounter = 0; iCounter < asViews.length; iCounter++) {
         var elDiv = document.getElementById(asViews[iCounter]);
         if (elDiv) {
            elDiv.style.position = 'relative';
            abEmbedded[asViews[iCounter]] = true;
         } else {
            var elBody = document.body;
            elDiv = document.createElement('div');
            elBody.appendChild(elDiv);
            elDiv.style.position = 'absolute';
            elDiv.style.visibility = 'hidden';
            abEmbedded[asViews[iCounter]] = false;
         }
         switch (khronos.views[asViews[iCounter]].type) {
         case 'month':
            elDiv.id = asViews[iCounter] + '1';
            elDiv.className = asViews[iCounter] + 'Month';
            elDiv.innerHTML = fCreateMonthView(asViews[iCounter], iCurrentMonth, iCurrentYear);
            break;
         case 'week':
            elDiv.id = asViews[iCounter] + '2';
            elDiv.className = asViews[iCounter] + 'Details';
            elDiv.innerHTML = fCreateDetailView(asViews[iCounter], iCurrentDay, iCurrentMonth, iCurrentYear);
            break;
         case 'minimized':
            elDiv.id = asViews[iCounter];
            elDiv.className = asViews[iCounter] + 'Minimized';
            elDiv.innerHTML = fCreateMinimizedView(asViews[iCounter]);
            elDiv.style.cursor = 'pointer';
            elDiv.onclick = fCreateView;
            break;
         default:
            break;
         }
         if (!abEmbedded[asViews[iCounter]]) {
            gsl.positionElement(elDiv, khronos.views[asViews[iCounter]].top, khronos.views[asViews[iCounter]].left);
            elDiv.style.visibility = 'visible';
         }
      }
   }
   function fCreateMinimizedView(sName) {
      var sHtml = khronos.views[sName].minimized;
      return sHtml;
   }
   function fCreateView(sName, iDay, iMonth, iYear, iView) {
      if (iView != 2) {
         sName = this.id;
         var elParent = document.getElementById(sName);
         var elDiv = document.getElementById(sName + '1');
         if (elDiv) {} else {
            var elBody = document.body;
            elDiv = document.createElement('div');
            elBody.appendChild(elDiv);
            elDiv.id = sName + '1';
            elDiv.className = sName + 'Month';
         }
         elDiv.style.visibility = 'hidden';
         var iLeft = (gsl.documentWidth - elParent.offsetLeft < elDiv.offsetWidth + 5 ? elParent.offsetLeft - elDiv.offsetWidth : elParent.offsetLeft);
         gsl.positionElement(elDiv, elParent.offsetTop, iLeft);
         if (elDiv.filters) {
            if (elDiv.filters[0]) {
               elDiv.filters[0].enabled = true;
               elDiv.filters[0].apply();
            }
         }
         elDiv.innerHTML = fCreateMonthView(sName, iCurrentMonth, iCurrentYear);
         elDiv.style.visibility = 'visible';
         if (elDiv.filters) {
            if (elDiv.filters[0]) {
               elDiv.filters[0].play();
            }
         }
      } else {
         var elParent = document.getElementById(sName + '1');
         var elDiv = document.getElementById(sName + '2');
         if (elDiv) {} else {
            var elBody = document.body;
            elDiv = document.createElement('div');
            elBody.appendChild(elDiv);
            elDiv.id = sName + '2';
            elDiv.className = sName + 'Details';
         }
         elDiv.style.visibility = 'hidden';
         var iLeft = (gsl.documentWidth - elParent.offsetLeft - elParent.offsetWidth > elDiv.offsetWidth + 5 ? elParent.offsetLeft + elParent.offsetWidth + 5 : elParent.offsetLeft - elDiv.offsetWidth - 5);
         gsl.positionElement(elDiv, elParent.offsetTop, iLeft, true);
         elDiv.style.visibility = 'visible';
         if (elDiv.filters) {
            if (elDiv.filters[0]) {
               elDiv.filters[0].enabled = true;
               elDiv.filters[0].apply();
            }
         }
         elDiv.innerHTML = fCreateDetailView(sName, iDay, iMonth, iYear);
         if (elDiv.filters) {
            if (elDiv.filters[0]) {
               elDiv.filters[0].play();
            }
         }
      }
   }
   function fCreateMonthView(sName, iMonth, iYear) {
      var iDaysThisMonth = (iYear % 4 == 0 && iMonth == 1 ? 29 : aiDaysPerMonth[iMonth]);
      var dThisMonth = new Date(iYear, iMonth, 1);
      var iFirstDOM = dThisMonth.getDay();
      var iDayCounter = -iFirstDOM;
      var iIndex = khronos.views[sName].dataIndex;
      var sHtml = '<table class="Month" style="width: 100%;" cellpadding="0" cellspacing="0" border="0">';
      sHtml += '<tr><td>';
      sHtml += '<table class="Category" style="width: 100%;" cellpadding="0" cellspacing="0" border="0"><tr>';
      if (khronos.views[sName].data.length > 1) {
         sHtml += '<td><select onchange="khronos.views[\'' + sName + '\'].dataIndex = this.value; khronos.refreshView(\'' + sName + '\', ' + iCurrentMonth + ', ' + iCurrentYear + ');">';
         for (var iCounter = 0; iCounter < khronos.views[sName].data.length; iCounter++) {
            if (khronos.views[sName].dataIndex == iCounter) {
               sHtml += '<option value="' + iCounter + '" selected>' + khronos.views[sName].data[iCounter].name + '</option>';
            } else {
               sHtml += '<option value="' + iCounter + '">' + khronos.views[sName].data[iCounter].name + '</option>';
            }
         }
         sHtml += '</select></td>';
      }
      sHtml += '<td align="right">';
      sHtml += '<table class="Buttons" cellpadding="0" cellspacing="0" border="0"><tr>';
      if (khronos.views[sName].print && khronos.printPage) {
         sHtml += '<td class="Print" style="cursor: pointer;" onclick="khronos.printView(\'' + sName + '\', ' + (iMonth + 1) + ', ' + iYear + ');" align="center">' + khronos.views[sName].print + '</td>';
      }
      if (khronos.views[sName].close && khronos.views[sName].type == 'minimized') {
         sHtml += '<td class="Close" style="cursor: pointer;" onclick="khronos.closeView(\'' + sName + '\', 1);" align="center">' + khronos.views[sName].close + '</td>';
      }
      sHtml += '</tr></table>';
      sHtml += '</td></tr></table>';
      sHtml += '</td></tr>';
      sHtml += '<tr><td>';
      sHtml += '<table class="Title" style="width: 100%; height: 100%;" cellpadding="0" cellspacing="0" border="0"><tr>';
      sHtml += '<td>' + khronos.views[sName].months[iMonth] + ' ' + iYear + '</td><td align="right">';
      sHtml += '<table class="Buttons" style="cursor: pointer;" cellpadding="0" cellspacing="0" border="0">';
      if (khronos.views[sName].home) {
         sHtml += '<td class="Home" style="cursor: pointer;" onclick="khronos.refreshView(\'' + sName + '\', ' + iCurrentMonth + ', ' + iCurrentYear + ');" align="center">' + khronos.views[sName].home + '</td>';
      }
      if (khronos.views[sName].previous) {
         sHtml += '<td class="Previous" style="cursor: pointer;" onclick="khronos.refreshView(\'' + sName + '\', ' + (iMonth - 1) + ', ' + iYear + ');" align="center">' + khronos.views[sName].previous + '</td>';
      }
      if (khronos.views[sName].next) {
         sHtml += '<td class="Next" style="cursor: pointer;" onclick="khronos.refreshView(\'' + sName + '\', ' + (iMonth + 1) + ', ' + iYear + ');" align="center">' + khronos.views[sName].next + '</td>';
      }
      sHtml += '</table>';
      sHtml += '</td></tr></table>';
      sHtml += '</td></tr>';
      sHtml += '<tr><td style="height: 100%;">';
      sHtml += '<table style="width: 100%; height: 100%; cursor: default;" cellpadding="0" cellspacing="' + (khronos.views[sName].divider ? khronos.views[sName].divider : '0') + '" border="0">';
      sHtml += '<tr>';
      for (var iCounter = 0; iCounter < 7; iCounter++) {
         sHtml += '<td class="WeekDay">' + khronos.views[sName].days[iCounter] + '</td>';
      }
      sHtml += '</tr>';
      for (var iCounter = 0; iCounter < 6; iCounter++) {
         sHtml += '<tr>';
         for (var iCounter2 = 0; iCounter2 < 7; iCounter2++) {
            iDayCounter++;
            if (iDayCounter > 0 && iDayCounter <= iDaysThisMonth) {
               if (khronos.views[sName].data[iIndex].data[iYear] && khronos.views[sName].data[iIndex].data[iYear][iMonth] && khronos.views[sName].data[iIndex].data[iYear][iMonth][iDayCounter]) {
                  sHtml += '<td class="EventDay" style="' + (iYear == iCurrentYear && iMonth == iCurrentMonth && iDayCounter == iCurrentDay ? khronos.views[sName].currentStyle : '') + ' cursor: pointer;" onclick="khronos.createView(\'' + sName + '\', ' + iDayCounter + ', ' + iMonth + ', ' + iYear + ', 2);">' + iDayCounter + '</td>';
               } else if (khronos.views[sName].holiday(iYear, iMonth, iDayCounter)) {
                  sHtml += '<td class="Holiday" style="' + (iYear == iCurrentYear && iMonth == iCurrentMonth && iDayCounter == iCurrentDay ? khronos.views[sName].currentStyle : '') + ' cursor: pointer;" onclick="khronos.createView(\'' + sName + '\', ' + iDayCounter + ', ' + iMonth + ', ' + iYear + ', 2);">' + iDayCounter + '</td>';
               } else {
                  sHtml += '<td class="Day" style="' + (iYear == iCurrentYear && iMonth == iCurrentMonth && iDayCounter == iCurrentDay ? khronos.views[sName].currentStyle : ' cursor: default;') + '">' + iDayCounter + '</td>';
               }
            } else {
               sHtml += '<td class="Blank">&nbsp;</td>';
            }
         }
         sHtml += '</tr>';
      }
      sHtml += '</table>';
      sHtml += '</td></tr>';
      sHtml += '</table>';
      return sHtml;
   }
   function fPrintView(sName, iMonth, iYear) {
      this.printData.year = iYear;
      this.printData.month = iMonth;
      this.printData.name = sName;
      this.printData.index = khronos.views[sName].dataIndex;
      var elWindow = gsl.openWindow(this.printPage, 'KhronosPrint', '');
   }
   function fRefreshView(sName, iMonth, iYear) {
      if (iMonth > 11) {
         iMonth = 0;
         iYear++;
      }
      if (iMonth < 0) {
         iMonth = 11;
         iYear--;
      }
      var elDiv = document.getElementById(sName + '1');
      if (elDiv.filters) {
         if (elDiv.filters[0]) {
            elDiv.filters[0].enabled = true;
            elDiv.filters[0].apply();
         }
      }
      elDiv.innerHTML = fCreateMonthView(sName, iMonth, iYear);
      if (elDiv.filters) {
         if (elDiv.filters[0]) {
            elDiv.filters[0].play();
         }
      }
   }
   function fCloseView(sName, iView) {
      gsl.showSelects();
      var elDiv = document.getElementById(sName + iView);
      if (elDiv.filters) {
         if (elDiv.filters[0]) {
            elDiv.filters[0].enabled = true;
            elDiv.filters[0].apply();
         }
      }
      elDiv.style.visibility = 'hidden';
      var iDelay = 0;
      if (elDiv.filters) {
         if (elDiv.filters[0]) {
            elDiv.filters[0].play();
            iDelay = Math.floor(elDiv.filters[0].duration * 1000);
         }
      }
      setTimeout('var elBody = document.body; elBody.removeChild(document.getElementById(\'' + sName + iView + '\'));', iDelay);
   }
   function fCreateDetailView(sName, iDay, iMonth, iYear, sHoliday) {
      var sHtml = '<table class="Detail" style="width: 100%;" cellpadding="0" cellspacing="0" border="0">';
      sHtml += '<tr><td style="width: 100%;">';
      sHtml += '<table class="Title" style="width: 100%;" cellpadding="0" cellspacing="0" border="0"><tr>';
      sHtml += '<td>' + khronos.views[sName].months[iMonth] + ' ' + iDay + ', ' + iYear + '</td><td align="right">';
      sHtml += '<table class="Buttons" cellpadding="0" cellspacing="0" border="0">';
      if (khronos.views[sName].detailPrint && khronos.printPage) {
         sHtml += '<td class="Print" style="cursor: pointer;" onclick="khronos.printView(\'' + sName + '\', ' + (iMonth + 1) + ', ' + iYear + ');" align="center">' + khronos.views[sName].detailPrint + '</td>';
      }
      if (khronos.views[sName].detailClose && khronos.views[sName].type != 'detail') {
         sHtml += '<td class="Close" style="cursor: pointer;" onclick="khronos.closeView(\'' + sName + '\', 2);" align="center">' + khronos.views[sName].detailClose + '</td>';
      }
      sHtml += '</table>';
      sHtml += '</td></tr></table>';
      sHtml += '</td></tr>';
      sHtml += '<tr><td>';
      sHtml += '<div class="List" style="position: relative; overflow: auto;">';
      if (khronos.views[sName].holiday(iYear, iMonth, iDay)) {
         sHtml += '<table class="Holiday" style="width: 100%;" cellpadding="0" cellspacing="0" border="0">';
         sHtml += '<tr><td style="width: 100%;">';
         sHtml += khronos.views[sName].holiday(iYear, iMonth, iDay) + '<br />';
         sHtml += '</td></tr>';
         sHtml += '</table>';
      }
      if (khronos.views[sName].data[khronos.views[sName].dataIndex].data[iYear] && khronos.views[sName].data[khronos.views[sName].dataIndex].data[iYear][iMonth] && khronos.views[sName].data[khronos.views[sName].dataIndex].data[iYear][iMonth][iDay]) {
         var asEvents = khronos.views[sName].data[khronos.views[sName].dataIndex].data[iYear][iMonth][iDay].split('~');
         sHtml += '<table style="width: 100%;" cellpadding="0" cellspacing="0" border="0">';
         for (var iCounter = 0; iCounter < asEvents.length; iCounter++) {
            var asThisEvent = asEvents[iCounter].split('|');
            sHtml += '<tr><td class="Out" style="cursor: pointer;" onclick="location.href = \'' + asThisEvent[3] + '\';"><b>';
            sHtml += asThisEvent[0] + '</b><br />';
            sHtml += asThisEvent[1] + '<br />';
            sHtml += asThisEvent[2] + '<br />';
            sHtml += '</td></tr>';
         }
         sHtml += '</table>';
         sHtml += '</div>';
         sHtml += '</td></tr>';
         sHtml += '</table>';
      }
      return sHtml;
   }
   function fLoad() {
      fCreateViews();
   }
}
var khronos = new CreateKhronos();
function KhronosData() {
   this.name = new Array();
   this.data = new Array();
   this.addData = function (iMonth, iDay, iYear, sData) {
      if (!this.data[iYear]) {
         this.data[iYear] = new Array();
      }
      if (!this.data[iYear][iMonth]) {
         this.data[iYear][iMonth] = new Array();
      }
      this.data[iYear][iMonth][iDay] = (this.data[iYear][iMonth][iDay] ? this.data[iYear][iMonth][iDay] + '~' : '') + sData;
   };
}
