showNothingText: { Type: 'Bool', Default: true, Value: true,},\r
nothingText: { Type: 'String', Default: getLocalizedText('settings.default.nothingText'), Value: getLocalizedText('settings.default.nothingText'),},\r
enableDaylightSaving: { Type: 'Bool', Default: true, Value: true,},\r
+ daylightSavingOffset: { Type: 'Int', Default: 1, Value: 1,},\r
hideWidgetOnCalendarOpen: { Type: 'Bool', Default: false, Value: false,},\r
cssStyle_background: { Type: 'String', Default: 'color:#ffffff; background-color:#000000', Value: 'color:#ffffff; background-color:#000000',},\r
cssStyle_backgroundFullscreen: { Type: 'String', Default: 'color:#ffffff; background-color:#000000', Value: 'color:#ffffff; background-color:#000000',},\r
var calendarList = [];\r
\r
// vars for daylight saving time\r
-var daylightsavingWinter = 0;\r
-var daylightsavingSummer = 0;\r
-var summertime = false;\r
+var summertime = false; // true, if current date is in summer, false if in winter\r
+var daylightSavingDates = new Object(); // caches calculated DST winter and summer time shift dates\r
\r
// this is a list of data fields a calendar event can have\r
var entryFields = [\r
days = isLeapYear(year) ? --days : days;\r
return days;\r
}\r
- \r
-function calcDaylightSaving()\r
+\r
+function isSummertime(curDate)\r
{\r
- var thisYearS = new Date(now.getFullYear(), 3, 0, 0, 0, 0 );\r
- var thisYearW = new Date(now.getFullYear(), 10, 0, 0, 0, 0 );\r
- var nextYearS = new Date(now.getFullYear() + 1, 3, 0, 0, 0, 0 );\r
- var nextYearW = new Date(now.getFullYear() + 1, 10, 0, 0, 0, 0 );\r
var summer = false;\r
var winter = false;\r
- \r
- thisYearSDays = nextYearSDays = 90;\r
- thisYearWDays = nextYearWDays = 304;\r
- \r
- thisYearSDays = calcLeapYear(now.getFullYear(), thisYearSDays);\r
- thisYearWDays = calcLeapYear(now.getFullYear(), thisYearWDays);\r
- nextYearSDays = calcLeapYear(now.getFullYear() + 1, nextYearSDays);\r
- nextYearWDays = calcLeapYear(now.getFullYear() + 1, nextYearWDays);\r
- \r
- thisYearSDays = subToSunday(thisYearS, now.getFullYear(), thisYearSDays, 59);\r
- thisYearWDays = subToSunday(thisYearW, now.getFullYear(), thisYearWDays, 273);\r
- nextYearSDays = subToSunday(nextYearS, now.getFullYear() + 1, nextYearSDays, 59);\r
- nextYearWDays = subToSunday(nextYearW, now.getFullYear() + 1, nextYearWDays, 273);\r
- \r
- daylightsavingSummer = new Date (now.getFullYear(), 03-1, thisYearSDays, 2, 0, 0);\r
- daylightsavingWinter = new Date (now.getFullYear(), 10-1, thisYearWDays, 2, 0, 0);\r
- if (daylightsavingSummer < now) {\r
- daylightsavingSummer = new Date (now.getFullYear()+1, 03-1, nextYearSDays, 2, 0, 0);\r
- var summer = true;\r
- }\r
- if (daylightsavingWinter < now) {\r
- daylightsavingWinter = new Date (now.getFullYear()+1, 10-1, nextYearWDays, 2, 0, 0);\r
- var winter = true;\r
+\r
+ // if we already calculated DST summer and winter time dates for this year, use cached values\r
+ var dst = daylightSavingDates[curDate.getFullYear()];\r
+ if (!dst) {\r
+ var thisYearS = new Date(curDate.getFullYear(), 3, 0, 0, 0, 0 );\r
+ var thisYearW = new Date(curDate.getFullYear(), 10, 0, 0, 0, 0 );\r
+ var nextYearS = new Date(curDate.getFullYear() + 1, 3, 0, 0, 0, 0 );\r
+ var nextYearW = new Date(curDate.getFullYear() + 1, 10, 0, 0, 0, 0 );\r
+ \r
+ thisYearSDays = nextYearSDays = 90;\r
+ thisYearWDays = nextYearWDays = 304;\r
+ \r
+ thisYearSDays = calcLeapYear(curDate.getFullYear(), thisYearSDays);\r
+ thisYearWDays = calcLeapYear(curDate.getFullYear(), thisYearWDays);\r
+ nextYearSDays = calcLeapYear(curDate.getFullYear() + 1, nextYearSDays);\r
+ nextYearWDays = calcLeapYear(curDate.getFullYear() + 1, nextYearWDays);\r
+ \r
+ thisYearSDays = subToSunday(thisYearS, curDate.getFullYear(), thisYearSDays, 59);\r
+ thisYearWDays = subToSunday(thisYearW, curDate.getFullYear(), thisYearWDays, 273);\r
+ nextYearSDays = subToSunday(nextYearS, curDate.getFullYear() + 1, nextYearSDays, 59);\r
+ nextYearWDays = subToSunday(nextYearW, curDate.getFullYear() + 1, nextYearWDays, 273);\r
+ \r
+ dst = {\r
+ Summer: new Date (curDate.getFullYear(), 03-1, thisYearSDays, 2, 0, 0),\r
+ Winter: new Date (curDate.getFullYear(), 10-1, thisYearWDays, 2, 0, 0),\r
+ }\r
+ daylightSavingDates[curDate.getFullYear()] = dst;\r
}\r
+\r
+ if (dst.Summer < curDate)\r
+ summer = true;\r
+ if (dst.Winter < curDate)\r
+ winter = true;\r
if (summer && !winter)\r
- summertime = true;\r
+ return true;\r
else\r
- summertime = false;\r
+ return false;\r
}\r
\r
function error(message)\r
if (dateArr.length == 6 && dateArr[5].toLowerCase() == 'am' && hours == 12)\r
hours = 0;\r
\r
- console.info('year=' + year + ' month=' + month + ' day=' + day + ' hours=' + hours + ' minutes=' + minutes+ ' seconds=' + seconds);\r
-\r
+ var result = new Date(year, month - 1, day, hours, minutes, seconds);\r
+ \r
// take care of daylight saving time\r
if (config['enableDaylightSaving'].Value) {\r
- var date = new Date(year, month - 1, day, hours, minutes, seconds);\r
- if (summertime && date > daylightsavingWinter && date < daylightsavingSummer)\r
- hours -= 1;\r
- else if (!summertime && date > daylightsavingSummer && date < daylightsavingWinter)\r
- hours += 1;\r
+ \r
+ // determine if date is in summer or winter time\r
+ var dateSummerTime = isSummertime(result);\r
+\r
+ // work around bug in Nokias calendar api resulting in dates within a different DST to be off by 1 hour\r
+ if (summertime && !dateSummerTime) {\r
+ result = new Date(result.getTime() - 1000 * 60 * 60 * config['daylightSavingOffset'].Value); // -1 hour\r
+ console.info('parseDate(): fixing time -1h: ' + result);\r
+ }\r
+ else if (!summertime && dateSummerTime) {\r
+ result = new Date(result.getTime() + 1000 * 60 * 60 * config['daylightSavingOffset'].Value); // +1 hour\r
+ console.info('parseDate(): fixing time +1h: ' + result);\r
+ }\r
}\r
\r
- return new Date(year, month - 1, day, hours, minutes, seconds);\r
+ return result;\r
}\r
\r
// returns a short date as string ("31.12" or "12.31") based on the format string which should look like "Wednesday, 26 August, 2009 12:00:00 am"\r
function updateData()\r
{\r
console.info('updateData()');\r
- calcDaylightSaving();\r
try {\r
// meetings have time\r
// note: anniveraries have a start time of 12:00am. So since we want to include them, we have to query the whole day and check if events have passed later\r
now = new Date();\r
+ summertime = isSummertime(now); // cache summer time info for today\r
var meetingList = [];\r
for(var i=0; i < calendarList.length; i++) {\r
var meetingListFiltering = {\r