daylightSavingOffset: { Type: 'Int', Default: 1, Value: 1,},\r
hideWidgetOnCalendarOpen: { Type: 'Bool', Default: false, Value: false,},\r
showCalendarIndicator: { Type: 'Bool', Default: true, Value: true,},\r
- excludedCalendars: { Type: 'Array', Default: '', Value: '',},\r
+ excludedCalendars: { Type: 'Array', Default: [], Value: [],},\r
cssStyle_background: { Type: 'String', Default: 'color:#ffffff; background-color:#000000', Value: 'color:#ffffff; background-color:#000000',},\r
cssStyle_backgroundFullscreen: { Type: 'String', Default: 'color:#ffffff; background-color:#000000', Value: 'color:#ffffff; background-color:#000000',},\r
cssStyle_weekDay: { Type: 'String', Default: '', Value: '',},\r
// Nothing of interest from here on...\r
//-------------------------------------------------------\r
var panelNum = 0; // use 1 for second panel\r
-var version = "1.30";\r
+var version = "1.31";\r
var versionURL = "http://comingnext.sourceforge.net/version.xml";\r
var calendarService = null;\r
var cacheEntriesHtml = [];\r
var calendarColors = [];\r
var updateTimer = null;\r
var screenRotationTimer = null;\r
+var lastUpdateTime = now;\r
+var errorOccured = false;\r
\r
// vars for daylight saving time\r
var summertime = false; // true, if current date is in summer, false if in winter\r
{\r
console.info('Error: ' + message);\r
document.getElementById("calendarList").innerHTML = 'Error: ' + message;\r
+ document.getElementById("fullscreenCalendarList").innerHTML = 'Error: ' + message;\r
+ errorOccured = true;\r
+ document.onclick = null;\r
}\r
\r
function areDatesEqual(date1, date2)\r
function updateData()\r
{\r
console.info('updateData()');\r
+ if (errorOccured) {\r
+ return;\r
+ }\r
\r
// check if we got additional or less calendars since our last update\r
var newCalendarList = listCalendars();\r
document.getElementById('fullscreenCalendarList').innerHTML = entriesHtml;\r
cacheEntriesHtml = entriesHtml;\r
}\r
+ \r
+ lastUpdateTime = new Date();\r
} catch(e) {\r
error('displaying list:' + e + ', line ' + e.line);\r
return;\r
updateHomescreen();\r
else if (mode == 1)\r
updateFullscreen();\r
+ \r
+ var time = new Date();\r
+ if (time.getTime() - lastUpdateTime.getTime() > config['updateDataInterval'].Value * 60 * 1000) {\r
+ console.info('updateScreen(): force updateData() because last update was too long ago (' + (time.getTime() - lastUpdateTime.getTime()) / 1000 + 's)');\r
+ clearUpdateTimer();\r
+ updateData();\r
+ setUpdateTimer(); // reinitialize update timer\r
+ }\r
}\r
\r
function launchCalendar()\r
else\r
throw('device object does not exist');\r
} catch(e) {\r
- error('loading Calendar service: ' + e + ', line ' + e.line);\r
- return;\r
+ error('loading Calendar service: ' + e + ', line ' + e.line + '<br /><a onclick="widget.openURL(\'http://comingnext.sf.net/help\'); return false;" href="http://comingnext.sf.net/help">' + getLocalizedText('menu.help') + '</a>');\r
+ //return;\r
}\r
\r
calendarList = listCalendars();\r
var id = 0;\r
var menuSettings = new MenuItem(getLocalizedText('menu.settings'), id++);\r
var menuCallApp = new MenuItem(getLocalizedText('menu.openCalendarApp'), id++);\r
+ var menuHelp = new MenuItem(getLocalizedText('menu.help'), id++);\r
var menuUpdate = new MenuItem(getLocalizedText('menu.update'), id++);\r
var menuAbout = new MenuItem(getLocalizedText('menu.about'), id++);\r
menuSettings.onSelect = showSettings;\r
menuAbout.onSelect = showAbout;\r
menuCallApp.onSelect = launchCalendar;\r
menuUpdate.onSelect = showUpdate;\r
+ menuHelp.onSelect = showHelp;\r
window.menu.clear();\r
window.menu.append(menuCallApp);\r
window.menu.append(menuSettings);\r
+ window.menu.append(menuHelp);\r
window.menu.append(menuUpdate);\r
window.menu.append(menuAbout); \r
}\r
config[key].Value = document.forms[0].elements["settings." + key].value;\r
else if (config[key].Type == 'Int') {\r
config[key].Value = parseInt(document.forms[0].elements["settings." + key].value);\r
- if (config[key].Value < 0)\r
+ if (config[key].Value < 0 || isNaN(config[key].Value))
config[key].Value = config[key].Default;\r
}\r
else if (config[key].Type == 'Bool')\r
config[key].Value = document.forms[0].elements["settings." + key].checked;\r
- else if (config[key].Type == 'UID')\r
+ else if (config[key].Type == 'UID') {
config[key].Value = parseInt(document.forms[0].elements["settings." + key].value);\r
+ if (isNaN(config[key].Value))
+ config[key].Value = config[key].Default;
+ }
else if (config[key].Type == 'Enum') {\r
config[key].Value = document.forms[0].elements["settings." + key].value;\r
if (config[key].ValidValues.indexOf(config[key].Value) == -1)\r
var key = pair[0];\r
var value = pair[1];\r
console.info('stringlist: ' + key + '=\'' + value + '\'');\r
- if (config[key].Type == 'Int')\r
+ if (config[key].Type == 'Int') {
config[key].Value = Number(value);\r
+ if (isNaN(config[key].Value))
+ config[key].Value = config[key].Default;
+ }
else if (config[key].Type == 'String')\r
config[key].Value = value;\r
else if (config[key].Type == 'Bool')\r
config[key].Value = (value == 'true')\r
else if (config[key].Type == 'Enum')\r
config[key].Value = value;\r
- else if (config[key].Type == 'UID')\r
+ else if (config[key].Type == 'UID') {
config[key].Value = Number(value);\r
- else if (config[key].Type == 'Array')\r
+ if (isNaN(config[key].Value))
+ config[key].Value = config[key].Default;
+ }
+ else if (config[key].Type == 'Array') {\r
config[key].Value = value.split("^");\r
+ if (config[key].Value.length == 1 && config[key].Value[0] == "") {\r
+ config[key].Value = [];\r
+ }\r
+ }\r
}\r
settingsCache = entry.Summary;\r
updateCssClasses();\r
document.getElementById("name").innerHTML = "Coming Next " + version;\r
}\r
\r
+function showHelp() {\r
+ widget.openURL('http://comingnext.sf.net/help');\r
+}\r
+\r
function updateFullscreen()\r
{\r
}\r
hideViews();\r
document.getElementById("fullscreenView").style.display = "block";\r
document.getElementById('body').className = "backgroundFullscreen";\r
- document.onclick = launchCalendar;\r
+ if (!errorOccured)\r
+ document.onclick = launchCalendar;\r
createMenu();\r
updateData();\r
}\r
\r
function getBackgroundImage()\r
{\r
+ if (errorOccured)\r
+ return '';\r
var bgImage;\r
if (config['backgroundImageLocation'].Value == config['backgroundImageLocation'].ValidValues[0]) // internal\r
bgImage = 'background_' + orientation + '.png';\r
}\r
}\r
}\r
+ // NOTE: events my have no date information at all. In that case, we list events without date first\r
+ else if (atime && !btime) {\r
+ return 1;\r
+ }\r
+ else if (!atime && btime) {\r
+ return -1;\r
+ }\r
+ else if (!atime && !btime) {\r
+ // sort by type\r
+ if (a.Type != b.Type) {\r
+ if (a.Type < b.Type) {\r
+ return -1;\r
+ }\r
+ else if (a.Type > b.Type) {\r
+ return 1;\r
+ }\r
+ }\r
+ // sort by description\r
+ else if (a.Summary && b.Summary && a.Summary != b.Summary) {\r
+ if (a.Summary < b.Summary) {\r
+ return -1;\r
+ }\r
+ else if (a.Summary > b.Summary) {\r
+ return 1;\r
+ }\r
+ }\r
+ }\r
\r
return 0;\r
}\r
</script>\r
\r
<style type="text/css">\r
+a { color:#aaccff }\r
table { margin:0px; padding:0px; border-spacing:0px; }\r
td { padding:0px 5px 0px 0px; white-space:nowrap; overflow:hidden; }\r
hr { color:#ffffff; background-color:#ffffff; height:1px; text-align:left; border-style:none; }\r
<p class="credits">Christophe Milsent (translation support & french translation)</p>\r
<p class="credits">Flavio Nathan (portuguese-brazilian translation)</p>\r
<p class="credits">Tokeda (russian translation)</p>\r
+ <p class="credits">Marcella Ferrari (italian translation)</p>\r
+ <p class="credits">Venos (italian translation)</p>\r
<p>This software is open source and licensed under the GPLv3.</p>\r
- <p>Visit <a href="http://sourceforge.net/projects/comingnext">sourceforge.net/projects/comingnext</a> for free updates.</p>\r
+ <p>Visit <a onclick="widget.openURL('http://comingnext.sf.net/'); return false;" href="http://comingnext.sf.net/">comingnext.sf.net</a> for free updates.</p>\r
<hr />\r
</div>\r
<div id="updateView" style="display:none">\r