.now { }\r
.description { }\r
.icon { }\r
+.overdue {}\r
</style>\r
\r
<script type="text/javascript" src="localizedTextStrings.js" charset="utf-8" />\r
monthRange: { Type: 'Int', Default: 2, Value: 2,},\r
includeTodos: { Type: 'Bool', Default: true, Value: true,},\r
useBackgroundImage: { Type: 'Bool', Default: true, Value: true,},\r
+ backgroundImageLocation: { Type: 'Enum', Default: 'internal', Value: 'internal', ValidValues: ['internal', 'external']},\r
showCombinedDateTime: { Type: 'Bool', Default: false, Value: false,},\r
showLocation: { Type: 'Bool', Default: true, Value: true,},\r
showTodayAsText: { Type: 'Bool', Default: true, Value: true,},\r
tomorrowText: { Type: 'String', Default: getLocalizedText('settings.default.tomorrowText'), Value: getLocalizedText('settings.default.tomorrowText'),},\r
showNowAsText: { Type: 'Bool', Default: true, Value: true,},\r
nowText: { Type: 'String', Default: getLocalizedText('settings.default.nowText'), Value: getLocalizedText('settings.default.nowText'),},\r
+ markOverdueTodos: { Type: 'Bool', Default: true, Value: true,},\r
+ overdueText: {Type: 'String', Default: getLocalizedText('settings.default.overdueText'), Value: getLocalizedText('settings.default.overdueText'),},\r
dateSeparator: { Type: 'String', Default: getLocalizedText('settings.default.dateSeparator'), Value: getLocalizedText('settings.default.dateSeparator'),},\r
dateFormat: { Type: 'Enum', Default: 'auto', Value: 'auto', ValidValues: ['auto', 'DDMM', 'MMDD'],},\r
weekDayLength: { Type: 'Int', Default: 2, Value: 2,},\r
cssStyle_now: { Type: 'String', Default: 'color:#ff00ff', Value: 'color:#ff00ff',},\r
cssStyle_description: { Type: 'String', Default: '', Value: '',},\r
cssStyle_icon: { Type: 'String', Default: 'width:15px; height:15px', Value: 'width:15px; height:15px',},\r
+ cssStyle_overdue: { Type: 'String', Default: 'color:#ffff00', Value: 'color:#ffff00',},\r
}\r
\r
\r
+\r
//-------------------------------------------------------\r
// Nothing of interest from here on...\r
//-------------------------------------------------------\r
var panelNum = 0; // use 1 for second panel\r
-var version = "1.24";\r
+var version = "1.26";\r
+var versionURL = "http://comingnext.sourceforge.net/version.xml";\r
var calendarService = null;\r
var cacheEntriesHtml = [];\r
var months_translated = [];\r
var orientation = '';\r
var now = new Date();\r
-var mode = 0; // 0 = homescreen, 1 = fullscreen, 2 = settings, 3 = about\r
+var mode = 0; // 0 = homescreen, 1 = fullscreen, 2 = settings, 3 = about, 4 = check for update\r
+var reqV = null; \r
+var settingsCalEntryId = null;\r
+var settingsCache = null;\r
+var notificationRequest1;\r
+var notificationRequest2;\r
\r
// vars for daylight saving time\r
var daylightsavingWinter = 0;\r
document.getElementById("calendarList").innerHTML = 'Error: ' + message;\r
}\r
\r
-function isToday(date)\r
+function areDatesEqual(date1, date2)\r
{\r
- if (date.getDate() == now.getDate() && date.getMonth() == now.getMonth())\r
- return true;\r
- return false;\r
+ return (date1.getFullYear() == date2.getFullYear() && \r
+ date1.getMonth() == date2.getMonth() && \r
+ date1.getDate() == date2.getDate());\r
}\r
\r
function isTomorrow(date)\r
{\r
- if ((date.getDate() == now.getDate() + 1 && date.getMonth() == now.getMonth()) ||\r
- (date.getDate() == 0 && date.getMonth() == now.getMonth() + 1) ||\r
- (date.getDate() == 0 && date.getMonth() == now.getMonth() + 1 && date.getYear() == now.getYear() + 1))\r
- return true;\r
- return false;\r
+ // tommorow = now + 1 day\r
+ // ToDo: some days can be shorter as 24 hours(daylight saving change day)\r
+ return areDatesEqual(date, new Date (now.getTime() + 24*60*60*1000));\r
+}\r
+\r
+function isToday(date)\r
+{\r
+ return areDatesEqual(date, now);\r
}\r
\r
function collectLocales()\r
{\r
- var tmpyear = ((panelNum == 0) ? 2000 : 2001);\r
+ var tmpyear = 2000 + panelNum;\r
var month = 0;\r
\r
if (months_translated.length > 0)\r
criteria.Type = "CalendarEntry";\r
\r
try {\r
- var result = calendarService.IDataSource.RequestNotification(criteria, callback);\r
- if (result.ErrorCode)\r
- error('loading Calendar items list');\r
+ notificationRequest1 = calendarService.IDataSource.RequestNotification(criteria, callback);\r
+ if (notificationRequest1.ErrorCode)\r
+ error('requestNotification failed with error code ' + notificationRequest1.ErrorCode);\r
+ } catch (e) {\r
+ error("requestNotification: " + e + ', line ' + e.line);\r
+ }\r
+\r
+ var criteria2 = new Object();\r
+ criteria2.Type = "CalendarEntry";\r
+ criteria2.Filter = new Object();\r
+ criteria2.Filter.LocalIdList = new Array();\r
+ criteria2.Filter.LocalIdList[0] = settingsCalEntryId;\r
+\r
+ try {\r
+ notificationRequest2 = calendarService.IDataSource.RequestNotification(criteria2, settingsCallback);\r
+ if (notificationRequest2.ErrorCode)\r
+ error('requestNotification failed with error code ' + notificationRequest2.ErrorCode);\r
} catch (e) {\r
error("requestNotification: " + e + ', line ' + e.line);\r
}\r
\r
function callback(transId, eventCode, result)\r
{\r
+ console.info("callback(): panelNum: %d transId: %d eventCode: %d result.ErrorCode: %d", panelNum, transId, eventCode, result.ErrorCode);\r
updateData();\r
}\r
\r
+function settingsCallback(transId, eventCode, result)\r
+{\r
+ console.info("settingsCallback(): panelNum: %d transId: %d eventCode: %d result.ErrorCode: %d", panelNum, transId, eventCode, result.ErrorCode);\r
+ loadSettings();\r
+}\r
+\r
function parseDate(dateString)\r
{\r
/*\r
\r
function updateData()\r
{\r
+ console.info('updateData()');\r
calcDaylightSaving();\r
try {\r
// meetings have time\r
}\r
}\r
var meetingResult = calendarService.IDataSource.GetList(meetingListFiltering);\r
+ if (meetingResult.ErrorCode != 0)\r
+ throw("Error fetching calendar data: " + meetingResult.ErrorCode + ': ' + meetingResult.ErrorMessage);\r
var meetingList = meetingResult.ReturnValue;\r
\r
// todos don't, they start on 00:00 hrs., but should be visible anyway\r
var counter = 0;\r
var entryDate = '';\r
var dateArr = [];\r
- var entriesHtml = '<table>';\r
+ var fontsize = 'normal';\r
+ if (mode == 0) {\r
+ if (config['eventsPerWidget'].Value == 3) {\r
+ fontsize = '17pt';\r
+ changeCssClass('.icon', 'width:20px; height:20px');\r
+ }\r
+ else if (config['eventsPerWidget'].Value == 5) {\r
+ fontsize = '10pt';\r
+ changeCssClass('.icon', 'width:10px; height:10px');\r
+ }\r
+ else if (config['eventsPerWidget'].Value == 6) {\r
+ fontsize = '8pt';\r
+ changeCssClass('.icon', 'width:8px; height:8px');\r
+ }\r
+ }\r
+ else\r
+ changeCssClass('.icon', config['cssStyle_icon'].Value);\r
+ var entriesHtml = '<table style="font-size:' + fontsize + ';">';\r
var eventIds = [];\r
var max;\r
if (mode == 0)\r
- max = ((panelNum == 0) ? config['eventsPerWidget'].Value : 2 * config['eventsPerWidget'].Value);\r
+ max = (panelNum + 1) * config['eventsPerWidget'].Value;\r
else\r
max = 30; // we can display a lot more events in fullscreen mode\r
\r
}\r
\r
// skip events for the first panel in case this is the second one and we're not in fullscreen mode\r
- if (mode == 0 && panelNum == 1 && counter < config['eventsPerWidget'].Value + 1) {\r
+ if (mode == 0 && panelNum > 0 && counter < panelNum * config['eventsPerWidget'].Value + 1) {\r
console.info('skipping (already in first widget) ' + entry.id);\r
continue;\r
}\r
+ \r
+ // mark overdue todos\r
+ var overdue = false;\r
+ if (entry.Type == 'ToDo' && date != null) {\r
+ var tmp1 = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0,0,0);\r
+ var tmp2 = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0,0,0);\r
+ if (tmp1.getTime() < tmp2.getTime()) {\r
+ overdue = true;\r
+ }\r
+ }\r
\r
// generate html output\r
entriesHtml += '<tr><td><img class="icon" src="' + entry.Type + '.png" /></td>';\r
var weekDay = date.toLocaleDateString().substr(0,config['weekDayLength'].Value);\r
var time = formatTime(date);\r
var dateStr = formatDate(date, entryDate);\r
- if (entry.Type == 'ToDo' || entry.Type == 'Anniversary' || entry.Type == 'DayEvent' || entry.Type == 'Reminder') {\r
+ if (entry.Type == 'ToDo' && overdue && config['markOverdueTodos'].Value) {\r
+ dateStr = '<span class="overdue">' + config['overdueText'].Value + '</span>';\r
+ entriesHtml += '<td colspan="4" width="1px"><span class="date">' + dateStr + '</span> ';\r
+ } else if (entry.Type == 'ToDo' || entry.Type == 'Anniversary' || entry.Type == 'DayEvent' || entry.Type == 'Reminder') {\r
if ((isToday(date) || isTomorrow(date)) && config['showTodayAsText'].Value) // show weekday if the date string is not text. looks odd otherwise\r
entriesHtml += '<td colspan="4" width="1px"><span class="date">' + dateStr + '</span> ';\r
else\r
\r
function init()\r
{\r
+ console.info('New widget instance starting up...');\r
+ \r
try {\r
// call calendar service\r
- calendarService = device.getServiceObject("Service.Calendar", "IDataSource");\r
+ if (device != "undefined")\r
+ calendarService = device.getServiceObject("Service.Calendar", "IDataSource");\r
+ else\r
+ throw('device object does not exist');\r
} catch(e) {\r
- error('loading Calendar service');\r
+ error('loading Calendar service: ' + e + ', line ' + e.line);\r
return;\r
}\r
\r
loadSettings();\r
- updateCssClasses();\r
collectLocales();\r
//updateData();\r
requestNotification();\r
var id = 0;\r
var menuSettings = new MenuItem(getLocalizedText('menu.settings'), id++);\r
var menuCallApp = new MenuItem(getLocalizedText('menu.openCalendarApp'), 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
window.menu.clear();\r
window.menu.append(menuCallApp);\r
window.menu.append(menuSettings);\r
+ window.menu.append(menuUpdate);\r
window.menu.append(menuAbout); \r
}\r
\r
function showSettings()\r
{\r
mode = 2;\r
- document.getElementById("homescreenView").style.display = "none";\r
- document.getElementById("fullscreenView").style.display = "none";\r
- document.getElementById("aboutView").style.display = "none";\r
+ hideViews();\r
document.getElementById("settingsView").style.display = "block";\r
document.onclick = null;\r
\r
else if (config[key].Type == 'Enum') {\r
settingsHtml += '<table><tr><td>' + getLocalizedText('settings.name.' + key) + '<br /><select name="settings.' + key + '" size="1">';\r
for(var i = 0; i < config[key].ValidValues.length; i++)\r
- settingsHtml += '<option label="' + config[key].ValidValues[i] + '"' + (config[key].Value == config[key].ValidValues[i] ? ' selected="selected"' : '') + '>' + config[key].ValidValues[i] + '</option>';\r
+ settingsHtml += '<option value="' + config[key].ValidValues[i] + '"' + (config[key].Value == config[key].ValidValues[i] ? ' selected="selected"' : '') + '>' + getLocalizedText('settings.validValues.' + key + '.' + config[key].ValidValues[i]) + '</option>';\r
settingsHtml += '</select></div></td>' + printHintBox(getLocalizedText('settings.info.' + key)) + '<hr />';\r
}\r
}\r
}\r
}\r
\r
+function getSettingsCalEntryId()\r
+{\r
+ if (settingsCalEntryId == null) {\r
+ // check if entry already exists\r
+ var listFiltering = {\r
+ Type:'CalendarEntry', \r
+ Filter:{\r
+ StartRange: new Date(2000, 0, 1),\r
+ EndRange: new Date(2000, 0, 1),\r
+ SearchText: 'ComingNext Settings|',\r
+ Type: 'DayEvent'\r
+ }\r
+ }\r
+ var result = calendarService.IDataSource.GetList(listFiltering);\r
+ if (result.ErrorCode) {\r
+ error(result.ErrorMessage);\r
+ return;\r
+ }\r
+ var list = result.ReturnValue;\r
+ var entry = list.getNext();\r
+ if (entry != undefined) {\r
+ settingsCalEntryId = entry.LocalId;\r
+ console.info("settingsCalEntryId=" + settingsCalEntryId);\r
+ }\r
+ else { // create settings item\r
+ var item = new Object();\r
+ item.Type = "DayEvent";\r
+ item.StartTime = new Date(2000, 0, 1);\r
+ item.Summary = "ComingNext Settings|";\r
+ \r
+ var criteria = new Object();\r
+ criteria.Type = "CalendarEntry";\r
+ criteria.Item = item;\r
+\r
+ try {\r
+ var result = calendarService.IDataSource.Add(criteria);\r
+ if (result.ErrorCode)\r
+ error(result.ErrorMessage);\r
+ } catch (e) {\r
+ error("getSettingsCalEntryId: " + e + ', line ' + e.line);\r
+ }\r
+\r
+ getSettingsCalEntryId();\r
+ }\r
+ }\r
+}\r
+\r
function restoreDefaultSettings()\r
{\r
for (var key in config)\r
\r
function loadSettings()\r
{\r
- for (var key in config) {\r
- if (widget.preferenceForKey(key)) {\r
- if (config[key].Type == 'Int')\r
- config[key].Value = Number(widget.preferenceForKey(key));\r
- else if (config[key].Type == 'String')\r
- config[key].Value = widget.preferenceForKey(key);\r
- else if (config[key].Type == 'Bool')\r
- config[key].Value = (widget.preferenceForKey(key) == 'true')\r
- else if (config[key].Type == 'Enum')\r
- config[key].Value = widget.preferenceForKey(key);\r
- else if (config[key].Type == 'UID')\r
- config[key].Value = Number(widget.preferenceForKey(key));\r
+ getSettingsCalEntryId();\r
+ var listFiltering = {\r
+ Type:'CalendarEntry', \r
+ Filter:{\r
+ LocalId: settingsCalEntryId\r
}\r
- else\r
- config[key].Value = config[key].Default;\r
- \r
+ }\r
+ var result = calendarService.IDataSource.GetList(listFiltering);\r
+ if (result.ErrorCode) {\r
+ error(result.ErrorMessage);\r
+ return;\r
+ }\r
+ var entry = result.ReturnValue.getNext();\r
+ if (entry != undefined) {\r
+ // only reload settings if they chanced since the last reload\r
+ if (settingsCache != entry.Summary)\r
+ {\r
+ restoreDefaultSettings();\r
+ var stringlist = entry.Summary.split("|");\r
+ // skip the first two entries, those contain header and version info\r
+ for(var i = 2; i < stringlist.length - 1; i++) {\r
+ var pair = stringlist[i].split('=');\r
+ var key = pair[0];\r
+ var value = pair[1];\r
+ console.info('stringlist: ' + key + '=\'' + value + '\'');\r
+ if (config[key].Type == 'Int')\r
+ config[key].Value = Number(value);\r
+ 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
+ config[key].Value = Number(value);\r
+ }\r
+ settingsCache = entry.Summary;\r
+ updateCssClasses();\r
+ }\r
+ }\r
+ else {\r
+ error("Failed to load settings, calendar entry could not be found");\r
}\r
}\r
\r
function saveSettings()\r
{\r
+ getSettingsCalEntryId();\r
+ var item = new Object();\r
+ item.Type = "DayEvent";\r
+ item.StartTime = new Date(2000, 0, 1);\r
+ item.LocalId = settingsCalEntryId;\r
+ item.Summary = "ComingNext Settings|" + version + "|";\r
+\r
for (var key in config) {\r
if (config[key].Type == 'Int')\r
- widget.setPreferenceForKey(config[key].Value.toString(), key);\r
+ item.Summary += key + "=" + config[key].Value.toString() + "|";\r
else if (config[key].Type == 'String')\r
- widget.setPreferenceForKey(config[key].Value, key);\r
+ item.Summary += key + "=" + config[key].Value + "|";\r
else if (config[key].Type == 'Bool')\r
- widget.setPreferenceForKey(config[key].Value ? 'true' : 'false', key);\r
+ item.Summary += key + "=" + (config[key].Value ? 'true' : 'false') + "|";\r
else if (config[key].Type == 'Enum')\r
- widget.setPreferenceForKey(config[key].Value, key);\r
+ item.Summary += key + "=" + config[key].Value + "|";\r
else if (config[key].Type == 'UID')\r
- widget.setPreferenceForKey(config[key].Value.toString(), key);\r
+ item.Summary += key + "=" + config[key].Value.toString() + "|";\r
+ }\r
+ settingsCache = item.Summary;\r
+ \r
+ var criteria = new Object();\r
+ criteria.Type = "CalendarEntry";\r
+ criteria.Item = item;\r
+\r
+ console.info("Saving settings to calendar entry: " + item.Summary);\r
+ try {\r
+ var result = calendarService.IDataSource.Add(criteria);\r
+ if (result.ErrorCode)\r
+ error(result.ErrorMessage);\r
+ } catch (e) {\r
+ error("saveSettings: " + e + ', line ' + e.line);\r
}\r
}\r
\r
function showAbout()\r
{\r
mode = 3;\r
- document.getElementById("homescreenView").style.display = "none";\r
- document.getElementById("fullscreenView").style.display = "none";\r
+ hideViews();\r
document.getElementById("aboutView").style.display = "block";\r
- document.getElementById("settingsView").style.display = "none";\r
document.onclick = null;\r
\r
window.menu.setLeftSoftkeyLabel(" ", function(){});\r
- window.menu.setRightSoftkeyLabel("Back", function()\r
+ window.menu.setRightSoftkeyLabel(getLocalizedText('softkey.back'), function()\r
{\r
mode = 1;\r
showFullscreen();\r
\r
function showFullscreen()\r
{\r
- document.getElementById("homescreenView").style.display = "none";\r
+ hideViews();\r
document.getElementById("fullscreenView").style.display = "block";\r
- document.getElementById("aboutView").style.display = "none";\r
- document.getElementById("settingsView").style.display = "none";\r
document.getElementById('body').className = "backgroundFullscreen";\r
document.onclick = launchCalendar;\r
createMenu();\r
updateData();\r
}\r
\r
+function getBackgroundImage()\r
+{\r
+ var bgImage;\r
+ if (config['backgroundImageLocation'].Value == config['backgroundImageLocation'].ValidValues[0]) // internal\r
+ bgImage = 'background_' + orientation + '.png';\r
+ else\r
+ bgImage = 'C:/Data/background_' + panelNum + '_' + orientation + '.png';\r
+ return bgImage;\r
+}\r
+\r
function updateHomescreen()\r
{\r
if (config['useBackgroundImage'].Value) {\r
if (orientation != 'portrait' && screen.width == 360 && screen.height == 640) {\r
window.widget.prepareForTransition("fade");\r
orientation = 'portrait';\r
- document.getElementById('body').style.backgroundImage = 'url(background_' + orientation + '.png)';\r
+ document.getElementById('body').style.backgroundImage = 'url(' + getBackgroundImage() + ')';\r
document.getElementById('body').style.backgroundColor = 'none';\r
window.widget.performTransition();\r
} else if (orientation != 'landscape' && screen.width == 640 && screen.height == 360) {\r
window.widget.prepareForTransition("fade");\r
orientation = 'landscape';\r
- document.getElementById('body').style.backgroundImage = 'url(background_' + orientation + '.png)';\r
+ document.getElementById('body').style.backgroundImage = 'url(' + getBackgroundImage() + ')';\r
document.getElementById('body').style.backgroundColor = 'none';\r
window.widget.performTransition();\r
}\r
else if (document.getElementById('body').style.backgroundImage == "")\r
{\r
- document.getElementById('body').style.backgroundImage = 'url(background_' + orientation + '.png)';\r
+ document.getElementById('body').style.backgroundImage = 'url(' + getBackgroundImage() + ')';\r
}\r
}\r
}\r
\r
function showHomescreen()\r
{\r
+ hideViews();\r
document.getElementById("homescreenView").style.display = "block";\r
- document.getElementById("fullscreenView").style.display = "none";\r
- document.getElementById("aboutView").style.display = "none";\r
- document.getElementById("settingsView").style.display = "none";\r
document.getElementById('body').className = "background";\r
document.onclick = null;\r
updateData();\r
else \r
return 'ERROR: missing translation for ' + p_Txt;\r
}\r
+\r
+function showUpdate()\r
+{\r
+ mode = 4;\r
+ hideViews();\r
+ document.getElementById("updateView").style.display = "block";\r
+ document.onclick = null;\r
+ \r
+ window.menu.setLeftSoftkeyLabel(getLocalizedText('update.checknow'), function(){\r
+ checkForUpdate();\r
+ });\r
+ window.menu.setRightSoftkeyLabel(getLocalizedText('softkey.back'), function()\r
+ {\r
+ mode = 1;\r
+ showFullscreen();\r
+ });\r
+ \r
+ document.getElementById("currentVersion").innerHTML = getLocalizedText("update.current") + version;\r
+ checkForUpdate();\r
+}\r
+\r
+function checkForUpdate()\r
+{\r
+ // asynch XHR to server url\r
+ reqV = new XMLHttpRequest();\r
+ reqV.onreadystatechange = checkForUpdateCallback;\r
+ document.getElementById("updateDiv").innerHTML = getLocalizedText("update.checking");\r
+ reqV.open("GET", versionURL, true);\r
+ reqV.setRequestHeader( "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" ); // disable caching\r
+ reqV.send(null);\r
+}\r
+\r
+function checkForUpdateCallback()\r
+{ \r
+ if (reqV.readyState == 4) {\r
+ if (reqV.status == 200) {\r
+ var resultXml = reqV.responseText;\r
+ if (resultXml) {\r
+ var div = document.getElementById("tmp");\r
+ div.innerHTML = resultXml;\r
+ var newVersion = div.getElementsByTagName('version')[0].innerHTML;\r
+ var newVersionURL = div.getElementsByTagName('url')[0].innerHTML;\r
+ div.innerHTML = "";\r
+ if (version != newVersion) {\r
+ document.getElementById("updateDiv").innerHTML = getLocalizedText("update.download").replace(/%1/, newVersion).replace(/%2/, newVersionURL);\r
+ }\r
+ else {\r
+ document.getElementById("updateDiv").innerHTML = getLocalizedText("update.nonewversion");\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ document.getElementById("updateDiv").innerHTML = getLocalizedText("update.error") + reqV.status + " " + reqV.responseText;\r
+ }\r
+ }\r
+}\r
+\r
+function hideViews()\r
+{\r
+ document.getElementById("homescreenView").style.display = "none";\r
+ document.getElementById("fullscreenView").style.display = "none";\r
+ document.getElementById("aboutView").style.display = "none";\r
+ document.getElementById("settingsView").style.display = "none";\r
+ document.getElementById("updateView").style.display = "none";\r
+}\r
</script>\r
\r
<style type="text/css">\r
<p class="credits">Paul Moore (bug fixes, new features and code cleanup)</p>\r
<p class="credits">Manfred Hanselmann (DST support)</p>\r
<p class="credits">Christophe Milsent (translation support & french translation</p>\r
+ <p class="credits">Flavio Nathan (portuguese-brazilian translation</p>\r
<p>This software is open source and licensed under the GPLv3.</p>\r
<p>Visit sourceforge.net/projects/comingnext for free updates.</p>\r
<hr />\r
</div>\r
+<div id="updateView" style="display:none">\r
+ <img src="Icon.png" id="smallappicon">\r
+ <h1 class="title">Check for update</h1>\r
+ <hr />\r
+ <div id="currentVersion">Coming Next ??</div>\r
+ <div id="updateDiv"></div>\r
+ <div id="tmp" style="display:none;"></div>\r
+</div>\r
</body>\r
\r
</html>\r