function dateAdd(objDate,strInterval,intIncrement)
{if(typeof(objDate)=="string")
{objDate=new Date(objDate);if(isNaN(objDate))
{throw("DateAdd: Date is not a valid date");}}
else if(typeof(objDate)!="object"||objDate.constructor.toString().indexOf("Date()")==-1)
{throw("DateAdd: First parameter must be a date object");}
if(strInterval!="M"&&strInterval!="D"&&strInterval!="Y"&&strInterval!="h"&&strInterval!="m"&&strInterval!="uM"&&strInterval!="uD"&&strInterval!="uY"&&strInterval!="uh"&&strInterval!="um"&&strInterval!="us")
{throw("DateAdd: Second parameter must be M, D, Y, h, m, uM, uD, uY, uh, um or us");}
if(typeof(intIncrement)!="number")
{throw("DateAdd: Third parameter must be a number");}
switch(strInterval)
{case"M":objDate.setMonth(parseInt(objDate.getMonth())+parseInt(intIncrement));break;case"D":objDate.setDate(parseInt(objDate.getDate())+parseInt(intIncrement));break;case"Y":objDate.setYear(parseInt(objDate.getYear())+parseInt(intIncrement));break;case"h":objDate.setHours(parseInt(objDate.getHours())+parseInt(intIncrement));break;case"m":objDate.setMinutes(parseInt(objDate.getMinutes())+parseInt(intIncrement));break;case"s":objDate.setSeconds(parseInt(objDate.getSeconds())+parseInt(intIncrement));break;case"uM":objDate.setUTCMonth(parseInt(objDate.getUTCMonth())+parseInt(intIncrement));break;case"uD":objDate.setUTCDate(parseInt(objDate.getUTCDate())+parseInt(intIncrement));break;case"uY":objDate.setUTCFullYear(parseInt(objDate.getUTCFullYear())+parseInt(intIncrement));break;case"uh":objDate.setUTCHours(parseInt(objDate.getUTCHours())+parseInt(intIncrement));break;case"um":objDate.setUTCMinutes(parseInt(objDate.getUTCMinutes())+parseInt(intIncrement));break;case"us":objDate.setUTCSeconds(parseInt(objDate.getUTCSeconds())+parseInt(intIncrement));break;}
return objDate;}
function getLocalTimeFromGMT(dtGMT){return dateAdd(dtGMT,"m",-dtGMT.getTimezoneOffset());}
function zeroFill(number,width)
{width-=number.toString().length;if(width>0)
{return new Array(width+(/\./.test(number)?2:1)).join('0')+number;}
return number;}
function getDSTOffset(dtCET){year=dtCET.getFullYear();for(i=31;i>23;i--){dtStartDST=new Date(year,2,i,3,0,0,0);if(dtStartDST.getDay()==0){break;}}
for(i=31;i>23;i--){dtEndDST=new Date(year,9,i,2,59,59,999);if(dtEndDST.getDay()==0){break;}}
if(dtCET>=dtStartDST&&dtCET<=dtEndDST){return 2;}
else{return 1;}}
function localTime(dtCET){DSTOffset=getDSTOffset(dtCET);dtGMT=new Date(dtCET);dtGMT=dateAdd(dtGMT,"h",-DSTOffset);if(DSTOffset==1){CETText="CET";}
else{CETText="CEST";}
document.write(dtCET.toDateString()+' '+zeroFill(dtCET.getHours(),2)+':'+zeroFill(dtCET.getMinutes(),2)+' '+CETText);var dtLocal=getLocalTimeFromGMT(dtGMT);document.write("<br/><b>Est. local time:</b> "+dtLocal.toDateString()+' '+zeroFill(dtLocal.getHours(),2)+':'+zeroFill(dtLocal.getMinutes(),2)+' GMT');if(dtLocal.getTimezoneOffset()<0){document.write("+");}
if(dtLocal.getTimezoneOffset()!=0){document.write(-dtLocal.getTimezoneOffset()/60);}}
