X-Git-Url: https://code.delx.au/comingnext/blobdiff_plain/5e96e9ecba1fb9a52af29b7c902b68984b4cd197..648a1b872ec560997b5e355bd654477d2ef09faf:/comingNext/index.html
diff --git a/comingNext/index.html b/comingNext/index.html
index 2de6e29..334814c 100644
--- a/comingNext/index.html
+++ b/comingNext/index.html
@@ -17,6 +17,7 @@
.now { }
.description { }
.icon { }
+.overdue {}
@@ -27,6 +28,7 @@ var config = {
monthRange: { Type: 'Int', Default: 2, Value: 2,},
includeTodos: { Type: 'Bool', Default: true, Value: true,},
useBackgroundImage: { Type: 'Bool', Default: true, Value: true,},
+ backgroundImageLocation: { Type: 'Enum', Default: 'internal', Value: 'internal', ValidValues: ['internal', 'external']},
showCombinedDateTime: { Type: 'Bool', Default: false, Value: false,},
showLocation: { Type: 'Bool', Default: true, Value: true,},
showTodayAsText: { Type: 'Bool', Default: true, Value: true,},
@@ -34,6 +36,8 @@ var config = {
tomorrowText: { Type: 'String', Default: getLocalizedText('settings.default.tomorrowText'), Value: getLocalizedText('settings.default.tomorrowText'),},
showNowAsText: { Type: 'Bool', Default: true, Value: true,},
nowText: { Type: 'String', Default: getLocalizedText('settings.default.nowText'), Value: getLocalizedText('settings.default.nowText'),},
+ markOverdueTodos: { Type: 'Bool', Default: true, Value: true,},
+ overdueText: {Type: 'String', Default: getLocalizedText('settings.default.overdueText'), Value: getLocalizedText('settings.default.overdueText'),},
dateSeparator: { Type: 'String', Default: getLocalizedText('settings.default.dateSeparator'), Value: getLocalizedText('settings.default.dateSeparator'),},
dateFormat: { Type: 'Enum', Default: 'auto', Value: 'auto', ValidValues: ['auto', 'DDMM', 'MMDD'],},
weekDayLength: { Type: 'Int', Default: 2, Value: 2,},
@@ -54,20 +58,24 @@ var config = {
cssStyle_now: { Type: 'String', Default: 'color:#ff00ff', Value: 'color:#ff00ff',},
cssStyle_description: { Type: 'String', Default: '', Value: '',},
cssStyle_icon: { Type: 'String', Default: 'width:15px; height:15px', Value: 'width:15px; height:15px',},
+ cssStyle_overdue: { Type: 'String', Default: 'color:#ffff00', Value: 'color:#ffff00',},
}
+
//-------------------------------------------------------
// Nothing of interest from here on...
//-------------------------------------------------------
var panelNum = 0; // use 1 for second panel
-var version = "1.24";
+var version = "1.26";
+var versionURL = "http://comingnext.sourceforge.net/version.xml";
var calendarService = null;
var cacheEntriesHtml = [];
var months_translated = [];
var orientation = '';
var now = new Date();
-var mode = 0; // 0 = homescreen, 1 = fullscreen, 2 = settings, 3 = about
+var mode = 0; // 0 = homescreen, 1 = fullscreen, 2 = settings, 3 = about, 4 = check for update
+var reqV = null;
// vars for daylight saving time
var daylightsavingWinter = 0;
@@ -146,25 +154,28 @@ function error(message)
document.getElementById("calendarList").innerHTML = 'Error: ' + message;
}
-function isToday(date)
+function areDatesEqual(date1, date2)
{
- if (date.getDate() == now.getDate() && date.getMonth() == now.getMonth())
- return true;
- return false;
+ return (date1.getFullYear() == date2.getFullYear() &&
+ date1.getMonth() == date2.getMonth() &&
+ date1.getDate() == date2.getDate());
}
function isTomorrow(date)
{
- if ((date.getDate() == now.getDate() + 1 && date.getMonth() == now.getMonth()) ||
- (date.getDate() == 0 && date.getMonth() == now.getMonth() + 1) ||
- (date.getDate() == 0 && date.getMonth() == now.getMonth() + 1 && date.getYear() == now.getYear() + 1))
- return true;
- return false;
+ // tommorow = now + 1 day
+ // ToDo: some days can be shorter as 24 hours(daylight saving change day)
+ return areDatesEqual(date, new Date (now.getTime() + 24*60*60*1000));
+}
+
+function isToday(date)
+{
+ return areDatesEqual(date, now);
}
function collectLocales()
{
- var tmpyear = ((panelNum == 0) ? 2000 : 2001);
+ var tmpyear = 2000 + panelNum;
var month = 0;
if (months_translated.length > 0)
@@ -416,6 +427,7 @@ function formatTime(date)
function updateData()
{
+ console.info('updateData()');
calcDaylightSaving();
try {
// meetings have time
@@ -429,6 +441,8 @@ function updateData()
}
}
var meetingResult = calendarService.IDataSource.GetList(meetingListFiltering);
+ if (meetingResult.ErrorCode != 0)
+ throw("Error fetching calendar data: " + meetingResult.ErrorCode + ': ' + meetingResult.ErrorMessage);
var meetingList = meetingResult.ReturnValue;
// todos don't, they start on 00:00 hrs., but should be visible anyway
@@ -458,11 +472,28 @@ function updateData()
var counter = 0;
var entryDate = '';
var dateArr = [];
- var entriesHtml = '
';
+ var fontsize = 'normal';
+ if (mode == 0) {
+ 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 = '';
var eventIds = [];
var max;
if (mode == 0)
- max = ((panelNum == 0) ? config['eventsPerWidget'].Value : 2 * config['eventsPerWidget'].Value);
+ max = (panelNum + 1) * config['eventsPerWidget'].Value;
else
max = 30; // we can display a lot more events in fullscreen mode
@@ -564,10 +595,20 @@ function updateData()
}
// skip events for the first panel in case this is the second one and we're not in fullscreen mode
- if (mode == 0 && panelNum == 1 && counter < config['eventsPerWidget'].Value + 1) {
+ if (mode == 0 && panelNum > 0 && counter < panelNum * config['eventsPerWidget'].Value + 1) {
console.info('skipping (already in first widget) ' + entry.id);
continue;
}
+
+ // mark overdue todos
+ var overdue = false;
+ if (entry.Type == 'ToDo' && date != null) {
+ var tmp1 = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0,0,0);
+ var tmp2 = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0,0,0);
+ if (tmp1.getTime() < tmp2.getTime()) {
+ overdue = true;
+ }
+ }
// generate html output
entriesHtml += ' ';
@@ -578,7 +619,10 @@ function updateData()
var weekDay = date.toLocaleDateString().substr(0,config['weekDayLength'].Value);
var time = formatTime(date);
var dateStr = formatDate(date, entryDate);
- if (entry.Type == 'ToDo' || entry.Type == 'Anniversary' || entry.Type == 'DayEvent' || entry.Type == 'Reminder') {
+ if (entry.Type == 'ToDo' && overdue && config['markOverdueTodos'].Value) {
+ dateStr = 'Overdue ';
+ entriesHtml += '' + dateStr + ' ';
+ } else if (entry.Type == 'ToDo' || entry.Type == 'Anniversary' || entry.Type == 'DayEvent' || entry.Type == 'Reminder') {
if ((isToday(date) || isTomorrow(date)) && config['showTodayAsText'].Value) // show weekday if the date string is not text. looks odd otherwise
entriesHtml += '' + dateStr + ' ';
else
@@ -655,11 +699,16 @@ function launchCalendar()
function init()
{
+ console.info('New widget instance starting up...');
+
try {
// call calendar service
- calendarService = device.getServiceObject("Service.Calendar", "IDataSource");
+ if (device != "undefined")
+ calendarService = device.getServiceObject("Service.Calendar", "IDataSource");
+ else
+ throw('device object does not exist');
} catch(e) {
- error('loading Calendar service');
+ error('loading Calendar service: ' + e + ', line ' + e.line);
return;
}
@@ -685,22 +734,23 @@ function createMenu()
var id = 0;
var menuSettings = new MenuItem(getLocalizedText('menu.settings'), id++);
var menuCallApp = new MenuItem(getLocalizedText('menu.openCalendarApp'), id++);
+ var menuUpdate = new MenuItem(getLocalizedText('menu.update'), id++);
var menuAbout = new MenuItem(getLocalizedText('menu.about'), id++);
menuSettings.onSelect = showSettings;
menuAbout.onSelect = showAbout;
menuCallApp.onSelect = launchCalendar;
+ menuUpdate.onSelect = showUpdate;
window.menu.clear();
window.menu.append(menuCallApp);
window.menu.append(menuSettings);
+ window.menu.append(menuUpdate);
window.menu.append(menuAbout);
}
function showSettings()
{
mode = 2;
- document.getElementById("homescreenView").style.display = "none";
- document.getElementById("fullscreenView").style.display = "none";
- document.getElementById("aboutView").style.display = "none";
+ hideViews();
document.getElementById("settingsView").style.display = "block";
document.onclick = null;
@@ -751,7 +801,7 @@ function showSettings()
else if (config[key].Type == 'Enum') {
settingsHtml += '' + getLocalizedText('settings.name.' + key) + '';
for(var i = 0; i < config[key].ValidValues.length; i++)
- settingsHtml += '' + config[key].ValidValues[i] + ' ';
+ settingsHtml += '' + getLocalizedText('settings.validValues.' + key + '.' + config[key].ValidValues[i]) + ' ';
settingsHtml += ' ' + printHintBox(getLocalizedText('settings.info.' + key)) + ' ';
}
}
@@ -802,7 +852,7 @@ function loadSettings()
}
else
config[key].Value = config[key].Default;
-
+ console.info('Settings: ' + key + '=\'' + config[key].Value + '\'');
}
}
@@ -841,14 +891,12 @@ function printHintBox(text)
function showAbout()
{
mode = 3;
- document.getElementById("homescreenView").style.display = "none";
- document.getElementById("fullscreenView").style.display = "none";
+ hideViews();
document.getElementById("aboutView").style.display = "block";
- document.getElementById("settingsView").style.display = "none";
document.onclick = null;
window.menu.setLeftSoftkeyLabel(" ", function(){});
- window.menu.setRightSoftkeyLabel("Back", function()
+ window.menu.setRightSoftkeyLabel(getLocalizedText('softkey.back'), function()
{
mode = 1;
showFullscreen();
@@ -864,16 +912,24 @@ function updateFullscreen()
function showFullscreen()
{
- document.getElementById("homescreenView").style.display = "none";
+ hideViews();
document.getElementById("fullscreenView").style.display = "block";
- document.getElementById("aboutView").style.display = "none";
- document.getElementById("settingsView").style.display = "none";
document.getElementById('body').className = "backgroundFullscreen";
document.onclick = launchCalendar;
createMenu();
updateData();
}
+function getBackgroundImage()
+{
+ var bgImage;
+ if (config['backgroundImageLocation'].Value == config['backgroundImageLocation'].ValidValues[0]) // internal
+ bgImage = 'background_' + orientation + '.png';
+ else
+ bgImage = 'C:/Data/background_' + panelNum + '_' + orientation + '.png';
+ return bgImage;
+}
+
function updateHomescreen()
{
if (config['useBackgroundImage'].Value) {
@@ -881,29 +937,27 @@ function updateHomescreen()
if (orientation != 'portrait' && screen.width == 360 && screen.height == 640) {
window.widget.prepareForTransition("fade");
orientation = 'portrait';
- document.getElementById('body').style.backgroundImage = 'url(background_' + orientation + '.png)';
+ document.getElementById('body').style.backgroundImage = 'url(' + getBackgroundImage() + ')';
document.getElementById('body').style.backgroundColor = 'none';
window.widget.performTransition();
} else if (orientation != 'landscape' && screen.width == 640 && screen.height == 360) {
window.widget.prepareForTransition("fade");
orientation = 'landscape';
- document.getElementById('body').style.backgroundImage = 'url(background_' + orientation + '.png)';
+ document.getElementById('body').style.backgroundImage = 'url(' + getBackgroundImage() + ')';
document.getElementById('body').style.backgroundColor = 'none';
window.widget.performTransition();
}
else if (document.getElementById('body').style.backgroundImage == "")
{
- document.getElementById('body').style.backgroundImage = 'url(background_' + orientation + '.png)';
+ document.getElementById('body').style.backgroundImage = 'url(' + getBackgroundImage() + ')';
}
}
}
function showHomescreen()
{
+ hideViews();
document.getElementById("homescreenView").style.display = "block";
- document.getElementById("fullscreenView").style.display = "none";
- document.getElementById("aboutView").style.display = "none";
- document.getElementById("settingsView").style.display = "none";
document.getElementById('body').className = "background";
document.onclick = null;
updateData();
@@ -916,6 +970,71 @@ function getLocalizedText(p_Txt)
else
return 'ERROR: missing translation for ' + p_Txt;
}
+
+function showUpdate()
+{
+ mode = 4;
+ hideViews();
+ document.getElementById("updateView").style.display = "block";
+ document.onclick = null;
+
+ window.menu.setLeftSoftkeyLabel(getLocalizedText('update.checknow'), function(){
+ checkForUpdate();
+ });
+ window.menu.setRightSoftkeyLabel(getLocalizedText('softkey.back'), function()
+ {
+ mode = 1;
+ showFullscreen();
+ });
+
+ document.getElementById("currentVersion").innerHTML = getLocalizedText("update.current") + version;
+ checkForUpdate();
+}
+
+function checkForUpdate()
+{
+ // asynch XHR to server url
+ reqV = new XMLHttpRequest();
+ reqV.onreadystatechange = checkForUpdateCallback;
+ document.getElementById("updateDiv").innerHTML = getLocalizedText("update.checking");
+ reqV.open("GET", versionURL, true);
+ reqV.setRequestHeader( "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" ); // disable caching
+ reqV.send(null);
+}
+
+function checkForUpdateCallback()
+{
+ if (reqV.readyState == 4) {
+ if (reqV.status == 200) {
+ var resultXml = reqV.responseText;
+ if (resultXml) {
+ var div = document.getElementById("tmp");
+ div.innerHTML = resultXml;
+ var newVersion = div.getElementsByTagName('version')[0].innerHTML;
+ var newVersionURL = div.getElementsByTagName('url')[0].innerHTML;
+ div.innerHTML = "";
+ if (version != newVersion) {
+ document.getElementById("updateDiv").innerHTML = getLocalizedText("update.download").replace(/%1/, newVersion).replace(/%2/, newVersionURL);
+ }
+ else {
+ document.getElementById("updateDiv").innerHTML = getLocalizedText("update.nonewversion");
+ }
+ }
+ }
+ else {
+ document.getElementById("updateDiv").innerHTML = getLocalizedText("update.error") + reqV.status + " " + reqV.responseText;
+ }
+ }
+}
+
+function hideViews()
+{
+ document.getElementById("homescreenView").style.display = "none";
+ document.getElementById("fullscreenView").style.display = "none";
+ document.getElementById("aboutView").style.display = "none";
+ document.getElementById("settingsView").style.display = "none";
+ document.getElementById("updateView").style.display = "none";
+}