// datetime.js - routines for displaying dates and times that take into account time zones and DST
// Bill Clementson

var timerID;

function getNewDate()
{ 
  return new Date(); 
} 

function fetchDate(d,m,h,w)
{ 
  var week=(w<0)?7*(w+1):7*(w-1),nm=(w<0)?m+1:m,x=new Date(getNewDate().getUTCFullYear(),nm,1,h,0,0),dOff=0; 
  if(w<0)
    { 
      x.setTime(x.getTime()-86400000); 
    } 
  if(x.getDay()!=d)
    { 
      dOff=(x.getDay()<d)?(d-x.getDay()):0-(x.getDay()-d); 
      if(w<0&&dOff>0)
	{ 
	  week-=7; 
	} 
      if(w>0&&dOff<0)
	{ 
	  week+=7; 
	} 
      x.setTime(x.getTime()+((dOff+week)*86400000)); 
    }   
  return x; 
} 

function tzone(tz, os, ds, d1, m1, h1, w1, d2, m2, h2, w2, cl)
{
  this.ct = new Date(0) ; // datetime
  this.tz = tz ;	  // time zone code
  this.os = os ;	  // GMT offset
  this.ds = ds ;          // daylight savings (0=None, 1=Northern, -1=Southern)
  this.d1 = d1 ;	  // daylight savings day (0=Sun) - FROM DATE
  this.m1 = m1 ;          // daylight savings month (0=Jan)
  this.h1 = h1 ;          // daylight savings hour
  this.w1 = w1 ;          // daylight savings week (1=first week, -1=last week)
  this.d2 = d2 ;	  // daylight savings day (0=Sun) - TO DATE
  this.m2 = m2 ;          // daylight savings month (0=Jan)
  this.h2 = h2 ;          // daylight savings hour
  this.w2 = w2 ;          // daylight savings week
  this.cl = cl ;	  // font color
}

function UpdateClocks()
{
  // www.timeanddate.com/worldclock
  var ct = new Array(
		     new tzone('<font face="Verdana" size="-1"> <b>London:</b></font><br> ', +0, 1, 0, 2, 1, -1, 0, 9, 2, -1, 'black'),
		     new tzone('<font face="Verdana" size="-1"> <b>New York:</b></font><br> ', -5, 1, 0, 2, 2, 2, 0, 10, 2, 1, 'black'),
		     new tzone('<font face="Verdana" size="-1"> <b>Vancouver:</b></font><br> ', -8, 1, 0, 2, 2, 2, 0, 10, 2, 1, 'black'),
		     new tzone('<font face="Verdana" size="-1"> <b>Auckland:</b></font><br> ', +12, -1,  0, 8, 3, -1, 0, 3, 2, 1,'black'),
		     new tzone('<font face="Verdana" size="-1"> <b>Sydney:</b></font><br> ', +10, -1, 0, 9, 2, 1, 0, 3, 3, 1, 'black')
		     ) ;

  var dt = new Date() ;	// [GMT] time according to machine clock

  // Adjust each clock offset if that clock has DS and in DS.
  for(n=0 ; n<ct.length ; n++)
    {
      var ds_active = 0 ;
      if (ct[n].ds == 1) // Northern Hemisphere
	{
	  if ((fetchDate(ct[n].d1, ct[n].m1, ct[n].h1, ct[n].w1) < dt) && (dt < fetchDate(ct[n].d2, ct[n].m2, ct[n].h2, ct[n].w2))) ds_active = 1 ; 
	}
      if (ct[n].ds == -1) // Southern Hemisphere
	{
	  if ((fetchDate(ct[n].d1, ct[n].m1, ct[n].h1, ct[n].w1) < dt) || (dt < fetchDate(ct[n].d2, ct[n].m2, ct[n].h2, ct[n].w2))) ds_active = 1 ; 
	}

      if (ds_active == 1) ct[n].os++ ;
    }

  // compensate time zones
  gmdt = new Date() ;
  for (n=0 ; n<ct.length ; n++)
    ct[n].ct = new Date(gmdt.getTime() + ct[n].os * 3600 * 1000) ;

  document.getElementById("Clock0").innerHTML =
    '<font face="Verdana" size="-2" color="' + ct[0].cl + '">' + ct[0].tz + ClockString(ct[0].ct) + '</font>' ;

  document.getElementById("Clock1").innerHTML =
    '<font face="Verdana" size="-2" color="' + ct[1].cl + '">' + ct[1].tz + ClockString(ct[1].ct) + '</font>' ;

  document.getElementById("Clock2").innerHTML =
    '<font face="Verdana" size="-2" color="' + ct[2].cl + '">' + ct[2].tz + ClockString(ct[2].ct) + '</font>' ;

  document.getElementById("Clock3").innerHTML =
    '<font face="Verdana" size="-2" color="' + ct[3].cl + '">' + ct[3].tz + ClockString(ct[3].ct) + '</font>' ;
		
  document.getElementById("Clock4").innerHTML =
    '<font face="Verdana" size="-2" color="' + ct[4].cl + '">' + ct[4].tz + ClockString(ct[4].ct) + '</font>' ;

	
  timerID = window.setTimeout("UpdateClocks()", 1001) ;
}

function ClockString(dt)
{
  var stemp, ampm ;

  var dt_year = dt.getUTCFullYear() ;
  var dt_month = dt.getUTCMonth() + 1 ;
  var dt_day = dt.getUTCDate() ;
  var dt_hour = dt.getUTCHours() ;
  var dt_minute = dt.getUTCMinutes() ;
  var dt_second = dt.getUTCSeconds() ;
	
  dt_year = dt_year.toString() ;
  if (0 <= dt_hour && dt_hour < 12)
    {
      ampm = 'AM' ;
      if (dt_hour == 0) dt_hour = 12 ;		
    } else {
    ampm = 'PM' ;
    dt_hour = dt_hour - 12 ;
    if (dt_hour == 0) dt_hour = 12 ;		
  }
	
  if (dt_minute < 10)
    dt_minute = '0' + dt_minute ;
	
  if (dt_second < 10)
    dt_second = '0' + dt_second ;

  stemp = dt_year + '-' + dt_month + '-' + dt_day ;
  stemp = stemp + '<br>' + ' ' + dt_hour + ":" + dt_minute + ":" + dt_second + ' ' + ampm ;
  return stemp ;
}
