+ log("init(): finished...");\r
+ if (!errorOccured)\r
+ statupSuccessful = true;\r
+}\r
+\r
+function checkOrientation()\r
+{\r
+ //updateScreen();\r
+ if (mode == 0)\r
+ updateHomescreen(); // check for screen rotation\r
+}\r
+\r
+function setUpdateTimer()\r
+{\r
+ updateTimer = window.setInterval('updateTimerCallback()', 1000 * 60 * config['updateDataInterval'].Value);\r
+}\r
+\r
+function clearUpdateTimer() \r
+{\r
+ window.clearInterval(updateTimer);\r
+}\r
+\r
+function updateTimerCallback()\r
+{\r
+ log("updateTimerCallback()");\r
+ updateData();\r
+}\r
+\r
+function createMenu()\r
+{\r
+ window.menu.setLeftSoftkeyLabel("",null);\r
+ window.menu.setRightSoftkeyLabel("",null);\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
+\r
+function showSettings()\r
+{\r
+ mode = 2;\r
+ hideViews();\r
+ document.getElementById("settingsView").style.display = "block";\r
+ document.onclick = null;\r
+ \r
+ window.menu.setLeftSoftkeyLabel(getLocalizedText('settings.save'), function()\r
+ {\r
+ for (var key in config) {\r
+ if (config[key].Type == 'String')\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 || isNaN(config[key].Value))\r
+ 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
+ config[key].Value = parseInt(document.forms[0].elements["settings." + key].value);\r
+ if (isNaN(config[key].Value))\r
+ config[key].Value = config[key].Default;\r
+ }\r
+ 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
+ config[key].Value = config[key].Default;\r
+ }\r
+ else if (config[key].Type == 'Array') {\r
+ if (key == 'excludedCalendars') {\r
+ config[key].Value = new Array();\r
+ for(var i=0; i < calendarList.length; i++) {\r
+ var element = document.forms[0].elements["settings." + key + "." + calendarList[i]];\r
+ if (element != null && element.checked == false)\r
+ config[key].Value.push(calendarList[i]);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ updateCssClasses();\r
+ \r
+ saveSettings();\r
+ \r
+ mode = 1;\r
+ showFullscreen();\r
+ });\r
+ window.menu.setRightSoftkeyLabel(getLocalizedText('settings.cancel'), function()\r
+ {\r
+ mode = 1;\r
+ showFullscreen();\r
+ });\r
+ \r
+ var settingsHtml = '<form>';\r
+ for (var key in config) {\r
+ if (config[key].Type == 'String') {\r
+ var prefix = "";\r
+ if (key.substring(0,9) == "cssStyle_")\r
+ prefix = getLocalizedText('settings.cssStyle_prefix');\r
+ settingsHtml += '<table><tr><td>' + prefix + getLocalizedText('settings.name.' + key) + '<br /><input class="textInput" name="settings.' + key + '" type="text" value="' + config[key].Value + '" /></td>' + printHintBox(getLocalizedText('settings.info.' + key)) + '<hr />';\r
+ }\r
+ else if (config[key].Type == 'Int')\r
+ settingsHtml += '<table><tr><td>' + getLocalizedText('settings.name.' + key) + '<br /><input class="textInput" name="settings.' + key + '" type="text" value="' + config[key].Value + '" /></td>' + printHintBox(getLocalizedText('settings.info.' + key)) + '<hr />';\r
+ else if (config[key].Type == 'Bool')\r
+ settingsHtml += '<table><tr><td>' + getLocalizedText('settings.name.' + key) + '<br /><input name="settings.' + key + '" type="checkbox" value="true" ' + (config[key].Value ? 'checked="checked"' : '') + '/></td>' + printHintBox(getLocalizedText('settings.info.' + key)) + '<hr />';\r
+ else if (config[key].Type == 'UID')\r
+ settingsHtml += '<table><tr><td>' + getLocalizedText('settings.name.' + key) + '<br /><input class="textInput" name="settings.' + key + '" type="text" value="0x' + config[key].Value.toString(16) + '" /></td>' + printHintBox(getLocalizedText('settings.info.' + key)) + '<hr />';\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 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
+ else if (config[key].Type == 'Array') {\r
+ settingsHtml += '<table><tr><td>' + getLocalizedText('settings.name.' + key) + '<br />';\r
+ if (key == 'excludedCalendars') {\r
+ for(var i=0; i < calendarList.length; i++) {\r
+ var checked = 'checked="checked"';\r
+ if (config[key].Value.indexOf(calendarList[i]) != -1)\r
+ checked = '';\r
+ settingsHtml += '<input name="settings.' + key + '.' + calendarList[i] + '" type="checkbox" value="' + calendarList[i] + '" ' + checked + '/> ' + calendarList[i] + '<br />';\r
+ }\r
+ }\r
+ settingsHtml += '</td>' + printHintBox(getLocalizedText('settings.info.' + key)) + '<hr />';\r
+ }\r
+ }\r
+ settingsHtml += '<input name="reset" type="button" value="' + getLocalizedText('settings.restoreDefaults') + '" onclick="javascript:restoreDefaultSettings();showSettings();" />';\r
+ settingsHtml += '</form>';\r
+ document.getElementById("settingsList").innerHTML = settingsHtml;\r
+}\r
+\r
+function changeCssClass(classname, properties)\r
+{\r
+ for(var i = 0; i < document.styleSheets[0]['cssRules'].length; i++)\r
+ {\r
+ if (document.styleSheets[0]['cssRules'][i].selectorText == classname) {\r
+ document.styleSheets[0].deleteRule(i);\r
+ document.styleSheets[0].insertRule(classname + ' { ' + properties + ' }', document.styleSheets[0]['cssRules'].length);\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+function updateCssClasses()\r
+{\r
+ for(var key in config) {\r
+ changeCssClass(getLocalizedText('settings.name.' + key), config[key].Value);\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(1999, 11, 30), // note: due to Nokia's buggy calendar API, the settings event can be on 01.01.2000 AND on 31.12.1999, depending on when the calendar entry was created (in summer or winter). It is not even possible to narrow the search down to these two days (probably because of DST offsets). So we're looking for an event between 30.12.1999 and 02.01.2000!\r
+ EndRange: new Date(2000, 0, 2),\r
+ SearchText: 'ComingNext Settings|',\r
+ Type: 'DayEvent'\r
+ }\r
+ }\r
+ var result = null;\r
+ try {\r
+ result = calendarService.IDataSource.GetList(listFiltering);\r
+ if (result.ErrorCode)\r
+ throw(result.ErrorMessage);\r
+ }\r
+ catch (e) {\r
+ error("getSettingsCalEntryId: GetList() failed: " + e + ', line ' + e.line);\r
+ return;\r
+ }\r
+ var list = result.ReturnValue;\r
+ var entry = list.getNext();\r
+ if (entry != undefined) {\r
+ settingsCalEntryId = entry.LocalId;\r
+ log("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
+ throw(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
+ config[key].Value = config[key].Default;\r
+}\r
+\r
+function loadSettings()\r
+{\r
+ getSettingsCalEntryId();\r
+ var listFiltering = {\r
+ Type:'CalendarEntry', \r
+ Filter:{\r
+ LocalId: settingsCalEntryId\r
+ }\r
+ }\r
+ var result = null;\r
+ try {\r
+ result = calendarService.IDataSource.GetList(listFiltering);\r
+ if (result.ErrorCode)\r
+ throw(result.ErrorMessage);\r
+ }\r
+ catch (e) {\r
+ error("loadSettings: GetList() failed: " + e + ', line ' + e.line);\r
+ return;\r
+ }\r
+ var entry = result.ReturnValue.getNext();\r
+ if (entry != undefined) {\r
+ log("Loading Settings...");\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
+ if (key == null || value == null || config[key] == null) {\r
+ log('Warning: unknown or invalid setting: ' + stringlist[i]);\r
+ continue;\r
+ }\r
+ log('stringlist[' + i + ']: ' + key + '=\'' + value + '\'');\r
+ if (config[key].Type == 'Int') {\r
+ config[key].Value = Number(value);\r
+ if (isNaN(config[key].Value))\r
+ config[key].Value = config[key].Default;\r
+ }\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
+ if (isNaN(config[key].Value))\r
+ config[key].Value = config[key].Default;\r
+ }\r
+ 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
+ }\r
+ else {\r
+ log("Settings already cached and did not change");\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
+ item.Summary += key + "=" + config[key].Value.toString() + "|";\r
+ else if (config[key].Type == 'String')\r
+ item.Summary += key + "=" + config[key].Value + "|";\r
+ else if (config[key].Type == 'Bool')\r
+ item.Summary += key + "=" + (config[key].Value ? 'true' : 'false') + "|";\r
+ else if (config[key].Type == 'Enum')\r
+ item.Summary += key + "=" + config[key].Value + "|";\r
+ else if (config[key].Type == 'UID')\r
+ item.Summary += key + "=" + config[key].Value.toString() + "|";\r
+ else if (config[key].Type == 'Array')\r
+ item.Summary += key + "=" + config[key].Value.join("^") + "|";\r
+ }\r
+ settingsCache = item.Summary;\r
+ \r
+ var criteria = new Object();\r
+ criteria.Type = "CalendarEntry";\r
+ criteria.Item = item;\r
+\r
+ log("Saving settings to calendar entry: " + item.Summary);\r
+ try {\r
+ var result = calendarService.IDataSource.Add(criteria);\r
+ if (result.ErrorCode)\r
+ throw(result.ErrorMessage);\r
+ } catch (e) {\r
+ error("saveSettings: " + e + ', line ' + e.line);\r
+ }\r
+ \r
+ lastReloadTime = null; // force calendar data reload on next update\r
+ clearUpdateTimer();\r
+ setUpdateTimer();\r
+}\r
+\r
+function toggleVisibility(elementId)\r
+{\r
+ if (document.getElementById(elementId).style.display == "none")\r
+ document.getElementById(elementId).style.display = "block";\r
+ else\r
+ document.getElementById(elementId).style.display = "none";\r
+}\r
+\r
+var uniqueId = 0;\r
+function printHintBox(text)\r
+{\r
+ uniqueId++;\r
+ return '<td width="1%" align="right" onclick="javascript:toggleVisibility(\'info' + uniqueId + '\')">' + getLocalizedText('settings.help') + '</td></tr></table>'+\r
+ '<div class="settingsInfo" id="info' + uniqueId + '">' + text + '</div>';\r
+}\r
+\r
+function showAbout()\r
+{\r
+ mode = 3;\r
+ hideViews();\r
+ document.getElementById("aboutView").style.display = "block";\r
+ document.onclick = null;\r
+ \r
+ window.menu.setLeftSoftkeyLabel(" ", function(){});\r
+ window.menu.setRightSoftkeyLabel(getLocalizedText('softkey.back'), function()\r
+ {\r
+ mode = 1;\r
+ showFullscreen();\r
+ });\r
+ \r
+ //document.getElementById("aboutView").innerHTML = 'aboutView';\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
+\r
+function showFullscreen()\r
+{\r
+ log("showFullscreen()");\r
+ hideViews();\r
+ document.getElementById("fullscreenView").style.display = "block";\r
+ document.getElementById('body').className = "backgroundFullscreen";\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
+ else\r
+ bgImage = 'C:/Data/background_' + panelNum + '_' + orientation + '.png';\r
+ return bgImage;\r
+}\r
+\r
+function updateHomescreen()\r
+{\r
+ if (config['useBackgroundImage'].Value) {\r
+ // check if we have a completely unknown screen resolution\r
+ var screenHeight = screen.height;\r
+ var screenWidth = screen.width;\r
+ if (screenHeight != 640 && screenHeight != 480 && screenHeight != 360)\r
+ screenHeight = 360; // we can only assume we're in portrait mode, so we set the screen dims as needed for the following code\r
+ if (screenWidth != 640 && screenWidth != 480 && screenWidth != 360)\r
+ screenWidth = 640; // we can only assume we're in portrait mode, so we set the screen dims as needed for the following code\r
+ \r