// timezone.js
//
// 2002 by Winfried Beer (http://www.w-beer.de/)
// 2008: new DST date for NZ 
// 2009: inserted ":" at GMT offset (eg. GMT-01:00)

// -------------------------------------------------
function zeropad(str,len) {  // padd string with zeros
  s="0000000000000000000000000000000000"+str;
  s=s.substr(s.length-len,len);  // pad with 0
  return s;
}

// -------------------------------------------------
function minutes2hhmm(minutes) {  // minutes -> +hhmm
  mn=Math.abs(minutes);
  hr=Math.floor(mn/60);
  mn=mn-hr*60;
  str=zeropad(hr,2)+":"+zeropad(mn,2);
  if (minutes<0) {
    str="-"+str;
  }else{
    str="+"+str;
  }
  return str;
}

// -------------------------------------------------
function gmtzonetext (minutes) {  // minutes -> GMT+hhmm
  if (minutes>=0) {
    return "GMT"+minutes2hhmm(minutes);
  }else{
    return "GMT"+minutes2hhmm(minutes);
  }
}

// -------------------------------------------------
// return weekday number belong to time (milliseconds since 1.1.1970)
// -------------------------------------------------
function weekdayOfTime (time) {
  weekday=Math.floor(time/(24*60*60*1000)+4)%7;   // 0=Sun, 1=Mon, 2=Tue, ...
  return weekday;
}

// -------------------------------------------------
// Return string with date, time, timezone and
// daylight saving tag in New Zealand.
// Parameter "now": date object
//
// since 2008:
//   DST lasts from "last sunday in september"  
//   till "first sunday in april".
// 2007 and before: 
//   DST lasts from "first sunday in october"
//   till "first sunday on/after 15 march
// -------------------------------------------------
function date2NewZealandString(now) {

  // -- set variables
  gmttime=now.getTime();
  GMToffset=-12*60;    // timezone offset in minutes (normal winter time)
  time=gmttime-GMToffset*60*1000; 
  DST="";

  // -- get year and timestr
  mydate=new Date();
  mydate.setTime(time);
  timestr=mydate.toGMTString();  // e.g. "Sat, 05 Jan 2002 20:25:06 GMT"
  timearr=timestr.split(" ");
  year=timearr[3];

  // -- get begin of daylight saving time
  beginDST=Date.parse("31 Sep "+year+" 02:00:00 GMT");
  weekday=weekdayOfTime(beginDST);
  beginDST=beginDST-weekday*24*60*60*1000;

  // -- get end of daylight saving time
  endDST=Date.parse("01 Apr "+year+" 02:00:00 GMT");
  weekday=weekdayOfTime(endDST);
  endDST=endDST+((7-weekday)%7)*24*60*60*1000;

  // -- compare with daylight saving times
  if (time<=endDST || time>beginDST) {
    DST="DST";
    GMToffset=GMToffset-60;  // shift one hour
    time=time+60*60*1000;
    mydate.setTime(time); 
    timestr=mydate.toGMTString();
  }

  return timestr+minutes2hhmm(GMToffset)+" "+DST;
}

// -------------------------------------------------
// Return string with date, time, timezone and
// daylight saving tag in Germany.
// Parameter "now": date object
//
// DST lasts from "last sunday in march"  
// till "last sunday in october".
// -------------------------------------------------
function date2GermanyString(now) {

  // -- set variables
  gmttime=now.getTime();
  GMToffset=-1*60;    // timezone offset in minutes (normal winter time)
  time=gmttime-GMToffset*60*1000; 
  DST="";

  // -- get year and timestr
  mydate=new Date();
  mydate.setTime(time);
  timestr=mydate.toGMTString();  // e.g. "Sat, 05 Jan 2002 20:25:06 GMT"
  timearr=timestr.split(" ");
  year=timearr[3];

  // -- get begin of daylight saving time
  beginDST=Date.parse("31 Mar "+year+" 02:00:00 GMT");
  weekday=weekdayOfTime(beginDST);
  beginDST=beginDST-weekday*24*60*60*1000;

  // -- get end of daylight saving time
  endDST=Date.parse("31 Oct "+year+" 02:00:00 GMT");
  weekday=weekdayOfTime(endDST);
  endDST=endDST-weekday*24*60*60*1000;

  // -- compare with daylight saving times
  if (time>beginDST && time<=endDST) {
    DST="DST";
    GMToffset=GMToffset-60;  // shift one hour
    time=time+60*60*1000;
    mydate.setTime(time); 
    timestr=mydate.toGMTString();
  }

  return timestr+minutes2hhmm(GMToffset)+" "+DST;
}

// -------------------------------------------------
function date2LocalString(now) {
  // -- set variables
  gmttime=now.getTime();
  GMToffset=now.getTimezoneOffset();    // timezone offset in minutes (normal winter time)
  time=gmttime-GMToffset*60*1000; 
  DST="";

  // -- get year and timestr
  mydate=new Date();
  mydate.setTime(time);
  timestr=mydate.toGMTString();  // e.g. "Sat, 05 Jan 2002 20:25:06 GMT"
  timestr=timestr.substr(0,timestr.length-4);

  return timestr;
}



// -------------------------------------------------
function writeTimeTable(now) {
  mydate=new Date();

  document.writeln ("<table border=0>");

  // do all time/date computing with GMT time functions, 
  // functions with local time aren't reliable 'cause of daylight saving times.

  // --- local user time
  //datetimestr=now.toLocaleString()+" "+gmtzonetext(now.getTimezoneOffset());
  GMToffset=now.getTimezoneOffset();
  mydate.setTime(now.getTime()-GMToffset*60*1000);
  datetimestr=""+mydate.toGMTString()+minutes2hhmm(GMToffset);
  document.writeln ("<tr><td>Ihre lokale Uhrzeit:</td><td> "+datetimestr+"</td></tr>");

  // --- GMT time
  datetimestr=now.toGMTString()+minutes2hhmm(0);
  document.writeln ("<tr><td>Uhrzeit nach GMT:</td><td> "+datetimestr+"</td></tr>");
 
  // --- time in germany
  datetimestr=date2GermanyString(now.getTime());
  document.writeln ("<tr><td>Uhrzeit in Deutschland:</td><td> "+datetimestr+"</td></tr>");

  // --- time in new zealand
  datetimestr=date2NewZealandString(now.getTime());
  document.writeln ("<tr><td>Uhrzeit in Neuseeland:</td><td> "+datetimestr+"</td></tr>");

  document.writeln ("</table>");
}


// -------------------------------------------------
function writeYearTable(now) {
  mydate=new Date();
  document.writeln("<listing>");
  for (k=0;k<366;k++) {
    mydate.setTime(now.getTime()+k*24*60*60*1000);
    document.writeln(""+date2GermanyString(now)+"      "+date2NewZealandString(now)+"<br>");
  }
  document.writeln("</listing>");   
}


// some tests:
// alert("GMT "+Date.parse("Tue, 1 Jun 2000 00:00:00 GMT"));
// alert("local "+Date.parse("Tue, 1 Jun 2000 00:00:00"));
     
