';
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 +620,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 +644,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 = '' + config['overdueText'].Value + '';
+ 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,16 +724,20 @@ 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;
}
loadSettings();
- updateCssClasses();
collectLocales();
//updateData();
requestNotification();
@@ -685,22 +758,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 +825,7 @@ function showSettings()
else if (config[key].Type == 'Enum') {
settingsHtml += '
' + getLocalizedText('settings.name.' + key) + '
' + printHintBox(getLocalizedText('settings.info.' + key)) + '';
}
}
@@ -779,6 +853,53 @@ function updateCssClasses()
}
}
+function getSettingsCalEntryId()
+{
+ if (settingsCalEntryId == null) {
+ // check if entry already exists
+ var listFiltering = {
+ Type:'CalendarEntry',
+ Filter:{
+ StartRange: new Date(2000, 0, 1),
+ EndRange: new Date(2000, 0, 1),
+ SearchText: 'ComingNext Settings|',
+ Type: 'DayEvent'
+ }
+ }
+ var result = calendarService.IDataSource.GetList(listFiltering);
+ if (result.ErrorCode) {
+ error(result.ErrorMessage);
+ return;
+ }
+ var list = result.ReturnValue;
+ var entry = list.getNext();
+ if (entry != undefined) {
+ settingsCalEntryId = entry.LocalId;
+ console.info("settingsCalEntryId=" + settingsCalEntryId);
+ }
+ else { // create settings item
+ var item = new Object();
+ item.Type = "DayEvent";
+ item.StartTime = new Date(2000, 0, 1);
+ item.Summary = "ComingNext Settings|";
+
+ var criteria = new Object();
+ criteria.Type = "CalendarEntry";
+ criteria.Item = item;
+
+ try {
+ var result = calendarService.IDataSource.Add(criteria);
+ if (result.ErrorCode)
+ error(result.ErrorMessage);
+ } catch (e) {
+ error("getSettingsCalEntryId: " + e + ', line ' + e.line);
+ }
+
+ getSettingsCalEntryId();
+ }
+ }
+}
+
function restoreDefaultSettings()
{
for (var key in config)
@@ -787,38 +908,85 @@ function restoreDefaultSettings()
function loadSettings()
{
- for (var key in config) {
- if (widget.preferenceForKey(key)) {
- if (config[key].Type == 'Int')
- config[key].Value = Number(widget.preferenceForKey(key));
- else if (config[key].Type == 'String')
- config[key].Value = widget.preferenceForKey(key);
- else if (config[key].Type == 'Bool')
- config[key].Value = (widget.preferenceForKey(key) == 'true')
- else if (config[key].Type == 'Enum')
- config[key].Value = widget.preferenceForKey(key);
- else if (config[key].Type == 'UID')
- config[key].Value = Number(widget.preferenceForKey(key));
+ getSettingsCalEntryId();
+ var listFiltering = {
+ Type:'CalendarEntry',
+ Filter:{
+ LocalId: settingsCalEntryId
}
- else
- config[key].Value = config[key].Default;
-
+ }
+ var result = calendarService.IDataSource.GetList(listFiltering);
+ if (result.ErrorCode) {
+ error(result.ErrorMessage);
+ return;
+ }
+ var entry = result.ReturnValue.getNext();
+ if (entry != undefined) {
+ // only reload settings if they chanced since the last reload
+ if (settingsCache != entry.Summary)
+ {
+ restoreDefaultSettings();
+ var stringlist = entry.Summary.split("|");
+ // skip the first two entries, those contain header and version info
+ for(var i = 2; i < stringlist.length - 1; i++) {
+ var pair = stringlist[i].split('=');
+ var key = pair[0];
+ var value = pair[1];
+ console.info('stringlist: ' + key + '=\'' + value + '\'');
+ if (config[key].Type == 'Int')
+ config[key].Value = Number(value);
+ else if (config[key].Type == 'String')
+ config[key].Value = value;
+ else if (config[key].Type == 'Bool')
+ config[key].Value = (value == 'true')
+ else if (config[key].Type == 'Enum')
+ config[key].Value = value;
+ else if (config[key].Type == 'UID')
+ config[key].Value = Number(value);
+ }
+ settingsCache = entry.Summary;
+ updateCssClasses();
+ }
+ }
+ else {
+ error("Failed to load settings, calendar entry could not be found");
}
}
function saveSettings()
{
+ getSettingsCalEntryId();
+ var item = new Object();
+ item.Type = "DayEvent";
+ item.StartTime = new Date(2000, 0, 1);
+ item.LocalId = settingsCalEntryId;
+ item.Summary = "ComingNext Settings|" + version + "|";
+
for (var key in config) {
if (config[key].Type == 'Int')
- widget.setPreferenceForKey(config[key].Value.toString(), key);
+ item.Summary += key + "=" + config[key].Value.toString() + "|";
else if (config[key].Type == 'String')
- widget.setPreferenceForKey(config[key].Value, key);
+ item.Summary += key + "=" + config[key].Value + "|";
else if (config[key].Type == 'Bool')
- widget.setPreferenceForKey(config[key].Value ? 'true' : 'false', key);
+ item.Summary += key + "=" + (config[key].Value ? 'true' : 'false') + "|";
else if (config[key].Type == 'Enum')
- widget.setPreferenceForKey(config[key].Value, key);
+ item.Summary += key + "=" + config[key].Value + "|";
else if (config[key].Type == 'UID')
- widget.setPreferenceForKey(config[key].Value.toString(), key);
+ item.Summary += key + "=" + config[key].Value.toString() + "|";
+ }
+ settingsCache = item.Summary;
+
+ var criteria = new Object();
+ criteria.Type = "CalendarEntry";
+ criteria.Item = item;
+
+ console.info("Saving settings to calendar entry: " + item.Summary);
+ try {
+ var result = calendarService.IDataSource.Add(criteria);
+ if (result.ErrorCode)
+ error(result.ErrorMessage);
+ } catch (e) {
+ error("saveSettings: " + e + ', line ' + e.line);
}
}
@@ -841,14 +1009,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 +1030,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 +1055,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 +1088,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";
+}