X-Git-Url: https://code.delx.au/comingnext/blobdiff_plain/c7d441e6fc54e9d217fd8176feccc209609b9e7d..45222308767fa2fe90c3bf34142941ef36503fc4:/comingNext/index.html diff --git a/comingNext/index.html b/comingNext/index.html index 4962121..1698a4b 100644 --- a/comingNext/index.html +++ b/comingNext/index.html @@ -7,23 +7,23 @@ @@ -56,7 +56,8 @@ var config = { daylightSavingOffset: { Type: 'Int', Default: 1, Value: 1,}, hideWidgetOnCalendarOpen: { Type: 'Bool', Default: false, Value: false,}, showCalendarIndicator: { Type: 'Bool', Default: true, Value: true,}, - excludedCalendars: { Type: 'Array', Default: '', Value: '',}, + excludedCalendars: { Type: 'Array', Default: [], Value: [],}, + enableLogging: { Type: 'Bool', Default: false, Value: false,}, cssStyle_background: { Type: 'String', Default: 'color:#ffffff; background-color:#000000', Value: 'color:#ffffff; background-color:#000000',}, cssStyle_backgroundFullscreen: { Type: 'String', Default: 'color:#ffffff; background-color:#000000', Value: 'color:#ffffff; background-color:#000000',}, cssStyle_weekDay: { Type: 'String', Default: '', Value: '',}, @@ -82,11 +83,12 @@ var config = { // Nothing of interest from here on... //------------------------------------------------------- var panelNum = 0; // use 1 for second panel -var version = "1.31"; +var version = "1.37"; var versionURL = "http://comingnext.sourceforge.net/version.xml"; var calendarService = null; var cacheEntriesHtml = []; var months_translated = []; +var weekdays_translated = []; var orientation = ''; var now = new Date(); var mode = 0; // 0 = homescreen, 1 = fullscreen, 2 = settings, 3 = about, 4 = check for update @@ -98,6 +100,14 @@ var calendarList = []; var calendarColors = []; var updateTimer = null; var screenRotationTimer = null; +var lastUpdateTime = now; // last time we updated the display +var lastReloadTime = null; // last time we fetched calendar data +var reloadInterval = 6 * 60 * 60 * 1000; // = 6 hours; time interval for reloading calendar data +var errorOccured = false; +var entryLists = null; // stores all fetched calendar entries until data is refreshed +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. +var use12hoursTimeFormat = false; // defines how time should be formated: 19:00 or 07:00 pm +var timeFormatSeparator = ":"; // format time 19:00 or 19.00 depending on system setting // vars for daylight saving time var summertime = false; // true, if current date is in summer, false if in winter @@ -117,17 +127,13 @@ var entryFields = [ "InstanceEndTime" ]; -window.onload = init; -window.onresize = updateScreen; -window.onshow = updateScreen; - function isLeapYear( year ) { if (( year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0 ) return true; else return false; } - + function calcLeapYear(year, days) { if (isLeapYear(year)) @@ -192,6 +198,9 @@ function error(message) { console.info('Error: ' + message); document.getElementById("calendarList").innerHTML = 'Error: ' + message; + document.getElementById("fullscreenCalendarList").innerHTML = 'Error: ' + message; + errorOccured = true; + document.onclick = null; } function areDatesEqual(date1, date2) @@ -235,7 +244,27 @@ function collectLocales() try { var result = calendarService.IDataSource.Add(criteria); if (result.ErrorCode) - error(result.ErrorMessage); + throw(result.ErrorMessage); + } catch (e) { + error("collectLocales: " + e + ', line ' + e.line); + } + } + for (weekday = 0; weekday < 7; weekday++) { + var startDate = new Date(2000, 0, 2 + weekday); // date that we know for sure is a sunday + + var item = new Object(); + item.Type = "DayEvent"; + item.StartTime = startDate; + item.Summary = "__weekday_temp" + weekday; + + var criteria = new Object(); + criteria.Type = "CalendarEntry"; + criteria.Item = item; + + try { + var result = calendarService.IDataSource.Add(criteria); + if (result.ErrorCode) + throw(result.ErrorMessage); } catch (e) { error("collectLocales: " + e + ', line ' + e.line); } @@ -253,13 +282,11 @@ function collectLocales() } } var result = calendarService.IDataSource.GetList(listFiltering); - if (result.ErrorCode) { - error(result.ErrorMessage); - return; - } + if (result.ErrorCode) + throw(result.ErrorMessage); var list = result.ReturnValue; } catch(e) { - error(e + ', line ' + e.line); + error("collectLocales: " + e + ', line ' + e.line); return; } var ids = new Array(); @@ -269,7 +296,7 @@ function collectLocales() var dateArr = []; while (list && (entry = list.getNext()) != undefined) { - dateArr = entry.StartTime.replace(/,/g,'').replace(/\./g,':').replace(/ /g,' ').split(' '); + dateArr = (entry.StartTime + '').replace(/,/g,'').replace(/\./g,':').replace(/ /g,' ').split(' '); var day = dateArr[1]; var month = dateArr[2]; var year = dateArr[3]; @@ -285,16 +312,53 @@ function collectLocales() month = tmp; } - console.info(entry.StartTime + ' -> ' + month + ' ' + counter); + log(entry.StartTime + ' -> ' + month + ' ' + counter); ids[counter] = entry.id; months_translated[month] = counter + 1; counter++; } } catch(e) { - error(e + ', line ' + e.line); + error("collectLocales: " + e + ', line ' + e.line); return; } - console.info(ids); + try { + var startTime = new Date(2000,0,2); + var endTime = new Date(2000,0,9); + var listFiltering = { + Type:'CalendarEntry', + Filter:{ + StartRange: startTime, + EndRange: endTime, + SearchText: '__weekday_temp', + Type: 'DayEvent' + } + } + var result = calendarService.IDataSource.GetList(listFiltering); + if (result.ErrorCode) + throw(result.ErrorMessage); + var weekdaylist = result.ReturnValue; + } catch(e) { + error("collectLocales: " + e + ', line ' + e.line); + return; + } + try { + var entry; + var counter2 = 0; + var curWeekday = ""; + + while (weekdaylist && (entry = weekdaylist.getNext()) != undefined) { + detectTimeFormat(entry.StartTime + ''); + curWeekday = (entry.StartTime + '').split(',')[0]; + log(entry.StartTime + ' -> ' + curWeekday + ' ' + counter2); + ids[counter + counter2] = entry.id; + weekdays_translated[counter2] = curWeekday; + counter2++; + } + } catch(e) { + error("collectLocales: " + e + ', line ' + e.line); + return; + } + log(ids); try { var criteria = new Object(); criteria.Type = "CalendarEntry"; @@ -304,13 +368,26 @@ function collectLocales() var result = calendarService.IDataSource.Delete(criteria); if (result.ErrorCode) - error(result.ErrorMessage); + throw(result.ErrorMessage); } catch(e) { error('deleting temp calendar entries:' + e + ', line ' + e.line); return; } } +function stringEndsWith(str, suffix) +{ + return str.indexOf(suffix, str.length - suffix.length) !== -1; +} + +// detects the system's current time format by parsing a native calendar timestamp (this is the only reliable formating across all devices and firmwares) +function detectTimeFormat(localeTimeString) +{ + localeTimeString = localeTimeString.toLowerCase(); + use12hoursTimeFormat = stringEndsWith(localeTimeString, "am") || stringEndsWith(localeTimeString, "pm"); + timeFormatSeparator = localeTimeString.indexOf(":") != -1 ? ":" : "."; +} + function requestNotification() { var criteria = new Object(); @@ -358,13 +435,14 @@ function cancelNotification() function callback(transId, eventCode, result) { - console.info("callback(): panelNum: %d transId: %d eventCode: %d result.ErrorCode: %d", panelNum, transId, eventCode, result.ErrorCode); + log("callback(): panelNum: " + panelNum + " transId: " + transId + " eventCode: " + eventCode + " result.ErrorCode: " + result.ErrorCode); + lastReloadTime = null; // force calendar data reload on next update updateData(); } function settingsCallback(transId, eventCode, result) { - console.info("settingsCallback(): panelNum: %d transId: %d eventCode: %d result.ErrorCode: %d", panelNum, transId, eventCode, result.ErrorCode); + log("settingsCallback(): panelNum: " + panelNum + " transId: " + transId + " eventCode: " + eventCode + " result.ErrorCode: " + result.ErrorCode); loadSettings(); } @@ -379,49 +457,58 @@ function parseDate(dateString) Wednesday, 2009 August, 28 8.00.00 pm Wednesday, 2009 August, 28 08:00:00 PM */ + var result = null; - if (dateString == "" || dateString == null) - return null; - var dateArr = dateString.replace(/,/g,'').replace(/\./g,':').replace(/ /g,' ').split(' '); - if (dateArr.length != 5 && dateArr.length != 6) - return null; - - // parse date - var weekDay = dateArr[0]; - var day = dateArr[1]; - var month = dateArr[2]; - var year = dateArr[3]; - // make sure month is set properly - if (isNaN(parseInt(day))) { - var tmp = day; - day = month; - month = tmp; - } else if (isNaN(parseInt(year))) { - var tmp = year; - year = month; - month = tmp; + if (dateString == "" || dateString == null || dateString == undefined) + return result; + if (dateString instanceof Date) { + // we already have a date object, no need to parse string here + result = dateString; } - // make sure day and year are set properly - if (Number(day) > Number(year)) { - var tmp = year; - year = day; - day = tmp; + else { + var dateArr = (dateString + '').replace(/,/g, '').replace(/\./g, ':').replace(/ /g, ' ').split(' '); + if (dateArr.length != 5 && dateArr.length != 6) + return null; + + // parse date + var weekDay = dateArr[0]; + var day = dateArr[1]; + var month = dateArr[2]; + var year = dateArr[3]; + // make sure month is set properly + if (isNaN(parseInt(day))) { + var tmp = day; + day = month; + month = tmp; + } + else + if (isNaN(parseInt(year))) { + var tmp = year; + year = month; + month = tmp; + } + // make sure day and year are set properly + if (Number(day) > Number(year)) { + var tmp = year; + year = day; + day = tmp; + } + month = months_translated[month]; + + // parse time + var timeArr = dateArr[4].split(':'); + if (timeArr.length != 3) + return null; + var hours = Number(timeArr[0]); + var minutes = Number(timeArr[1]); + var seconds = Number(timeArr[2]); + if (dateArr.length == 6 && dateArr[5].toLowerCase() == 'pm' && hours < 12) + hours += 12; + if (dateArr.length == 6 && dateArr[5].toLowerCase() == 'am' && hours == 12) + hours = 0; + + result = new Date(year, month - 1, day, hours, minutes, seconds); } - month = months_translated[month]; - - // parse time - var timeArr = dateArr[4].split(':'); - if (timeArr.length != 3) - return null; - var hours = Number(timeArr[0]); - var minutes = Number(timeArr[1]); - var seconds = Number(timeArr[2]); - if (dateArr.length == 6 && dateArr[5].toLowerCase() == 'pm' && hours < 12) - hours += 12; - if (dateArr.length == 6 && dateArr[5].toLowerCase() == 'am' && hours == 12) - hours = 0; - - var result = new Date(year, month - 1, day, hours, minutes, seconds); // take care of daylight saving time if (config['enableDaylightSaving'].Value) { @@ -432,17 +519,25 @@ function parseDate(dateString) // work around bug in Nokias calendar api resulting in dates within a different DST to be off by 1 hour if (summertime && !dateSummerTime) { result = new Date(result.getTime() - 1000 * 60 * 60 * config['daylightSavingOffset'].Value); // -1 hour - console.info('parseDate(): fixing time -1h: ' + result); + log('parseDate(): fixing time -1h: ' + result); } else if (!summertime && dateSummerTime) { result = new Date(result.getTime() + 1000 * 60 * 60 * config['daylightSavingOffset'].Value); // +1 hour - console.info('parseDate(): fixing time +1h: ' + result); + log('parseDate(): fixing time +1h: ' + result); } } return result; } +function getWeekdayLocalized(date) { + var localizedString = date.toLocaleDateString(); + if (localizedString.indexOf(",") == -1) { + return weekdays_translated[date.getDay()]; + } else + return localizedString.split(',')[0]; +} + // 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" function formatDate(date, format) { @@ -456,6 +551,13 @@ function formatDate(date, format) if (config['showTodayAsText'].Value && isTomorrow(date)) return '' + config['tomorrowText'].Value + ''; + if (format instanceof Date) { + // we don't know how to format this + if (config['dateFormat'].Value == 'auto' || config['dateFormat'].Value == 'DDMM') + return day + config['dateSeparator'].Value + month; + else + return month + config['dateSeparator'].Value + day; + } var dateArr = format.replace(/,/g,'').replace(/\./g,':').replace(/ /g,' ').split(' '); if (dateArr.length != 5 && dateArr.length != 6) { // we don't know how to format this @@ -502,85 +604,128 @@ function formatDate(date, format) function formatTime(date) { // date is a Date() object - date.setSeconds(0); // we don't care about seconds - var time = date.toLocaleTimeString().replace(/[\.:]00/, ''); // remove seconds from string - if (time.replace(/\./, ':').split(':')[0].length < 2) - time = '0' + time; + var hour = date.getHours(); + var minute = date.getMinutes(); + + // don't use Date().toLocaleTimeString() as it is utterly broken on newer firmwares + if (use12hoursTimeFormat) { + var ap = "AM"; + if (hour > 11) + ap = "PM"; + if (hour > 12) + hour = hour - 12; + if (hour == 0) + hour = 12; + if (hour < 10) + hour = "0" + hour; + if (minute < 10) + minute = "0" + minute; + time = hour + timeFormatSeparator + minute + " " + ap; + } + else { + if (hour < 10) + hour = "0" + hour; + if (minute < 10) + minute = "0" + minute; + time = hour + timeFormatSeparator + minute; + } + if (config['showNowAsText'].Value && date.getTime() == now.getTime()) time = '' + config['nowText'].Value + ''; + log("formatTime(): " + time + ", use12hoursTimeFormat=" + use12hoursTimeFormat + ", timeFormatSeparator=" + timeFormatSeparator + ", date.toLocateTimeString(): " + date.toLocaleTimeString()); return time; } function updateData() { - console.info('updateData()'); + log('updateData()'); + if (errorOccured) { + return; + } // check if we got additional or less calendars since our last update var newCalendarList = listCalendars(); + if (newCalendarList == null) { + // Something went wrong fetching the calendars list. + // This usually happens when a backup is being made. + // Retry the next time updateData() is called by + // resetting errorOccured + log('updateData(): listCalendars() failed, trying again later...'); + cacheEntriesHtml = ''; // make sure we replace the currently shown error message on the next update + errorOccured = false; + return; + } if (newCalendarList.length != calendarList.length) { calendarList = newCalendarList; updateCalendarColors(); cancelNotification(); requestNotification(); + lastReloadTime = null; // force calendar data reload on this update } - - try { - // meetings have time - // 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 - now = new Date(); - summertime = isSummertime(now); // cache summer time info for today - var meetingList = []; - for(var i=0; i < calendarList.length; i++) { - // ignore excluded calendars - if (config['excludedCalendars'].Value.indexOf(calendarList[i]) != -1) - continue; - var meetingListFiltering = { - Type:'CalendarEntry', - Filter:{ - CalendarName: calendarList[i], - StartRange: (new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0)), - EndRange: (new Date(now.getFullYear(), now.getMonth() + config['monthRange'].Value, now.getDate(), 0, 0, 0)) - } - } - var meetingResult = calendarService.IDataSource.GetList(meetingListFiltering); - if (meetingResult.ErrorCode != 0) - throw("Error fetching calendar data: " + meetingResult.ErrorCode + ': ' + meetingResult.ErrorMessage); - var list = meetingResult.ReturnValue; - meetingList = meetingList.concat(listToArray(list, calendarList[i])); - } - console.info("updateData(): meetingList.sort()"); - meetingList.sort(sortCalendarEntries); - // todos don't, they start on 00:00 hrs., but should be visible anyway - // this will generate a list of passed todos. We have to check if they have been marked as "done" yet - if (config['includeTodos'].Value) { - var todayTodoList = []; + now = new Date(); + + // only reload calendar data every 6 hours, visual updates occure more often + if (!lastReloadTime || now.getTime() - lastReloadTime.getTime() > reloadInterval) { + log('updateData(): reloading calendar data'); + try { + // meetings have time + // 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 + summertime = isSummertime(now); // cache summer time info for today + var meetingList = []; for(var i=0; i < calendarList.length; i++) { // ignore excluded calendars if (config['excludedCalendars'].Value.indexOf(calendarList[i]) != -1) continue; - var todayTodoListFiltering = { + var meetingListFiltering = { Type:'CalendarEntry', Filter:{ CalendarName: calendarList[i], - Type: 'ToDo', - StartRange: (new Date(now.getFullYear() - 1, now.getMonth(), now.getDate(), 0, 0, 0)), - EndRange: (new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 1)) + StartRange: (new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0)), + EndRange: (new Date(now.getFullYear(), now.getMonth() + config['monthRange'].Value, now.getDate(), 0, 0, 0)) } } - var todayTodoResult = calendarService.IDataSource.GetList(todayTodoListFiltering); - var list = todayTodoResult.ReturnValue; - todayTodoList = todayTodoList.concat(listToArray(list, calendarList[i])); + var meetingResult = calendarService.IDataSource.GetList(meetingListFiltering); + if (meetingResult.ErrorCode != 0) + throw("Error fetching calendar data: " + meetingResult.ErrorCode + ': ' + meetingResult.ErrorMessage); + var list = meetingResult.ReturnValue; + meetingList = meetingList.concat(listToArray(list, calendarList[i])); } - console.info("updateData(): todayTodoList.sort()"); - todayTodoList.sort(sortCalendarEntries); - var entryLists = [todayTodoList, meetingList]; - } else { - var entryLists = [meetingList]; + log("updateData(): meetingList.sort()"); + meetingList.sort(sortCalendarEntries); + + // todos don't, they start on 00:00 hrs., but should be visible anyway + // this will generate a list of passed todos. We have to check if they have been marked as "done" yet + if (config['includeTodos'].Value) { + var todayTodoList = []; + for(var i=0; i < calendarList.length; i++) { + // ignore excluded calendars + if (config['excludedCalendars'].Value.indexOf(calendarList[i]) != -1) + continue; + var todayTodoListFiltering = { + Type:'CalendarEntry', + Filter:{ + CalendarName: calendarList[i], + Type: 'ToDo', + StartRange: (new Date(now.getFullYear() - 1, now.getMonth(), now.getDate(), 0, 0, 0)), + EndRange: (new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 1)) + } + } + var todayTodoResult = calendarService.IDataSource.GetList(todayTodoListFiltering); + var list = todayTodoResult.ReturnValue; + todayTodoList = todayTodoList.concat(listToArray(list, calendarList[i])); + } + log("updateData(): todayTodoList.sort()"); + todayTodoList.sort(sortCalendarEntries); + entryLists = [todayTodoList, meetingList]; + } else { + entryLists = [meetingList]; + } + lastReloadTime = new Date(); + } catch(e) { + error('loading Calendar items list:' + e + ', line ' + e.line); + return; } - } catch(e) { - error('loading Calendar items list:' + e + ', line ' + e.line); - return; } try { @@ -589,23 +734,26 @@ function updateData() var entryDate = ''; var dateArr = []; var fontsize = 'normal'; + var lineheight = 'normal'; if (mode == 0) { + fontsize = parseInt(72 / config['eventsPerWidget'].Value) + 'px'; + lineheight = parseInt(82 / config['eventsPerWidget'].Value) + 'px'; + if (config['eventsPerWidget'].Value == 3) { - fontsize = '17pt'; changeCssClass('.icon', 'width:20px; height:20px'); } else if (config['eventsPerWidget'].Value == 5) { - fontsize = '10pt'; changeCssClass('.icon', 'width:10px; height:10px'); } else if (config['eventsPerWidget'].Value == 6) { - fontsize = '8pt'; changeCssClass('.icon', 'width:8px; height:8px'); } } else changeCssClass('.icon', config['cssStyle_icon'].Value); - var entriesHtml = '
' + entriesHtml; // this is needed to center the actual content vertically var eventIds = []; var max; if (mode == 0) @@ -613,16 +761,18 @@ function updateData() else max = 30; // we can display a lot more events in fullscreen mode - var listinfo = ""; - for (var i=0; i < entryLists.length; i++) { - listinfo = listinfo + " " + entryLists[i].length; - var entrieslist = ""; - for (var j=0; j < entryLists[i].length; j++) { - entrieslist += entryLists[i][j].Summary + ", "; + if (config['enableLogging'].Value) { + var listinfo = ""; + for (var i=0; i < entryLists.length; i++) { + listinfo = listinfo + " " + entryLists[i].length; + var entrieslist = ""; + for (var j=0; j < entryLists[i].length; j++) { + entrieslist += entryLists[i][j].Summary + ", "; + } + log("updateData(): entrieslist: " + entrieslist); } - console.info("updateData(): entrieslist: " + entrieslist); + log("updateData(): inner loop, " + entryLists.length + " lists, [" + listinfo + "] entries"); } - console.info("updateData(): inner loop, " + entryLists.length + " lists, [" + listinfo + "] entries"); // the first outer loop iteration is for passed ToDos, the second loop is for all upcomming events (may also include ToDos) for (var i=0; counter < max && i < entryLists.length; i++) { @@ -637,18 +787,18 @@ function updateData() entryInfo += entryFields[k] + "=" + entry[entryFields[k]] + ","; } } - console.info(entryInfo); + log(entryInfo); // we don't want ToDos when includeTodos == false or when they are completed if (entry.Type == 'ToDo' && (entry.Status == "TodoCompleted" || !config['includeTodos'].Value)) { - console.info('skipping ' + entry.id ); + log('skipping ' + entry.id ); counter--; continue; } // make sure that we don't include an event twice (useful for ToDos that might come up twice) if (eventIds[entry.id] == 1 && entry.Type == 'ToDo') { - console.info('skipped (already included) ' + entry.id); + log('skipped (already included) ' + entry.id); counter--; continue; } else @@ -656,7 +806,7 @@ function updateData() // summary can be undefined! var Summary = ((entry.Summary == null) ? '' : entry.Summary); - if (entry.Type == 'Meeting' && entry.Location != '' && config['showLocation'].Value) + if (entry.Location != '' && entry.Location != undefined && config['showLocation'].Value) Summary += ', ' + entry.Location; // fix by yves: determine start and end dates/times @@ -671,15 +821,23 @@ function updateData() // Convert date/time string to Date object var date = parseDate(entryDate); - console.info('date: ' + date); + log('date: ' + date); var endDate = ((entryEndTime == null) ? null : parseDate(entryEndTime)); - console.info('endDate: ' + endDate); + log('endDate: ' + endDate); + + // check if Meeting is actually a DayEvent. Bug introduced by "Anna" updates to various Symbian^3 devices. + // Note that this workaround is not 100% save! It might missinterpret some meetings as dayevents of starting and ending on 00:00 + if (entry.Type == 'Meeting' && date.getHours() == 0 && date.getMinutes() == 0 && + endDate != null && endDate.getHours() == 0 && endDate.getMinutes() == 0) { + log('fixing event type: changed from "Meeting" to "DayEvent".'); + entry.Type = 'DayEvent'; + } // check if meeting event has already passed if (entry.Type == 'Meeting') { var compareTime = ((endDate == null) ? date.getTime() : endDate.getTime()); if (now.getTime() > compareTime) { - console.info('skipping Meeting (already passed) ' + entry.id); + log('skipping Meeting (already passed) ' + entry.id); counter--; eventIds[entry.id] = 0; continue; @@ -690,7 +848,7 @@ function updateData() if (entry.Type == 'Anniversary') { var tmp = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0,0,0); if (date.getTime() < tmp.getTime()) { - console.info('skipping Anniversary (already passed) ' + entry.id); + log('skipping Anniversary (already passed) ' + entry.id); counter--; eventIds[entry.id] = 0; continue; @@ -700,9 +858,9 @@ function updateData() // fix DayEvents end time. End times are off by 1 Second. It's possible that the event has already passed if (entry.Type == 'DayEvent' && endDate != null) { endDate.setMinutes(endDate.getMinutes() - 1); - console.info('fixing DayEvent endDate: ' + endDate); + log('fixing DayEvent endDate: ' + endDate); if (now.getTime() > endDate.getTime()) { - console.info('event already passed ' + entry.id); + log('event already passed ' + entry.id); counter--; eventIds[entry.id] = 0; continue; @@ -714,13 +872,13 @@ function updateData() // check if we are between start and endtime if ((date.getTime() < now.getTime()) && (now.getTime() < endDate.getTime())) { date = now; // change appointment date/time to now - console.info('event is currently taking place: ' + date); + log('event is currently taking place: ' + date); } } // skip events for the first panel in case this is the second one and we're not in fullscreen mode if (mode == 0 && panelNum > 0 && counter < panelNum * config['eventsPerWidget'].Value + 1) { - console.info('skipping (already in first widget) ' + entry.id); + log('skipping (already in first widget) ' + entry.id); continue; } @@ -744,7 +902,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. entriesHtml += ' | ' + entryDate + ' '; } else { - var weekDay = date.toLocaleDateString().substr(0,config['weekDayLength'].Value); + var weekDay = getWeekdayLocalized(date).substr(0,config['weekDayLength'].Value); + log('date.toLocaleDateString(): ' + date.toLocaleDateString()); + log('weekDay: ' + weekDay); var time = formatTime(date); var dateStr = formatDate(date, entryDate); if (entry.Type == 'ToDo' && overdue && config['markOverdueTodos'].Value) { @@ -775,10 +935,13 @@ function updateData() } } entriesHtml += ' |