home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 November / Chip_2003-11_cd1.bin / software / dave / dqsd.exe / calendar.js < prev    next >
Text File  |  2003-01-19  |  13KB  |  394 lines

  1. /**
  2.  * script to display a popup calendar
  3.  * added by Sidney Chong (sidney@gamebox.net) 12/12/2001
  4.  * modified by Sidney Chong (sidney@gamebox.net) 15/01/2002
  5.  *  - added display of events (eg holidays) specified
  6.  *    in a file referenced by the var 'eventsfileurl'
  7.  * modified by Sidney Chong (sidney@gamebox.net) 16/01/2002
  8.  *  - changed event month to run from 1-12 instead of 0-11
  9.  *  - assume event date to be recurring if month or year attribute
  10.  *    is not specified.
  11.  * modified by Monty Scroggins  31/03/2002
  12.  *  - added support for a local events file with referenced by
  13.  *    a the var 'localeventsfileurl'
  14.  * modified by Neel Doshi 31/03/2002
  15.  *  - configured the calendar to use the stylesheet
  16.  *  - fixed the bug where "today" was not being highlighted if today is Sunday
  17.  * modified by Harry-Anton Talvik 03/11/2002
  18.  *  - configured the calender to use week start day
  19.  * modified by Will Dean 2003-1-9
  20.  *  - Speed improvements to very large strcat operation in build
  21.  *  - Caching of inlinestyle conversion
  22.  *
  23.  * TODO:
  24.  *  - add ability to distingush b/w different kind of events
  25.  *  - add ability to input events directly from search box
  26.  */
  27.  
  28.  
  29. var ents = null;
  30. var lents = null;
  31.  
  32. function loadeventslist()
  33. {
  34.   try
  35.   {
  36.     document.write("<xml id='eventslist' src='" + eventsfileurl + "'></xml>");
  37.     ents = document.all("eventslist").selectSingleNode("events");
  38.   }
  39.   catch (ex) {}
  40. }
  41.  
  42. loadeventslist();
  43.  
  44. function loadlocaleventslist()
  45. {
  46.   try
  47.   {
  48.     document.write("<xml id='localeventslist' src='" + localeventsfileurl + "'></xml>");
  49.     lents = document.all("localeventslist").selectSingleNode("events");
  50.   }
  51.   catch (ex) {}
  52. }
  53.  
  54. loadlocaleventslist();
  55.  
  56. function yhocal(dat)
  57. {
  58.   // adjust for the local time zone
  59.   dat = dat - (new Date()).getTimezoneOffset() * 1000 * 60;
  60.  
  61.   // round down to closest day (in minutes)
  62.   dat = Math.floor(dat / 60 / 60 / 24 / 1000) * 60 * 60 * 24;
  63.   openNamedSearchWindow("http://calendar.yahoo.com/srt:0/?v=0&t=" + dat, "dqsdcal");
  64. }
  65.  
  66. function msncal(dat)
  67. {
  68.   var dobj = new Date(dat);
  69.   var yy = dobj.getYear();
  70.   if (yy < 100) yy += 1900;
  71.   openNamedSearchWindow("http://calendar.msn.com/calendar/isapi.dll?calendarView=day&day=" + dobj.getDate() + "&month=" + (dobj.getMonth()+1) + "&year=" + yy, "dqsdcal");
  72. }
  73.  
  74. function nsccal(dat)
  75. {
  76.   var dobj = new Date(dat);
  77.   var yy = dobj.getYear();
  78.   if (yy < 100) yy += 1900;
  79.   openNamedSearchWindow("http://calendar.netscape.com/cgi-bin/gx.cgi/AppLogic+DayGridView?_Date=" + (dobj.getMonth() + 1) + "/" + dobj.getDate() + "/" + yy, "dqsdcal");
  80. }
  81.  
  82. function aolcal(dat)
  83. {
  84.   var dobj = new Date(dat);
  85.   var yy = dobj.getYear();
  86.   if (yy < 100) yy += 1900;
  87.   openNamedSearchWindow("http://calendar.aol.com/cgi-bin/gx.cgi/AppLogic+DayGridView?_Date=" + (dobj.getMonth() + 1) + "/" + dobj.getDate() + "/" + yy, "dqsdcal");
  88. }
  89.  
  90. function mycal(dat)
  91. {
  92.   var dobj = new Date(dat);
  93.   var yy = dobj.getYear();
  94.   if (yy < 100) yy += 1900;
  95.   openNamedSearchWindow("http://www.mycalendar.com/?act=thisday&curdate=" + (dobj.getMonth() + 1) + "/" + dobj.getDate() + "/" + yy, "dqsdcal");
  96. }
  97.  
  98. function evcal(dat)
  99. {
  100.   var dobj = new Date(dat);
  101.   var yy = dobj.getYear();
  102.   if (yy < 100) yy += 1900;
  103.   openNamedSearchWindow("http://www.evite.com/welcome?date=" + (dobj.getMonth() + 1) + "%2F" + dobj.getDate() + "%2F" + yy, "dqsdcal");
  104. }
  105.  
  106. function outlook(dat)
  107. {
  108.   // TODO - find out how to open at a particular date
  109.   openDocument("outlook:calendar");
  110. }
  111.  
  112. function mozillacal(dat)
  113. {
  114.   // TODO - find out how to open at a particular date
  115.   openDocument("mozilla.exe -calendar");
  116.   //openDocument("mozilla.exe chrome://calendar/content/calendar.xul");
  117. }
  118.  
  119. //vars used by the calendar script
  120. var DAYS_OF_WEEK = 7;    // "constant" for number of days in a week
  121. var DAYS_OF_MONTH = 31;    // "constant" for number of days in a month
  122. var CAL_DAY_START = 1;    // "constant" to indicate which date starts a month (usually people like it to be 1. day of the month)
  123. var WEEK_START_DAY = weekStartDay;    // "constant" to indicate a day which starts a week -- 1=Sun, 2=Mon, .. ; weekStartDay is declared in preferences.js
  124.  
  125. var Calendar = new Date(); //stores the date the user is looking at
  126. var Today = new Date(); // stores the date marked as today
  127. var popcal = null;
  128. var bNeverBuilt = true;
  129. var inlineStyles = new String();
  130.  
  131. function showcal()
  132. {
  133.  
  134.   if (!dopopup || !cal)
  135.     return true;
  136.  
  137.   if (popcal == null)
  138.   {
  139.     popcal = window.createPopup();
  140.     popcal.document.body.innerHTML = buildcal();
  141.     popcal.document.body.className="cal";
  142.   }
  143.   else if (Today.getDate() != (new Date()).getDate())
  144.   {
  145.     popcal.document.body.innerHTML = buildcal();
  146.   }
  147.   popcal.show(document.body.clientWidth - calwidth, -calheight, calwidth, calheight, document.body);
  148.   return false;
  149. }
  150.  
  151. calupdatetimer = null;
  152.  
  153. function movecal(nMths)
  154. {
  155.   Calendar.setMonth(Calendar.getMonth()+nMths);
  156.   popcal.document.all["calhead"].innerHTML = buildcalheader();
  157.   if (calupdatetimer == null)
  158.     calupdatetimer = setTimeout("updatecal()", 0);
  159. }
  160.  
  161. function updatecal()
  162. {
  163.   calupdatetimer = null;
  164.   popcal.document.body.innerHTML = buildcal();
  165.   
  166.   var gCompleteTime = new Date();
  167. }
  168.  
  169. function opencal(d)
  170. {
  171.   if (defaultcal)
  172.   {
  173.     if (popcal)
  174.       popcal.hide();
  175.     eval(defaultcal + '(' + d + ')');
  176.   }
  177. }
  178.  
  179. function buildcalhtmlhead()
  180. {
  181.   if(bNeverBuilt)
  182.   {
  183.     inlineStyles = convertStylesToInline();
  184.     bNeverBuilt = false;
  185.   } 
  186.   return '<table class=cal width=100% height=100% cellpadding=0 cellspacing=0 border=0><tr><td><style>' + inlineStyles + '</style>';
  187. }
  188.  
  189. function buildcalheader()
  190. {
  191.   return getMonthName(Calendar.getMonth()+1)  + ' ' + Calendar.getFullYear();
  192. }
  193.  
  194. function buildcal()
  195. {
  196.   var year = Calendar.getFullYear();  // Returns year in 4 digits
  197.   var month = Calendar.getMonth();    // Returns month (0-11)
  198.  
  199.   Today = new Date();
  200.   var weekday = -1;  // Just init weekday
  201.  
  202.   if (Today.getMonth() == Calendar.getMonth() && Today.getYear() == Calendar.getYear())
  203.     weekday = Today.getDay();
  204.  
  205.   var cal;    // Used for printing
  206.  
  207.   Calendar.setDate(CAL_DAY_START);    // Start the calendar day at '1', '2', ..
  208.  
  209.   var TR_start = '<tr>';
  210.   var TR_end = '</tr>';
  211.   var day_start = '<td width=14.2857% class=caldow>';
  212.   var day_end = '</td>';
  213.  
  214.   function eventday_start(d, ttl)
  215.   {
  216.     return '<td class=caleventday' +
  217.       (defaultcal ? ' onmouseover=this.className="caleventdayhigh" onmouseout=this.className="caleventday" onmouseup=this.className="caleventday";parent.opencal(' + d + ');' : ' ') +
  218.       ' title="' + ttl + '">';
  219.   }
  220.   var eventday_end   = '</td>';
  221.  
  222.   function todayevent_start(d, ttl)
  223.   {
  224.     return '<td class=caltodayevent' +
  225.       (defaultcal ? ' onmouseover=this.className="caltodayeventhigh" onmouseout=this.className="caltodayevent" onmouseup=this.className="caltodayevent";parent.opencal(' + d + ');' : ' ') +
  226.       ' title="' + ttl + '"' + '>';
  227.   }
  228.   var todayevent_end   = '</td>';
  229.  
  230.   function today_start(d)
  231.   {
  232.     return '<td class=caltoday' +
  233.         (defaultcal ? ' onmouseover=this.className="caltodayhigh" onmouseout=this.className="caltoday" onmouseup=this.className="caltoday";parent.opencal(' + d + ');' : ' ') + '>';
  234.   }
  235.   var today_end   = '</td>';
  236.  
  237.   function gray_start(d)
  238.   {
  239.      return '<td class=calgray' +
  240.          (defaultcal ? ' onmouseover=this.className="calgrayhigh" onmouseout=this.className="calgray" onmouseup=this.className="calgray";parent.opencal(' + d + ');' : ' ') + '>';
  241.   }
  242.   var gray_end   = '</td>';
  243.  
  244.   function TD_start(d)
  245.   {
  246.     return '<td class=calday' +
  247.         (defaultcal ? ' onmouseover=this.className="caldayhigh" onmouseout=this.className="calday" onmouseup=this.className="calday";parent.opencal(' + d + ');' : ' ') + '>';
  248.   }
  249.   var TD_end = '</td>';
  250.  
  251.   var cal = buildcalhtmlhead();
  252.   
  253.   var tableStart = '<table width=100% height=100% border=0 cellspacing=0 cellpadding=0><tr>';
  254.   tableStart += '<td colspan=7><table width=100% height=100% border=0 cellspacing=0 cellpadding=0><tr>';
  255.   tableStart += '<td><table align=left height=100% border=0 cellspacing=0 cellpadding=0><tr>';
  256.   tableStart += '<td class=calnavyear width=0 title="' + local(PREV_YEAR) + '" ' +
  257.          ' onmouseup="parent.movecal(-12);return false;" ' +
  258.          ' onmouseover=this.className="calnavyearhigh" ' +
  259.          ' onmouseout=this.className="calnavyear" > « </td>';
  260.   tableStart += '<td class=calnavmonth width=0 title="' + local(PREV_MONTH) + '" ' +
  261.          ' onmouseup="parent.movecal(-1);return false;" ' +
  262.          ' onmouseover=this.className="calnavmonthhigh" ' +
  263.          ' onmouseout=this.className="calnavmonth" > ‹ </td></tr></table></td>';
  264.  
  265.   if (weekday < 0)
  266.   {
  267.     tableStart += '<td id=calhead class=calmonth title="' + local(GO_TO_TODAY) + '" ' +
  268.       ' onmouseup="parent.Calendar=new Date();parent.movecal(0);" ' +
  269.       ' onmouseover=this.className="calmonthhigh" ' +
  270.       ' onmouseout=this.className="calmonth" >';
  271.   }
  272.   else
  273.   {
  274.     tableStart += '<td id=calhead class=calmonth colspan=' + (DAYS_OF_WEEK - 2) + '>';
  275.   }
  276.  
  277.   tableStart += buildcalheader();
  278.  
  279.   tableStart += '</td>';
  280.   tableStart += '<td><table align=RIGHT height=100% border=0 cellspacing=0 cellpadding=0><tr>';
  281.   tableStart += '<td class=calnavmonth width=0 title="' + local(NEXT_MONTH) + '" ' +
  282.          ' onmouseup="parent.movecal(+1);return false;" ' +
  283.          ' onmouseover=this.className="calnavmonthhigh" ' +
  284.          ' onmouseout=this.className="calnavmonth" > › </td>';
  285.   tableStart += '<td class=calnavyear width=0 title="' + local(NEXT_YEAR) + '" ' +
  286.          ' onmouseup="parent.movecal(+12);return false;" ' +
  287.          ' onmouseover=this.className="calnavyearhigh" ' +
  288.          ' onmouseout=this.className="calnavyear" > » </td></tr></table></td>';
  289.   tableStart += '</td></tr></table>';
  290.   tableStart += TR_end + TR_start;
  291.  
  292.   cal += tableStart;
  293.  
  294.   //printing day labels
  295.   var tempString = new String();
  296.   for(index=0; index < DAYS_OF_WEEK; index++)
  297.   {
  298.     tempString += day_start;
  299.     tempString += getDayName(DAYS_OF_WEEK + ((index + WEEK_START_DAY - 1) % DAYS_OF_WEEK) + 1);
  300.     tempString += day_end;
  301.   }
  302.   tempString += TD_end;
  303.   
  304.   cal += tempString;
  305.  
  306.   //fill spaces until first day in the month
  307.   var whichmonth = -1;
  308.   var filldays = Calendar.getDay() - (WEEK_START_DAY - 1);
  309.   if (filldays < 0) filldays += DAYS_OF_WEEK;
  310.  
  311.   Calendar.setDate(Calendar.getDate() - filldays);
  312.  
  313.   var tableString = new String();
  314.  
  315.   //draw six weeks loop for each day in the month
  316.   for (index=0; index < DAYS_OF_WEEK * 6; index++)
  317.   {
  318.     var month_day = Calendar.getDate();
  319.     if (month_day == CAL_DAY_START) whichmonth += 1;
  320.     var dayString = new String();
  321.     var nowTime = Calendar.getTime();
  322.  
  323.     week_day = Calendar.getDay();
  324.  
  325.     // start new row if we hit a new week
  326.     if (week_day == WEEK_START_DAY - 1) dayString += TR_end + TR_start;
  327.     var ent = null;
  328.     var lent = null;
  329.     querystr = 'event[date[(number(@year)="'+year+'" || not(@year)) && (number(@month)="'+(month+1)+'" || not(@month)) && number(@day)="'+month_day+'"]]';
  330.     if (ents)
  331.       ent = ents.selectSingleNode(querystr);
  332.     if (lents)
  333.       lent = lents.selectSingleNode(querystr);
  334.  
  335.  
  336.     var highlight = false;
  337.     if( weekday>=0 && Today.getDate()==month_day)
  338.       highlight = true;
  339.  
  340.     // highlight appropriately
  341.     if (whichmonth != 0)
  342.       dayString += gray_start(nowTime) + month_day + gray_end;
  343.     else
  344.     {
  345.       if (highlight && ent)
  346.         dayString += todayevent_start(nowTime, ent.getAttribute("name"));
  347.       else
  348.         if (highlight)
  349.           dayString += today_start(nowTime);
  350.         else
  351.           if (ent)
  352.             dayString += eventday_start(nowTime, ent.getAttribute("name"));
  353.           else
  354.             if (lent)
  355.               dayString += eventday_start(nowTime, lent.getAttribute("name"));
  356.             else
  357.               dayString += TD_start(nowTime);
  358.  
  359.       dayString += month_day;
  360.  
  361.       if (highlight && ent)
  362.         dayString += todayevent_end;
  363.       else
  364.         if (highlight)
  365.           dayString += today_end;
  366.         else
  367.           if (ent)
  368.             dayString += eventday_end;
  369.           else
  370.             dayString += TD_end;
  371.             
  372.     }
  373.  
  374.     //advance the date for next iteration
  375.     Calendar.setDate(Calendar.getDate()+1);
  376.  
  377.     tableString += dayString;
  378.  
  379.   }// end for loop
  380.  
  381.   cal += tableString + TR_end + '</table></td></tr></table>'
  382.   
  383.   //reset back the calendar's month
  384.   Calendar.setMonth(Calendar.getMonth()-1);
  385.   
  386. //  var endTime = new Date();
  387. //  var timeDiff = endTime - startTime;
  388. //  alert(timeDiff);
  389.  
  390.   //return the html string
  391.   return cal;
  392. }
  393.  
  394.