]> code.delx.au - comingnext/blobdiff - comingNext/index.html
fixed time bug which introduced by previous workaround
[comingnext] / comingNext / index.html
index e02a4845a3faf5925e32f0961fa8a887d9263d22..992da2376cbf14ebb9eb6af2fe29ed771301863c 100644 (file)
@@ -88,6 +88,7 @@ var versionURL = "http://comingnext.sourceforge.net/version.xml";
 var calendarService = null;\r
 var cacheEntriesHtml = [];\r
 var months_translated = [];\r
+var weekdays_translated = [];\r
 var orientation = '';\r
 var now = new Date();\r
 var mode = 0; // 0 = homescreen, 1 = fullscreen, 2 = settings, 3 = about, 4 = check for update\r
@@ -104,6 +105,8 @@ var lastReloadTime = null; // last time we fetched calendar data
 var reloadInterval = 6 * 60 * 60 * 1000; // = 6 hours; time interval for reloading calendar data\r
 var errorOccured = false;\r
 var entryLists = null; // stores all fetched calendar entries until data is refreshed\r
+var statupSuccessful = false; // indicates if everything started up wihtout errors. If we detect an error after that, it might just be a temporary problem e.g. by a backup process.\r
+var use12hoursTimeFormat = false; // defines how time should be formated: 19:00 or 07:00 pm\r
 \r
 // vars for daylight saving time\r
 var summertime = false; // true, if current date is in summer, false if in winter\r
@@ -240,7 +243,27 @@ function collectLocales()
                try {\r
                        var result = calendarService.IDataSource.Add(criteria);\r
                        if (result.ErrorCode)\r
-                               error(result.ErrorMessage);\r
+                               throw(result.ErrorMessage);\r
+               } catch (e) {\r
+                       error("collectLocales: " + e + ', line ' + e.line);\r
+               }\r
+       }\r
+       for (weekday = 0; weekday < 7; weekday++) {\r
+               var startDate = new Date(2000, 0, 2 + weekday); // date that we know for sure is a sunday\r
+\r
+               var item = new Object();\r
+               item.Type = "DayEvent";\r
+               item.StartTime = startDate;\r
+               item.Summary = "__weekday_temp" + weekday;\r
+\r
+               var criteria = new Object();\r
+               criteria.Type = "CalendarEntry";\r
+               criteria.Item = item;\r
+\r
+               try {\r
+                       var result = calendarService.IDataSource.Add(criteria);\r
+                       if (result.ErrorCode)\r
+                               throw(result.ErrorMessage);\r
                } catch (e) {\r
                        error("collectLocales: " + e + ', line ' + e.line);\r
                }\r
@@ -262,7 +285,7 @@ function collectLocales()
                        throw(result.ErrorMessage);\r
                var list = result.ReturnValue;\r
        } catch(e) {\r
-               error(e + ', line ' + e.line);\r
+               error("collectLocales: " + e + ', line ' + e.line);\r
                return;\r
        }\r
        var ids = new Array();\r
@@ -294,7 +317,43 @@ function collectLocales()
                        counter++;\r
                }\r
        } catch(e) {\r
-               error(e + ', line ' + e.line);\r
+               error("collectLocales: " + e + ', line ' + e.line);\r
+               return;\r
+       }\r
+       try {\r
+               var startTime = new Date(2000,0,2);\r
+               var endTime = new Date(2000,0,9);\r
+               var listFiltering = {\r
+                       Type:'CalendarEntry', \r
+                       Filter:{\r
+                               StartRange: startTime,\r
+                               EndRange: endTime,\r
+                               SearchText: '__weekday_temp',\r
+                               Type: 'DayEvent'\r
+                       }\r
+               }\r
+               var result = calendarService.IDataSource.GetList(listFiltering);\r
+               if (result.ErrorCode)\r
+                       throw(result.ErrorMessage);\r
+               var weekdaylist = result.ReturnValue;\r
+       } catch(e) {\r
+               error("collectLocales: " + e + ', line ' + e.line);\r
+               return;\r
+       }\r
+       try {\r
+               var entry;\r
+               var counter2 = 0;\r
+               var curWeekday = "";\r
+\r
+               while (weekdaylist && (entry = weekdaylist.getNext()) != undefined) {\r
+                       curWeekday = (entry.StartTime + '').split(',')[0];\r
+                       log(entry.StartTime + ' -> ' + curWeekday + ' ' + counter2);\r
+                       ids[counter + counter2] = entry.id;\r
+                       weekdays_translated[counter2] = curWeekday;\r
+                       counter2++;\r
+               }\r
+       } catch(e) {\r
+               error("collectLocales: " + e + ', line ' + e.line);\r
                return;\r
        }\r
        log(ids);\r
