X-Git-Url: https://code.delx.au/comingnext/blobdiff_plain/517fcfd1ef1214752d9e9793d25b95fa18bdb119..037e8550464756cb214edef5d9d9174719c763fb:/comingNext/index.html diff --git a/comingNext/index.html b/comingNext/index.html index c085646..015dbae 100644 --- a/comingNext/index.html +++ b/comingNext/index.html @@ -7,23 +7,23 @@ @@ -57,7 +57,7 @@ var config = { hideWidgetOnCalendarOpen: { Type: 'Bool', Default: false, Value: false,}, showCalendarIndicator: { Type: 'Bool', Default: true, Value: true,}, excludedCalendars: { Type: 'Array', Default: [], Value: [],}, - enableLogging: { Type: 'Bool', Default: false, Value: false,}, + 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: '',}, @@ -83,11 +83,12 @@ var config = { // Nothing of interest from here on... //------------------------------------------------------- var panelNum = 0; // use 1 for second panel -var version = "1.32"; +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 @@ -99,11 +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 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 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 @@ -129,7 +133,7 @@ function isLeapYear( year ) { else return false; } - + function calcLeapYear(year, days) { if (isLeapYear(year)) @@ -240,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); } @@ -258,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(); @@ -274,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]; @@ -290,16 +312,53 @@ function collectLocales() month = tmp; } - log(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; } - log(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"; @@ -309,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(); @@ -363,14 +435,14 @@ function cancelNotification() function callback(transId, eventCode, result) { - log("callback(): panelNum: " + panelNum + " transId: " + transId + " eventCode: " + eventCode + " result.ErrorCode: " + result.ErrorCode); - lastReloadTime = null; // force calendar data reload on next update + 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) { - log("settingsCallback(): panelNum: " + panelNum + " transId: " + transId + " eventCode: " + eventCode + " result.ErrorCode: " + result.ErrorCode); + log("settingsCallback(): panelNum: " + panelNum + " transId: " + transId + " eventCode: " + eventCode + " result.ErrorCode: " + result.ErrorCode); loadSettings(); } @@ -385,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) { @@ -438,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 - log('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 - log('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) { @@ -462,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 @@ -508,94 +604,127 @@ 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() { - log('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 + lastReloadTime = null; // force calendar data reload on this update } - 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 = []; + 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 meetingListFiltering = { + 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])); - } - 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)) - } + 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])); } - log("updateData(): todayTodoList.sort()"); - todayTodoList.sort(sortCalendarEntries); - entryLists = [todayTodoList, meetingList]; - } else { - entryLists = [meetingList]; + 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])); } - lastReloadTime = new Date(); - } catch(e) { - error('loading Calendar items list:' + e + ', line ' + e.line); - return; + 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; } } @@ -605,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) @@ -629,17 +761,17 @@ function updateData() else max = 30; // we can display a lot more events in fullscreen mode - 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); + 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); } - log("updateData(): inner loop, " + entryLists.length + " lists, [" + listinfo + "] entries"); + log("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) @@ -655,18 +787,18 @@ function updateData() entryInfo += entryFields[k] + "=" + entry[entryFields[k]] + ","; } } - log(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)) { - log('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') { - log('skipped (already included) ' + entry.id); + log('skipped (already included) ' + entry.id); counter--; continue; } else @@ -674,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 @@ -689,15 +821,23 @@ function updateData() // Convert date/time string to Date object var date = parseDate(entryDate); - log('date: ' + date); + log('date: ' + date); var endDate = ((entryEndTime == null) ? null : parseDate(entryEndTime)); - log('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) { - log('skipping Meeting (already passed) ' + entry.id); + log('skipping Meeting (already passed) ' + entry.id); counter--; eventIds[entry.id] = 0; continue; @@ -708,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()) { - log('skipping Anniversary (already passed) ' + entry.id); + log('skipping Anniversary (already passed) ' + entry.id); counter--; eventIds[entry.id] = 0; continue; @@ -718,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); - log('fixing DayEvent endDate: ' + endDate); + log('fixing DayEvent endDate: ' + endDate); if (now.getTime() > endDate.getTime()) { - log('event already passed ' + entry.id); + log('event already passed ' + entry.id); counter--; eventIds[entry.id] = 0; continue; @@ -732,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 - log('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) { - log('skipping (already in first widget) ' + entry.id); + log('skipping (already in first widget) ' + entry.id); continue; } @@ -762,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) { @@ -793,10 +935,13 @@ function updateData() } } entriesHtml += ' |