]> code.delx.au - comingnext/blobdiff - comingNext/index.html
* fixed daylight saving times not being applied properly resulting in events being...
[comingnext] / comingNext / index.html
index ce1215309905221e83fc8b9ee13cd31ba5e287d0..d66fd2917a992e14c4f05b49760e00b20ac8ea1c 100644 (file)
@@ -47,6 +47,7 @@ var config = {
        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
@@ -67,7 +68,7 @@ var config = {
 // Nothing of interest from here on...\r
 //-------------------------------------------------------\r
 var panelNum = 0; // use 1 for second panel\r
-var version = "1.28";\r
+var version = "1.29";\r
 var versionURL = "http://comingnext.sourceforge.net/version.xml";\r
 var calendarService = null;\r
 var cacheEntriesHtml = [];\r
@@ -83,9 +84,8 @@ var notificationRequest2;
 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
@@ -127,43 +127,48 @@ function subToSunday(myDate, year, days, prevMonthDays)
        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
@@ -382,18 +387,26 @@ function parseDate(dateString)
        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
@@ -467,11 +480,11 @@ function formatTime(date)
 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
@@ -488,6 +501,7 @@ function updateData()
                        var list = meetingResult.ReturnValue;\r
                        meetingList = meetingList.concat(listToArray(list));\r
                }\r
+               console.info("updateData(): meetingList.sort()");\r
                meetingList.sort(sortCalendarEntries);\r
 \r
                // todos don't, they start on 00:00 hrs., but should be visible anyway\r
@@ -508,6 +522,7 @@ function updateData()
                                var list = todayTodoResult.ReturnValue;\r
                                todayTodoList = todayTodoList.concat(listToArray(list));\r
                        }\r