@@ -433,6 +492,10 @@ function parseDate(dateString)
                if (dateArr.length == 6 && dateArr[5].toLowerCase() == 'am' && hours == 12) \r
                        hours = 0;\r
                \r
+               // remember if date was formated using 12h time format, we need to use this information later when formating time\r
+               if (dateArr.length == 6 && (dateArr[5].toLowerCase() == 'am' || dateArr[5].toLowerCase() == 'pm'))\r
+                       use12hoursTimeFormat = true;\r
+\r
                result = new Date(year, month - 1, day, hours, minutes, seconds);\r
        }\r
        \r
@@ -456,6 +519,14 @@ function parseDate(dateString)
        return result;\r
 }\r
 \r
+function getWeekdayLocalized(date) {\r
+       var localizedString = date.toLocaleDateString();\r
+       if (localizedString.match(/\d\d\/\d\d\/\d\d/)) {\r
+               return weekdays_translated[date.getDay()];\r
+       } else\r
+               return localizedString.split(',')[0];\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 formatDate(date, format)\r
 {\r
@@ -526,6 +597,25 @@ function formatTime(date)
        var time = date.toLocaleTimeString().replace(/[\.:]00/, ''); // remove seconds from string\r
        if (time.replace(/\./, ':').split(':')[0].length < 2)\r
                time = '0' + time;\r
+\r
+       // workaround for bug introduced by Anna firmwares, which causes Date().toLocaleTimeString() to no longer return time in 12h format even though this has been defined in system settings\r
+       if (use12hoursTimeFormat && time.toLowerCase().indexOf('am') == -1 && time.toLowerCase().indexOf('pm') == -1) { \r
+               var hour = date.getHours();\r
+               var minute = date.getMinutes();\r
+               var ap = "AM";\r
+               if (hour > 11)\r
+                       ap = "PM";\r
+               if (hour > 12)\r
+                       hour = hour - 12;\r
+               if (hour == 0)\r
+                       hour = 12;\r
+               if (hour < 10)\r
+                       hour = "0" + hour;\r
+               if (minute < 10)\r
+                       minute = "0" + minute;\r
+               time = hour + ":" + minute + " " + ap;\r
+       }\r
+       \r
        if (config['showNowAsText'].Value && date.getTime() == now.getTime())\r
                time = '<span class="now">' + config['nowText'].Value + '</span>';\r
        return time;\r
@@ -540,6 +630,16 @@ function updateData()
 \r
        // check if we got additional or less calendars since our last update\r
        var newCalendarList = listCalendars();\r
+       if (newCalendarList == null) {\r
+               // Something went wrong fetching the calendars list.\r
+               // This usually happens when a backup is being made.\r
+               // Retry the next time updateData() is called by \r
+               // resetting errorOccured\r
+               log('updateData(): listCalendars() failed, trying again later...');\r
+               cacheEntriesHtml = ''; // make sure we replace the currently shown error message on the next update\r
+               errorOccured = false;\r
+               return;\r
+       }\r
        if (newCalendarList.length != calendarList.length) {\r
                calendarList = newCalendarList;\r
                updateCalendarColors();\r
@@ -706,6 +806,14 @@ function updateData()
                                log('date: ' + date);\r
                                var endDate = ((entryEndTime == null) ? null : parseDate(entryEndTime));\r
                                log('endDate: ' + endDate);\r
+                               \r
+                               // check if Meeting is actually a DayEvent. Bug introduced by "Anna" updates to various Symbian^3 devices.\r
+                               // Note that this workaround is not 100% save! It might missinterpret some meetings as dayevents of starting and ending on 00:00\r
+                               if (entry.Type == 'Meeting' && date.getHours() == 0 && date.getMinutes() == 0 && \r
+                                       endDate != null && endDate.getHours() == 0 && endDate.getMinutes() == 0) {\r
+                                       log('fixing event type: changed from "Meeting" to "DayEvent".');\r
+                                       entry.Type = 'DayEvent';\r
+                               }\r
 \r
                                // check if meeting event has already passed\r
                                if (entry.Type == 'Meeting') {\r
@@ -776,7 +884,9 @@ function updateData()
                                        // some languages have very strange locale date formats, can't parse all those. Also some todos don't have dates at all.\r
                                        entriesHtml += '<td colspan="4"><span class="date">' + entryDate + '</span> ';\r
                                } else {\r
-                                       var weekDay = date.toLocaleDateString().substr(0,config['weekDayLength'].Value);\r
+                                       var weekDay = getWeekdayLocalized(date).substr(0,config['weekDayLength'].Value);\r
+                                       log('date.toLocaleDateString(): ' + date.toLocaleDateString());\r
+                                       log('weekDay: ' + weekDay);\r
                                        var time = formatTime(date);\r
                                        var dateStr = formatDate(date, entryDate);\r
                                        if (entry.Type == 'ToDo' && overdue && config['markOverdueTodos'].Value) {\r
@@ -914,6 +1024,8 @@ function init()
        window.widget.onshow = handleOnShow;\r
 \r
        log("init(): finished...");\r
+       if (!errorOccured)\r
+               statupSuccessful = true;\r
 }\r
 \r
 function checkOrientation()\r
@@ -1086,9 +1198,14 @@ function getSettingsCalEntryId()
                                Type: 'DayEvent'\r
                        }\r
                }\r
-               var result = calendarService.IDataSource.GetList(listFiltering);\r
-               if (result.ErrorCode) {\r
-                       error(result.ErrorMessage);\r
+               var result = null;\r
+               try {\r
+                       result = calendarService.IDataSource.GetList(listFiltering);\r
+                       if (result.ErrorCode)\r
+                               throw(result.ErrorMessage);\r
+               }\r
+               catch (e) {\r
+                       error("getSettingsCalEntryId: GetList() failed: " + e + ', line ' + e.line);\r
                        return;\r
                }\r
                var list = result.ReturnValue;\r
@@ -1110,7 +1227,7 @@ function getSettingsCalEntryId()
                        try {\r
                                var result = calendarService.IDataSource.Add(criteria);\r
                                if (result.ErrorCode)\r
-                                       error(result.ErrorMessage);\r
+                                       throw(result.ErrorMessage);\r
                        } catch (e) {\r
                                error("getSettingsCalEntryId: " + e + ', line ' + e.line);\r
                        }\r
@@ -1135,9 +1252,14 @@ function loadSettings()
                        LocalId: settingsCalEntryId\r
                }\r
        }\r
-       var result = calendarService.IDataSource.GetList(listFiltering);\r
-       if (result.ErrorCode) {\r
-               error(result.ErrorMessage);\r
+       var result = null;\r
+       try     {\r
+               result = calendarService.IDataSource.GetList(listFiltering);\r
+               if (result.ErrorCode)\r
+                       throw(result.ErrorMessage);\r
+       }\r
+       catch (e) {\r
+               error("loadSettings: GetList() failed: " + e + ', line ' + e.line);\r
                return;\r
        }\r
        var entry = result.ReturnValue.getNext();\r
@@ -1226,7 +1348,7 @@ function saveSettings()
        try {\r
                var result = calendarService.IDataSource.Add(criteria);\r
                if (result.ErrorCode)\r
-                       error(result.ErrorMessage);\r
+                       throw(result.ErrorMessage);\r
        } catch (e) {\r
                error("saveSettings: " + e + ', line ' + e.line);\r
        }\r