X-Git-Url: https://code.delx.au/comingnext/blobdiff_plain/16c0fb97d87271e97f3b81bfce529be9c81fba18..2de56af5f6389b2bf02d40ff58cfd2f2be40188e:/comingNext/index.html diff --git a/comingNext/index.html b/comingNext/index.html index ce12153..d66fd29 100644 --- a/comingNext/index.html +++ b/comingNext/index.html @@ -47,6 +47,7 @@ var config = { showNothingText: { Type: 'Bool', Default: true, Value: true,}, nothingText: { Type: 'String', Default: getLocalizedText('settings.default.nothingText'), Value: getLocalizedText('settings.default.nothingText'),}, enableDaylightSaving: { Type: 'Bool', Default: true, Value: true,}, + daylightSavingOffset: { Type: 'Int', Default: 1, Value: 1,}, hideWidgetOnCalendarOpen: { 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',}, @@ -67,7 +68,7 @@ var config = { // Nothing of interest from here on... //------------------------------------------------------- var panelNum = 0; // use 1 for second panel -var version = "1.28"; +var version = "1.29"; var versionURL = "http://comingnext.sourceforge.net/version.xml"; var calendarService = null; var cacheEntriesHtml = []; @@ -83,9 +84,8 @@ var notificationRequest2; var calendarList = []; // vars for daylight saving time -var daylightsavingWinter = 0; -var daylightsavingSummer = 0; -var summertime = false; +var summertime = false; // true, if current date is in summer, false if in winter +var daylightSavingDates = new Object(); // caches calculated DST winter and summer time shift dates // this is a list of data fields a calendar event can have var entryFields = [ @@ -127,43 +127,48 @@ function subToSunday(myDate, year, days, prevMonthDays) days = isLeapYear(year) ? --days : days; return days; } - -function calcDaylightSaving() + +function isSummertime(curDate) { - var thisYearS = new Date(now.getFullYear(), 3, 0, 0, 0, 0 ); - var thisYearW = new Date(now.getFullYear(), 10, 0, 0, 0, 0 ); - var nextYearS = new Date(now.getFullYear() + 1, 3, 0, 0, 0, 0 ); - var nextYearW = new Date(now.getFullYear() + 1, 10, 0, 0, 0, 0 ); var summer = false; var winter = false; - - thisYearSDays = nextYearSDays = 90; - thisYearWDays = nextYearWDays = 304; - - thisYearSDays = calcLeapYear(now.getFullYear(), thisYearSDays); - thisYearWDays = calcLeapYear(now.getFullYear(), thisYearWDays); - nextYearSDays = calcLeapYear(now.getFullYear() + 1, nextYearSDays); - nextYearWDays = calcLeapYear(now.getFullYear() + 1, nextYearWDays); - - thisYearSDays = subToSunday(thisYearS, now.getFullYear(), thisYearSDays, 59); - thisYearWDays = subToSunday(thisYearW, now.getFullYear(), thisYearWDays, 273); - nextYearSDays = subToSunday(nextYearS, now.getFullYear() + 1, nextYearSDays, 59); - nextYearWDays = subToSunday(nextYearW, now.getFullYear() + 1, nextYearWDays, 273); - - daylightsavingSummer = new Date (now.getFullYear(), 03-1, thisYearSDays, 2, 0, 0); - daylightsavingWinter = new Date (now.getFullYear(), 10-1, thisYearWDays, 2, 0, 0); - if (daylightsavingSummer < now) { - daylightsavingSummer = new Date (now.getFullYear()+1, 03-1, nextYearSDays, 2, 0, 0); - var summer = true; - } - if (daylightsavingWinter < now) { - daylightsavingWinter = new Date (now.getFullYear()+1, 10-1, nextYearWDays, 2, 0, 0); - var winter = true; + + // if we already calculated DST summer and winter time dates for this year, use cached values + var dst = daylightSavingDates[curDate.getFullYear()]; + if (!dst) { + var thisYearS = new Date(curDate.getFullYear(), 3, 0, 0, 0, 0 ); + var thisYearW = new Date(curDate.getFullYear(), 10, 0, 0, 0, 0 ); + var nextYearS = new Date(curDate.getFullYear() + 1, 3, 0, 0, 0, 0 ); + var nextYearW = new Date(curDate.getFullYear() + 1, 10, 0, 0, 0, 0 ); + + thisYearSDays = nextYearSDays = 90; + thisYearWDays = nextYearWDays = 304; + + thisYearSDays = calcLeapYear(curDate.getFullYear(), thisYearSDays); + thisYearWDays = calcLeapYear(curDate.getFullYear(), thisYearWDays); + nextYearSDays = calcLeapYear(curDate.getFullYear() + 1, nextYearSDays); + nextYearWDays = calcLeapYear(curDate.getFullYear() + 1, nextYearWDays); + + thisYearSDays = subToSunday(thisYearS, curDate.getFullYear(), thisYearSDays, 59); + thisYearWDays = subToSunday(thisYearW, curDate.getFullYear(), thisYearWDays, 273); + nextYearSDays = subToSunday(nextYearS, curDate.getFullYear() + 1, nextYearSDays, 59); + nextYearWDays = subToSunday(nextYearW, curDate.getFullYear() + 1, nextYearWDays, 273); + + dst = { + Summer: new Date (curDate.getFullYear(), 03-1, thisYearSDays, 2, 0, 0), + Winter: new Date (curDate.getFullYear(), 10-1, thisYearWDays, 2, 0, 0), + } + daylightSavingDates[curDate.getFullYear()] = dst; } + + if (dst.Summer < curDate) + summer = true; + if (dst.Winter < curDate) + winter = true; if (summer && !winter) - summertime = true; + return true; else - summertime = false; + return false; } function error(message) @@ -382,18 +387,26 @@ function parseDate(dateString) if (dateArr.length == 6 && dateArr[5].toLowerCase() == 'am' && hours == 12) hours = 0; - console.info('year=' + year + ' month=' + month + ' day=' + day + ' hours=' + hours + ' minutes=' + minutes+ ' seconds=' + seconds); - + var result = new Date(year, month - 1, day, hours, minutes, seconds); + // take care of daylight saving time if (config['enableDaylightSaving'].Value) { - var date = new Date(year, month - 1, day, hours, minutes, seconds); - if (summertime && date > daylightsavingWinter && date < daylightsavingSummer) - hours -= 1; - else if (!summertime && date > daylightsavingSummer && date < daylightsavingWinter) - hours += 1; + + // determine if date is in summer or winter time + var dateSummerTime = isSummertime(result); + + // 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); + } + else if (!summertime && dateSummerTime) { + result = new Date(result.getTime() + 1000 * 60 * 60 * config['daylightSavingOffset'].Value); // +1 hour + console.info('parseDate(): fixing time +1h: ' + result); + } } - return new Date(year, month - 1, day, hours, minutes, seconds); + return result; } // 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" @@ -467,11 +480,11 @@ function formatTime(date) function updateData() { console.info('updateData()'); - calcDaylightSaving(); 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++) { var meetingListFiltering = { @@ -488,6 +501,7 @@ function updateData() var list = meetingResult.ReturnValue; meetingList = meetingList.concat(listToArray(list)); } + console.info("updateData(): meetingList.sort()"); meetingList.sort(sortCalendarEntries); // todos don't, they start on 00:00 hrs., but should be visible anyway @@ -508,6 +522,7 @@ function updateData() var list = todayTodoResult.ReturnValue; todayTodoList = todayTodoList.concat(listToArray(list)); } + console.info("updateData(): todayTodoList.sort()"); todayTodoList.sort(sortCalendarEntries); var entryLists = [todayTodoList, meetingList]; } else { @@ -548,6 +563,17 @@ 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 + ", "; + } + console.info("updateData(): entrieslist: " + entrieslist); + } + 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++) { for (var j=0; (counter < max) && (j < entryLists[i].length); j++) { @@ -555,17 +581,13 @@ function updateData() counter++; // output event info for debugging - console.info( - 'event: Id=' + entry.id + - ',Type=' + entry.Type + - ',Summary=' + entry.Summary + - ',Location=' + entry.Location + - ',Status=' + entry.Status + - ',StartTime=' + entry.StartTime + - ',EndTime=' + entry.EndTime + - ',InstanceStartTime=' + entry.InstanceStartTime + - ',InstanceEndTime=' + entry.InstanceEndTime - ); + var entryInfo = "event: "; + for(var k=0; k < entryFields.length; ++k) { + if (entry[entryFields[k]] != undefined) { + entryInfo += entryFields[k] + "=" + entry[entryFields[k]] + ","; + } + } + console.info(entryInfo); // we don't want ToDos when includeTodos == false or when they are completed if (entry.Type == 'ToDo' && (entry.Status == "TodoCompleted" || !config['includeTodos'].Value)) { @@ -778,10 +800,12 @@ function init() else { mode = 1; } + console.info("init(): updateScreen()"); updateScreen(); if (config['useBackgroundImage'].Value) // check for screen rotation every 1 secs window.setInterval('updateScreen()', 1000 * 1); + console.info("init(): finished..."); } function createMenu() @@ -959,6 +983,7 @@ function loadSettings() } var entry = result.ReturnValue.getNext(); if (entry != undefined) { + console.info("Loading Settings..."); // only reload settings if they chanced since the last reload if (settingsCache != entry.Summary) { @@ -984,6 +1009,9 @@ function loadSettings() settingsCache = entry.Summary; updateCssClasses(); } + else { + console.info("Settings already cached and did not change"); + } } else { error("Failed to load settings, calendar entry could not be found"); @@ -1067,6 +1095,7 @@ function updateFullscreen() function showFullscreen() { + console.info("showFullscreen()"); hideViews(); document.getElementById("fullscreenView").style.display = "block"; document.getElementById('body').className = "backgroundFullscreen"; @@ -1111,6 +1140,7 @@ function updateHomescreen() function showHomescreen() { + console.info("showHomescreen()"); hideViews(); document.getElementById("homescreenView").style.display = "block"; document.getElementById('body').className = "background"; @@ -1241,31 +1271,32 @@ function listToArray(list) function sortCalendarEntries(a, b) { var atime, btime; + console.info("sortCalendarEntries(" + a.Summary + "," + b.Summary + ")"); - if (a['InstanceStartTime'] != null) { - atime = a['InstanceStartTime']; + if (a.InstanceStartTime != null) { + atime = a.InstanceStartTime; } - else if (a['StartTime'] != null) { - atime = a['StartTime']; + else if (a.StartTime != null) { + atime = a.StartTime; } - else if (a['InstanceEndTime'] != null) { - atime = a['InstanceEndTime']; + else if (a.InstanceEndTime != null) { + atime = a.InstanceEndTime; } - else if (a['EndTime'] != null) { - atime = a['EndTime']; + else if (a.EndTime != null) { + atime = a.EndTime; } - if (b['InstanceStartTime'] != null) { - btime = b['InstanceStartTime']; + if (b.InstanceStartTime != null) { + btime = b.InstanceStartTime; } - else if (b['StartTime'] != null) { - btime = b['StartTime']; + else if (b.StartTime != null) { + btime = b.StartTime; } - else if (b['InstanceEndTime'] != null) { - btime = b['InstanceEndTime']; + else if (b.InstanceEndTime != null) { + btime = b.InstanceEndTime; } - else if (b['EndTime'] != null) { - btime = b['EndTime']; + else if (b.EndTime != null) { + btime = b.EndTime; } if (atime && btime) { @@ -1281,27 +1312,28 @@ function sortCalendarEntries(a, b) return 1; } // sort by type - else if (a['Type'] != b['Type']) { - if (a['Type'] < b['Type']) { + else if (a.Type != b.Type) { + if (a.Type < b.Type) { return -1; } - else if (a['Type'] > b['Type']) { + else if (a.Type > b.Type) { return 1; } } // sort by description - else if (a['Summary'] && b['Summary'] && a['Summary'] != b['Summary']) { - if (a['Summary'] < b['Summary']) { + else if (a.Summary && b.Summary && a.Summary != b.Summary) { + if (a.Summary < b.Summary) { return -1; } - else if (a['Summary'] > b['Summary']) { + else if (a.Summary > b.Summary) { return 1; } - } + } } return 0; } +