+                       console.info("updateData(): todayTodoList.sort()");\r
                        todayTodoList.sort(sortCalendarEntries);\r
                        var entryLists = [todayTodoList, meetingList];\r
                } else {\r
@@ -548,6 +563,17 @@ function updateData()
                else\r
                        max = 30; // we can display a lot more events in fullscreen mode\r
 \r
+               var listinfo = "";\r
+               for (var i=0; i < entryLists.length; i++) {\r
+                       listinfo = listinfo + " " + entryLists[i].length;\r
+                       var entrieslist = "";\r
+                       for (var j=0; j < entryLists[i].length; j++) {\r
+                               entrieslist += entryLists[i][j].Summary + ", ";\r
+                       }\r
+                       console.info("updateData(): entrieslist: " + entrieslist);\r
+               }\r
+               console.info("updateData(): inner loop, " + entryLists.length + " lists, [" + listinfo + "] entries");\r
+               \r
                // the first outer loop iteration is for passed ToDos, the second loop is for all upcomming events (may also include ToDos)\r
                for (var i=0; counter < max && i < entryLists.length; i++) {\r
                        for (var j=0; (counter < max) && (j < entryLists[i].length); j++) {\r
@@ -555,17 +581,13 @@ function updateData()
                                counter++;\r
 \r
                                // output event info for debugging\r
-                               console.info(\r
-                                       'event: Id=' + entry.id + \r
-                                       ',Type=' + entry.Type + \r
-                                       ',Summary=' + entry.Summary + \r
-                                       ',Location=' + entry.Location + \r
-                                       ',Status=' + entry.Status + \r
-                                       ',StartTime=' + entry.StartTime +\r
-                                       ',EndTime=' + entry.EndTime +\r
-                                       ',InstanceStartTime=' + entry.InstanceStartTime +\r
-                                       ',InstanceEndTime=' + entry.InstanceEndTime\r
-                               );\r
+                               var entryInfo = "event: ";\r
+                               for(var k=0; k < entryFields.length; ++k) {\r
+                                       if (entry[entryFields[k]] != undefined) {\r
+                                               entryInfo += entryFields[k] + "=" + entry[entryFields[k]] + ",";\r
+                                       }\r
+                               }\r
+                               console.info(entryInfo);\r
 \r
                                // we don't want ToDos when includeTodos == false or when they are completed\r
                                if (entry.Type == 'ToDo' && (entry.Status == "TodoCompleted" || !config['includeTodos'].Value)) {\r
@@ -778,10 +800,12 @@ function init()
        else {\r
                mode = 1;\r
        }\r
+       console.info("init(): updateScreen()");\r
        updateScreen();\r
        if (config['useBackgroundImage'].Value)\r
                // check for screen rotation every 1 secs\r
                window.setInterval('updateScreen()', 1000 * 1);\r
+       console.info("init(): finished...");\r
 }\r
 \r
 function createMenu()\r
@@ -959,6 +983,7 @@ function loadSettings()
        }\r
        var entry = result.ReturnValue.getNext();\r
        if (entry != undefined) {\r
+               console.info("Loading Settings...");\r
                // only reload settings if they chanced since the last reload\r
                if (settingsCache != entry.Summary)\r
                {\r
@@ -984,6 +1009,9 @@ function loadSettings()
                        settingsCache = entry.Summary;\r
                        updateCssClasses();\r
                }\r
+               else {\r
+                       console.info("Settings already cached and did not change");\r
+               }\r
        }\r
        else {\r
                error("Failed to load settings, calendar entry could not be found");\r
@@ -1067,6 +1095,7 @@ function updateFullscreen()
 \r
 function showFullscreen()\r
 {\r
+       console.info("showFullscreen()");\r
        hideViews();\r
        document.getElementById("fullscreenView").style.display = "block";\r
        document.getElementById('body').className = "backgroundFullscreen";\r
@@ -1111,6 +1140,7 @@ function updateHomescreen()
 \r
 function showHomescreen()\r
 {\r
+       console.info("showHomescreen()");\r
        hideViews();\r
        document.getElementById("homescreenView").style.display = "block";\r
        document.getElementById('body').className = "background";\r
@@ -1241,31 +1271,32 @@ function listToArray(list)
 function sortCalendarEntries(a, b)\r
 {\r
        var atime, btime;\r
+       console.info("sortCalendarEntries(" + a.Summary + "," + b.Summary + ")");\r
        \r
-       if (a['InstanceStartTime'] != null) {\r
-               atime = a['InstanceStartTime'];\r
+       if (a.InstanceStartTime != null) {\r
+               atime = a.InstanceStartTime;\r
        }\r
-       else if (a['StartTime'] != null) {\r
-               atime = a['StartTime'];\r
+       else if (a.StartTime != null) {\r
+               atime = a.StartTime;\r
        }\r
-       else if (a['InstanceEndTime'] != null) {\r
-               atime = a['InstanceEndTime'];\r
+       else if (a.InstanceEndTime != null) {\r
+               atime = a.InstanceEndTime;\r
        }\r
-       else if (a['EndTime'] != null) {\r
-               atime = a['EndTime'];\r
+       else if (a.EndTime != null) {\r
+               atime = a.EndTime;\r
        }\r
        \r
-       if (b['InstanceStartTime'] != null) {\r
-               btime = b['InstanceStartTime'];\r
+       if (b.InstanceStartTime != null) {\r
+               btime = b.InstanceStartTime;\r
        }\r
-       else if (b['StartTime'] != null) {\r
-               btime = b['StartTime'];\r
+       else if (b.StartTime != null) {\r
+               btime = b.StartTime;\r
        }\r
-       else if (b['InstanceEndTime'] != null) {\r
-               btime = b['InstanceEndTime'];\r
+       else if (b.InstanceEndTime != null) {\r
+               btime = b.InstanceEndTime;\r
        }\r
-       else if (b['EndTime'] != null) {\r
-               btime = b['EndTime'];\r
+       else if (b.EndTime != null) {\r
+               btime = b.EndTime;\r
        }\r
        \r
        if (atime && btime) {\r
@@ -1281,27 +1312,28 @@ function sortCalendarEntries(a, b)
                        return 1;\r
                }\r
                // sort by type\r
-               else if (a['Type'] != b['Type']) {\r
-                       if (a['Type'] < b['Type']) {\r
+               else if (a.Type != b.Type) {\r
+                       if (a.Type < b.Type) {\r
                                return -1;\r
                        }\r
-                       else if (a['Type'] > b['Type']) {\r
+                       else if (a.Type > b.Type) {\r
                                return 1;\r
                        }\r
                }\r
                // sort by description\r
-               else if (a['Summary'] && b['Summary'] && a['Summary'] != b['Summary']) {\r
-                       if (a['Summary'] < b['Summary']) {\r
+               else if (a.Summary && b.Summary && a.Summary != b.Summary) {\r
+                       if (a.Summary < b.Summary) {\r
                                return -1;\r
                        }\r
-                       else if (a['Summary'] > b['Summary']) {\r
+                       else if (a.Summary > b.Summary) {\r
                                return 1;\r
                        }\r
-               }               \r
+               }\r
        }\r
 \r
        return 0;\r
 }\r
+\r
 </script>\r
 \r
 <style type="text/css">\r