1 <?xml version=
"1.0" encoding=
"UTF-8"?>
2 <!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns=
"http://www.w3.org/1999/xhtml">
6 <title>Coming Next
</title>
8 <style type=
"text/css">
9 .background { color:#ffffff; background-color:#
000000 } /* Defines the background of the widget. If you want to use a background image, set useBackgroundImage = true below */
10 /* for the default themes, black, gray, and light blue, codes are #
292029, #e7dfe7, #
009aef */
11 .backgroundFullscreen { color:#ffffff; background-color:#
000000 } /* Same as background but for the fullscreen version of the widget */
12 .weekDay { } /* Defines the appearance of all week day texts */
13 .date { } /* Defines the appearance of all date texts */
14 .today { color:#ff0000; } /* Defines the appearance of
"Today" text */
15 .tomorrow { color:#
0000ff; } /* Defines the appearance of
"Tomorrow" text */
16 .time { } /* Defines the appearance of all time texts */
17 .now { color:#ff00ff; } /* Defines the appearance of
"Now" text */
18 .description { } /* Defines the appearance of all event descriptions */
19 .icon { width:
15px; height:
15px; } /* Defines size and appearance of icons */
23 var monthRange =
2; // number of months to include in the event list
24 var includeTodos = true; // disable to remove ToDos from event list
25 var useBackgroundImage = true; // use background_portrait.png and background_landscape.png to fake transparency. Set to
"false" to use a solid background color
26 var showCombinedDateTime = false;// only show the time for events happening today, otherwise just show the date
27 var showLocation = true; // show the location for meeting events
28 var showTodayAsText = true; // if enabled, the current date will be shown as
"Today" instead of
"31.12"
29 var todayText = 'Today'; // text to display for
"Today"
30 var tomorrowText = 'Tomorrow'; // text to display for
"Tomorrow"
31 var showNowAsText = true; // if enabled, the appointment time will be shown as
"Now" instead of
"12:00"
32 var nowText = 'Now'; // text to display for
"Now"
33 var dateSeparator = '.'; // separator for dates. e.g.
"31.12" or
"31/12"
34 var dateFormat = 'auto' // how dates will be displayed. 'auto' will autodetect your phone's date format setting. 'MMDD' will write month first, 'DDMM' will write day first
35 var weekDayLength =
2; // defines how many characters of the weekday will be shown. E.g.
2 will cut
"Friday" to
"Fr"
36 var updateDataInterval =
5; // how many minutes to wait before updating the displayed data. The higher the number, the less battery is used
37 var calendarApp =
0x10005901; // UID of the calendar app to run when clicking the widget.
0x10005901 = buildin calendar,
0x20004ec1 = Epocware Handy Calendar
38 var eventsPerWidget =
4; // number of events to show per widget. Default is
4
39 var showNothingText = true; // if set to
"true", show a text if no events are in the list
40 var nothingText = 'No further events within ' + monthRange + ' months'; // text to show when no events are in the list
41 var enableDaylightSaving = true;// enable this if you are in a timezone that has daylight saving time (+
1h)
43 var cssStyle_background =
"color:#ffffff; background-color:#000000"; // Defines the background of the widget. If you want to use a background image, set useBackgroundImage = true below. For the default themes, black, gray, and light blue, codes are #
292029, #e7dfe7, #
009aef
44 var cssStyle_backgroundFullscreen =
"color:#ffffff; background-color:#000000"; // Same as background but for the fullscreen version of the widget
45 var cssStyle_weekDay =
""; // Defines the appearance of all week day texts
46 var cssStyle_date =
""; // Defines the appearance of all date texts
47 var cssStyle_today =
"color:#ff0000"; // Defines the appearance of
"Today" text
48 var cssStyle_tomorrow =
"color:#0000ff"; // Defines the appearance of
"Tomorrow" text
49 var cssStyle_time =
""; // Defines the appearance of all time texts
50 var cssStyle_now =
"color:#ff00ff"; // Defines the appearance of
"Now" text
51 var cssStyle_description =
""; // Defines the appearance of all event descriptions
52 var cssStyle_icon =
"width:15px; height:15px"; // Defines size and appearance of icons
54 //-------------------------------------------------------
55 // Nothing of interest from here on...
56 //-------------------------------------------------------
57 var panelNum =
0; // use
1 for second panel
59 var calendarService = null;
60 var cacheEntriesHtml = [];
61 var months_translated = [];
64 var mode =
0; //
0 = homescreen,
1 = fullscreen,
2 = settings,
3 = about
66 // vars for daylight saving time
67 var daylightsavingWinter =
0;
68 var daylightsavingSummer =
0;
69 var summertime = false;
72 window.onresize = updateScreen;
73 window.onshow = updateScreen;
75 function isLeapYear( year ) {
76 if (( year %
4 ==
0 && year %
100 !=
0 ) || year %
400 ==
0 )
82 function calcLeapYear(year, days)
90 function subToSunday(myDate, year, days, prevMonthDays)
92 for (i = myDate.getDay(); i
> 0 ;i--)
94 days -= prevMonthDays;
95 days = isLeapYear(year) ? --days : days;
99 function calcDaylightSaving()
101 var thisYearS = new Date(now.getFullYear(),
3,
0,
0,
0,
0 );
102 var thisYearW = new Date(now.getFullYear(),
10,
0,
0,
0,
0 );
103 var nextYearS = new Date(now.getFullYear() +
1,
3,
0,
0,
0,
0 );
104 var nextYearW = new Date(now.getFullYear() +
1,
10,
0,
0,
0,
0 );
108 thisYearSDays = nextYearSDays =
90;
109 thisYearWDays = nextYearWDays =
304;
111 thisYearSDays = calcLeapYear(now.getFullYear(), thisYearSDays);
112 thisYearWDays = calcLeapYear(now.getFullYear(), thisYearWDays);
113 nextYearSDays = calcLeapYear(now.getFullYear() +
1, nextYearSDays);
114 nextYearWDays = calcLeapYear(now.getFullYear() +
1, nextYearWDays);
116 thisYearSDays = subToSunday(thisYearS, now.getFullYear(), thisYearSDays,
59);
117 thisYearWDays = subToSunday(thisYearW, now.getFullYear(), thisYearWDays,
273);
118 nextYearSDays = subToSunday(nextYearS, now.getFullYear() +
1, nextYearSDays,
59);
119 nextYearWDays = subToSunday(nextYearW, now.getFullYear() +
1, nextYearWDays,
273);
121 daylightsavingSummer = new Date (now.getFullYear(),
03-
1, thisYearSDays,
2,
0,
0);
122 daylightsavingWinter = new Date (now.getFullYear(),
10-
1, thisYearWDays,
2,
0,
0);
123 if (daylightsavingSummer < now) {
124 daylightsavingSummer = new Date (now.getFullYear()+
1,
03-
1, nextYearSDays,
2,
0,
0);
127 if (daylightsavingWinter < now) {
128 daylightsavingWinter = new Date (now.getFullYear()+
1,
10-
1, nextYearWDays,
2,
0,
0);
131 if (summer && !winter)
137 function error(message)
139 console.info('Error: ' + message);
140 document.getElementById(
"calendarList").innerHTML = 'Error: ' + message;
143 function isToday(date)
145 if (date.getDate() == now.getDate() && date.getMonth() == now.getMonth())
150 function isTomorrow(date)
152 if ((date.getDate() == now.getDate() +
1 && date.getMonth() == now.getMonth()) ||
153 (date.getDate() ==
0 && date.getMonth() == now.getMonth() +
1) ||
154 (date.getDate() ==
0 && date.getMonth() == now.getMonth() +
1 && date.getYear() == now.getYear() +
1))
159 function collectLocales()
161 var tmpyear = ((panelNum ==
0) ?
2000 :
2001);
164 if (months_translated.length
> 0)
166 for (month =
0; month <
12; month++) {
167 var startDate = new Date(tmpyear, month,
15);
169 var item = new Object();
170 item.Type =
"DayEvent";
171 item.StartTime = startDate;
172 item.Summary =
"__temp" + month;
174 var criteria = new Object();
175 criteria.Type =
"CalendarEntry";
176 criteria.Item = item;
179 var result = calendarService.IDataSource.Add(criteria);
180 if (result.ErrorCode)
181 error(result.ErrorMessage);
183 error(
"collectLocales: " + e + ', line ' + e.line);
187 var startTime = new Date(tmpyear,
0,
1);
188 var endTime = new Date(tmpyear,
11,
31);
189 var listFiltering = {
190 Type:'CalendarEntry',
192 StartRange: startTime,
194 SearchText: '__temp',
198 var result = calendarService.IDataSource.GetList(listFiltering);
199 if (result.ErrorCode) {
200 error(result.ErrorMessage);
203 var list = result.ReturnValue;
205 error(e + ', line ' + e.line);
208 var ids = new Array();
214 while (list && (entry = list.getNext()) != undefined) {
215 dateArr = entry.StartTime.replace(/,/g,'').replace(/\./g,':').replace(/ /g,' ').split(' ');
216 var day = dateArr[
1];
217 var month = dateArr[
2];
218 var year = dateArr[
3];
220 // make sure month is set properly
221 if (isNaN(parseInt(day))) {
225 } else if (isNaN(parseInt(year))) {
231 console.info(entry.StartTime + ' -
> ' + month + ' ' + counter);
232 ids[counter] = entry.id;
233 months_translated[month] = counter +
1;
237 error(e + ', line ' + e.line);
242 var criteria = new Object();
243 criteria.Type =
"CalendarEntry";
248 var result = calendarService.IDataSource.Delete(criteria);
249 if (result.ErrorCode)
250 error(result.ErrorMessage);
252 error('deleting temp calendar entries:' + e + ', line ' + e.line);
257 function requestNotification()
259 var criteria = new Object();
260 criteria.Type =
"CalendarEntry";
263 var result = calendarService.IDataSource.RequestNotification(criteria, callback);
264 if (result.ErrorCode)
265 error('loading Calendar items list');
267 error(
"requestNotification: " + e + ', line ' + e.line);
271 function callback(transId, eventCode, result)
276 function parseDate(dateString)
279 Dates my look very differently. Also keep in mind that the names are localized!!! These are the possibilities depending on the users date format setting:
280 Wednesday,
26 August,
2009 24:
00:
00
281 Wednesday,
26 August,
2009 12:
00:
00 am
282 Wednesday, August
26,
2009 12:
00:
00 am
283 Wednesday,
2009 August,
26 12:
00:
00 am
284 Wednesday,
2009 August,
28 8.00.00 pm
285 Wednesday,
2009 August,
28 08:
00:
00 PM
288 if (dateString ==
"" || dateString == null)
290 var dateArr = dateString.replace(/,/g,'').replace(/\./g,':').replace(/ /g,' ').split(' ');
291 if (dateArr.length !=
5 && dateArr.length !=
6)
295 var weekDay = dateArr[
0];
296 var day = dateArr[
1];
297 var month = dateArr[
2];
298 var year = dateArr[
3];
299 // make sure month is set properly
300 if (isNaN(parseInt(day))) {
304 } else if (isNaN(parseInt(year))) {
309 // make sure day and year are set properly
310 if (Number(day)
> Number(year)) {
315 month = months_translated[month];
318 var timeArr = dateArr[
4].split(':');
319 if (timeArr.length !=
3)
321 var hours = Number(timeArr[
0]);
322 var minutes = Number(timeArr[
1]);
323 var seconds = Number(timeArr[
2]);
324 if (dateArr.length ==
6 && dateArr[
5].toLowerCase() == 'pm' && hours <
12)
326 if (dateArr.length ==
6 && dateArr[
5].toLowerCase() == 'am' && hours ==
12)
329 console.info('year=' + year + ' month=' + month + ' day=' + day + ' hours=' + hours + ' minutes=' + minutes+ ' seconds=' + seconds);
331 // take care of daylight saving time
332 if (enableDaylightSaving) {
333 var date = new Date(year, month -
1, day, hours, minutes, seconds);
334 if (summertime && date
> daylightsavingWinter && date < daylightsavingSummer)
336 else if (!summertime && date
> daylightsavingSummer && date < daylightsavingWinter)
340 return new Date(year, month -
1, day, hours, minutes, seconds);
343 // returns a short date as string (
"31.12" or
"12.31") based on the format string which should look like
"Wednesday, 26 August, 2009 12:00:00 am"
344 function formatDate(date, format)
346 var day = date.getDate().toString();
347 var month = (date.getMonth() +
1).toString();
348 while (day.length <
2) { day = '
0' + day; }
349 while (month.length <
2) { month = '
0' + month; }
351 if (showTodayAsText && isToday(date))
352 return '
<span class=
"today">' + todayText + '
</span>';
353 if (showTodayAsText && isTomorrow(date))
354 return '
<span class=
"tomorrow">' + tomorrowText + '
</span>';
356 var dateArr = format.replace(/,/g,'').replace(/\./g,':').replace(/ /g,' ').split(' ');
357 if (dateArr.length !=
5 && dateArr.length !=
6) {
358 // we don't know how to format this
359 if (dateFormat == 'auto' || dateFormat == 'DDMM')
360 return day + dateSeparator + month;
362 return month + dateSeparator + day;
366 if (dateFormat == 'MMDD')
368 else if (dateFormat == 'DDMM')
371 // dateFormat == 'auto', try to detect system setting
373 var day_ = dateArr[
1];
374 var month_ = dateArr[
2];
375 var year_ = dateArr[
3];
376 // make sure month is set properly
377 if (isNaN(parseInt(day_))) {
382 } else if (isNaN(parseInt(year_))) {
388 // make sure day and year are set properly
389 if (Number(day_)
> Number(year_))
394 return day + dateSeparator + month;
396 return month + dateSeparator + day;
399 function formatTime(date)
401 // date is a Date() object
402 date.setSeconds(
0); // we don't care about seconds
403 var time = date.toLocaleTimeString().replace(/[\.:]
00/, ''); // remove seconds from string
404 if (time.replace(/\./, ':').split(':')[
0].length <
2)
406 if (showNowAsText && date.getTime() == now.getTime())
407 time = '
<span class=
"now">' + nowText + '
</span>';
411 function updateData()
413 calcDaylightSaving();
415 // meetings have time
416 // note: anniveraries have a start time of
12:
00am. So since we want to include them, we have to query the whole day and check if events have passed later
418 var meetingListFiltering = {
419 Type:'CalendarEntry',
421 StartRange: (new Date(now.getFullYear(), now.getMonth(), now.getDate(),
0,
0,
0)),
422 EndRange: (new Date(now.getFullYear(), now.getMonth() + monthRange, now.getDate(),
0,
0,
0))
425 var meetingResult = calendarService.IDataSource.GetList(meetingListFiltering);
426 var meetingList = meetingResult.ReturnValue;
428 // todos don't, they start on
00:
00 hrs., but should be visible anyway
429 // this will generate a list of passed todos. We have to check if they have been marked as
"done" yet
431 var todayTodoListFiltering = {
432 Type:'CalendarEntry',
435 StartRange: (new Date(now.getFullYear() -
1, now.getMonth(), now.getDate(),
0,
0,
0)),
436 EndRange: (new Date(now.getFullYear(), now.getMonth(), now.getDate(),
0,
0,
1))
439 var todayTodoResult = calendarService.IDataSource.GetList(todayTodoListFiltering);
440 var todayTodoList = todayTodoResult.ReturnValue;
441 var entryLists = [todayTodoList, meetingList];
443 var entryLists = [meetingList];
446 error('loading Calendar items list:' + e + ', line ' + e.line);
455 var entriesHtml = '
<table>';
459 max = ((panelNum ==
0) ? eventsPerWidget :
2 * eventsPerWidget);
461 max =
30; // we can display a lot more events in fullscreen mode
463 // the first outer loop iteration is for passed ToDos, the second loop is for all upcomming events (may also include ToDos)
464 for (var i=
0; counter < max && i < entryLists.length; i++) {
465 while (counter < max && (entry = entryLists[i].getNext()) != undefined) {
468 // output event info for debugging
470 'event: Id=' + entry.id +
471 ',Type=' + entry.Type +
472 ',Summary=' + entry.Summary +
473 ',Location=' + entry.Location +
474 ',Status=' + entry.Status +
475 ',StartTime=' + entry.StartTime +
476 ',EndTime=' + entry.EndTime +
477 ',InstanceStartTime=' + entry.InstanceStartTime +
478 ',InstanceEndTime=' + entry.InstanceEndTime
481 // we don't want ToDos when includeTodos == false or when they are completed
482 if (entry.Type == 'ToDo' && (entry.Status ==
"TodoCompleted" || !includeTodos)) {
483 console.info('skipping ' + entry.id );
488 // make sure that we don't include an event twice (useful for ToDos that might come up twice)
489 if (eventIds[entry.id] ==
1) {
490 console.info('skipped (already included) ' + entry.id);
494 eventIds[entry.id] =
1;
496 // summary can be undefined!
497 var Summary = ((entry.Summary == null) ? '' : entry.Summary);
498 if (entry.Type == 'Meeting' && entry.Location != '' && showLocation)
499 Summary += ', ' + entry.Location;
501 // fix by yves: determine start and end dates/times
502 entryStartTime = ((entry.InstanceStartTime == null) ? entry.StartTime : entry.InstanceStartTime);
503 entryEndTime = ((entry.InstanceEndTime == null) ? entry.EndTime : entry.InstanceEndTime);
505 // there can be ToDos that have no date at all!
506 if (entry.Type == 'ToDo' && entry.EndTime == null)
507 entryDate =
""; // this will cause parseDate(entryDate) to return null;
509 entryDate = ((entry.Type == 'ToDo') ? entryEndTime : entryStartTime); // ToDo's use their EndTime, the rest use StartTime
511 // Convert date/time string to Date object
512 var date = parseDate(entryDate);
513 console.info('date: ' + date);
514 var endDate = ((entryEndTime == null) ? null : parseDate(entryEndTime));
515 console.info('endDate: ' + endDate);
517 // check if meeting event has already passed
518 if (entry.Type == 'Meeting') {
519 var compareTime = ((endDate == null) ? date.getTime() : endDate.getTime());
520 if (now.getTime()
> compareTime) {
521 console.info('skipping Meeting (already passed) ' + entry.id);
523 eventIds[entry.id] =
0;
528 // check if anniversary passed (not sure why they are in the list, the query was only for today - nokia?)
529 if (entry.Type == 'Anniversary') {
530 var tmp = new Date(now.getFullYear(), now.getMonth(), now.getDate(),
0,
0,
0);
531 if (date.getTime() < tmp.getTime()) {
532 console.info('skipping Anniversary (already passed) ' + entry.id);
534 eventIds[entry.id] =
0;
539 // fix DayEvents end time. End times are off by
1 Second. It's possible that the event has already passed
540 if (entry.Type == 'DayEvent' && endDate != null) {
541 endDate.setMinutes(endDate.getMinutes() -
1);
542 console.info('fixing DayEvent endDate: ' + endDate);
543 if (now.getTime()
> endDate.getTime()) {
544 console.info('event already passed ' + entry.id);
546 eventIds[entry.id] =
0;
551 // check if the event is currently taking place
552 if (entryStartTime != null && entryEndTime != null && date != null && endDate != null) {
553 // check if we are between start and endtime
554 if ((date.getTime() < now.getTime()) && (now.getTime() < endDate.getTime())) {
555 date = now; // change appointment date/time to now
556 console.info('event is currently taking place: ' + date);
560 // skip events for the first panel in case this is the second one and we're not in fullscreen mode
561 if (mode ==
0 && panelNum ==
1 && counter < eventsPerWidget +
1) {
562 console.info('skipping (already in first widget) ' + entry.id);
566 // generate html output
567 entriesHtml += '
<tr><td><img class=
"icon" src=
"' + entry.Type + '.png" /></td>';
569 // some languages have very strange locale date formats, can't parse all those. Also some todos don't have dates at all.
570 entriesHtml += '
<td colspan=
"4"><span class=
"date">' + entryDate + '
</span> ';
572 var weekDay = date.toLocaleDateString().substr(
0,weekDayLength);
573 var time = formatTime(date);
574 var dateStr = formatDate(date, entryDate);
575 if (entry.Type == 'ToDo' || entry.Type == 'Anniversary' || entry.Type == 'DayEvent' || entry.Type == 'Reminder') {
576 if ((isToday(date) || isTomorrow(date)) && showTodayAsText) // show weekday if the date string is not text. looks odd otherwise
577 entriesHtml += '
<td colspan=
"4" width=
"1px"><span class=
"date">' + dateStr + '
</span> ';
579 entriesHtml += '
<td class=
"weekDay" width=
"1px">' + weekDay + '
</td><td width=
"1px" class=
"date">' + dateStr + '
</td><td colspan=
"2">';
580 } else if (entry.Type == 'Meeting') {
581 if (showCombinedDateTime) {
583 entriesHtml += '
<td width=
"1px" colspan=
"4"><span class=
"today">' + time + '
</span> ';
584 else if (isTomorrow(date))
585 entriesHtml += '
<td width=
"1px" colspan=
"4"><span class=
"tomorrow">' + dateStr + '
</span> <span class=
"time">' + time + '
</span> ';
587 entriesHtml += '
<td width=
"1px" class=
"weekDay">' + weekDay + '
</td><td width=
"1px" class=
"date">' + dateStr + '
</td><td colspan=
"2">';
589 if ((isToday(date) || isTomorrow(date)) && showTodayAsText)
590 entriesHtml += '
<td colspan=
"4" width=
"1px"><span class=
"today">' + dateStr + '
</span> <span class=
"time">' + time + '
</span> ';
592 entriesHtml += '
<td width=
"1px" class=
"weekDay">' + weekDay + '
</td><td width=
"1px" class=
"date">' + dateStr + '
</td><td width=
"1px" class=
"time">' + time + '
</td><td>';
596 entriesHtml += '
<span class=
"description">' + Summary + '
</span></td></tr>';
599 entriesHtml += '
</table>';
600 if (showNothingText && entriesHtml == '
<table></table>')
601 entriesHtml = '
<div style=
"width:295px; height:75px; text-align:center; line-height:75px; overflow:visible;">' + nothingText + '
</div>';
602 if (cacheEntriesHtml != entriesHtml) {
604 document.getElementById('calendarList').innerHTML = entriesHtml;
606 document.getElementById('fullscreenCalendarList').innerHTML = entriesHtml;
607 cacheEntriesHtml = entriesHtml;
610 error('displaying list:' + e + ', line ' + e.line);
615 function updateScreen()
617 // check if opening fullscreen
618 if( window.innerHeight
> 91 && mode ==
0) {
620 cacheEntriesHtml = '';
621 document.getElementById('body').style.backgroundImage =
"";
624 else if (window.innerHeight <=
91 && mode !=
0) {
626 cacheEntriesHtml = '';
636 function launchCalendar()
639 widget.openApplication(calendarApp,
"");
642 error('starting Calendar App');
650 // call calendar service
651 calendarService = device.getServiceObject(
"Service.Calendar",
"IDataSource");
653 error('loading Calendar service');
661 requestNotification();
662 window.setInterval('updateData()',
1000 *
60 * updateDataInterval);
667 if (useBackgroundImage)
668 // check for screen rotation every
3 secs
669 window.setInterval('updateScreen()',
1000 *
3);
672 function createMenu()
674 window.menu.setLeftSoftkeyLabel(
"",null);
675 window.menu.setRightSoftkeyLabel(
"",null);
677 var menuSettings = new MenuItem(
"Settings", id++);
678 var menuCallApp = new MenuItem(
"Open Calendar App", id++);
679 var menuAbout = new MenuItem(
"About", id++);
680 menuSettings.onSelect = showSettings;
681 menuAbout.onSelect = showAbout;
682 menuCallApp.onSelect = launchCalendar;
684 window.menu.append(menuCallApp);
685 window.menu.append(menuSettings);
686 window.menu.append(menuAbout);
689 function showSettings()
692 document.getElementById(
"homescreenView").style.display =
"none";
693 document.getElementById(
"fullscreenView").style.display =
"none";
694 document.getElementById(
"aboutView").style.display =
"none";
695 document.getElementById(
"settingsView").style.display =
"block";
696 document.onclick = null;
698 window.menu.setLeftSoftkeyLabel(
"Save", function()
700 //document.forms[
0].elements[
"settings.monthRange"].value = monthRange;
701 monthRange = parseInt(document.forms[
0].elements[
"settings.monthRange"].value);
702 if (monthRange <
0 || monthRange
> 100)
704 includeTodos = document.forms[
0].elements[
"settings.includeTodos"].checked;
705 useBackgroundImage = document.forms[
0].elements[
"settings.useBackgroundImage"].checked;
706 showCombinedDateTime = document.forms[
0].elements[
"settings.showCombinedDateTime"].checked;
707 showLocation = document.forms[
0].elements[
"settings.showLocation"].checked;
708 showTodayAsText = document.forms[
0].elements[
"settings.showTodayAsText"].checked;
709 todayText = document.forms[
0].elements[
"settings.todayText"].value;
710 tomorrowText = document.forms[
0].elements[
"settings.tomorrowText"].value;
711 showNowAsText = document.forms[
0].elements[
"settings.showNowAsText"].checked;
712 nowText = document.forms[
0].elements[
"settings.nowText"].value;
713 dateSeparator = document.forms[
0].elements[
"settings.dateSeparator"].value;
714 dateFormat = document.forms[
0].elements[
"settings.dateFormat"].value;
715 if (dateFormat != 'auto' && dateFormat != 'DDMM' && dateFormat != 'MMDD')
717 weekDayLength = Number(parseInt(document.forms[
0].elements[
"settings.weekDayLength"].value));
718 if (weekDayLength <
0 || weekDayLength
> 20)
720 updateDataInterval = parseInt(document.forms[
0].elements[
"settings.updateDataInterval"].value);
721 if (updateDataInterval <
1 || updateDataInterval
> 1000)
722 updateDataInterval =
5;
723 calendarApp = parseInt(document.forms[
0].elements[
"settings.calendarApp"].value);
724 eventsPerWidget = parseInt(document.forms[
0].elements[
"settings.eventsPerWidget"].value);
725 if (eventsPerWidget <
1 || eventsPerWidget
> 10)
727 showNothingText = document.forms[
0].elements[
"settings.showNothingText"].checked;
728 nothingText = document.forms[
0].elements[
"settings.nothingText"].value;
729 enableDaylightSaving = document.forms[
0].elements[
"settings.enableDaylightSaving"].checked;
731 cssStyle_background = document.forms[
0].elements[
"settings.cssStyle_background"].value;
732 cssStyle_backgroundFullscreen = document.forms[
0].elements[
"settings.cssStyle_backgroundFullscreen"].value;
733 cssStyle_weekDay = document.forms[
0].elements[
"settings.cssStyle_weekDay"].value;
734 cssStyle_date = document.forms[
0].elements[
"settings.cssStyle_date"].value;
735 cssStyle_today = document.forms[
0].elements[
"settings.cssStyle_today"].value;
736 cssStyle_tomorrow = document.forms[
0].elements[
"settings.cssStyle_tomorrow"].value;
737 cssStyle_time = document.forms[
0].elements[
"settings.cssStyle_time"].value;
738 cssStyle_now = document.forms[
0].elements[
"settings.cssStyle_now"].value;
739 cssStyle_description = document.forms[
0].elements[
"settings.cssStyle_description"].value;
740 cssStyle_icon = document.forms[
0].elements[
"settings.cssStyle_icon"].value;
749 window.menu.setRightSoftkeyLabel(
"Cancel", function()
755 document.getElementById(
"settingsList").innerHTML =
757 '
<table><tr><td>Month Range:
<br><input class=
"textInput" name=
"settings.monthRange" type=
"text" value=
"' + monthRange + '" /></td>' + printHintBox('number of months to include in the event list') +
758 '
<hr><table><tr><td>Include ToDos:
<br><input name=
"settings.includeTodos" type=
"checkbox" value=
"true" ' + (includeTodos ? '
checked=
"checked"' : '') + '
/></td>' + printHintBox('disable to remove ToDos from event list') +
759 '
<hr><table><tr><td>Use Background Image:
<br><input name=
"settings.useBackgroundImage" type=
"checkbox" value=
"true" ' + (useBackgroundImage ? '
checked=
"checked"' : '') + '
/></td>' + printHintBox('use background_portrait.png and background_landscape.png to fake transparency. Disable to use a solid background color') +
760 '
<hr><table><tr><td>Show Combined Date & Time:
<br><input name=
"settings.showCombinedDateTime" type=
"checkbox" value=
"true" ' + (showCombinedDateTime ? '
checked=
"checked"' : '') + '
/></td>' + printHintBox('only show the time for events happening today, otherwise just show the date') +
761 '
<hr><table><tr><td>Show Location:
<br><input name=
"settings.showLocation" type=
"checkbox" value=
"true" ' + (showLocation ? '
checked=
"checked"' : '') + '
/></td>' + printHintBox('show the location for meeting events') +
762 '
<hr><table><tr><td>Show Today As Text:
<br><input name=
"settings.showTodayAsText" type=
"checkbox" value=
"true" ' + (showTodayAsText ? '
checked=
"checked"' : '') + '
/></td>' + printHintBox('if enabled, the current date will be shown as
"Today" instead of
"31.12"') +
763 '
<hr><table><tr><td>"Today" Text:
<br><input class=
"textInput" name=
"settings.todayText" type=
"text" value=
"' + todayText + '" /></td>' + printHintBox('text to display for
"Today"') + '
</tr>' +
764 '
<hr><table><tr><td>"Tomorrow" Text:
<br><input class=
"textInput" name=
"settings.tomorrowText" type=
"text" value=
"' + tomorrowText + '" /></td>' + printHintBox('text to display for
"Tomorrow"') +
765 '
<hr><table><tr><td>Show
"Now" As Text:
<br><input name=
"settings.showNowAsText" type=
"checkbox" value=
"true" ' + (showNowAsText ? '
checked=
"checked"' : '') + '
/></td>' + printHintBox('if enabled, the appointment time will be shown as
"Now" instead of
"12:00"') +
766 '
<hr><table><tr><td>"Now" Text:
<br><input class=
"textInput" name=
"settings.nowText" type=
"text" value=
"' + nowText + '" /></td>' + printHintBox('text to display for
"Now"') +
767 '
<hr><table><tr><td>Date Separator:
<br><input class=
"textInput" name=
"settings.dateSeparator" type=
"text" value=
"' + dateSeparator + '" /></td>' + printHintBox('separator for dates. e.g.
"31.12" or
"31/12"') +
768 '
<hr><table><tr><td>Date Format:
<br><select name=
"settings.dateFormat" size=
"1">' +
769 '
<option label=
"auto detect"' + (dateFormat == 'auto' ? '
selected=
"selected"' : '') + '
>auto
</option>' +
770 '
<option label=
"MMDD"' + (dateFormat == 'MMDD' ? '
selected=
"selected"' : '') + '
>MMDD
</option>' +
771 '
<option label=
"DDMM"' + (dateFormat == 'DDMM' ? '
selected=
"selected"' : '') + '
>DDMM
</option>' +
772 '
</select></div>' + printHintBox('how dates will be displayed. \'auto\' will autodetect your phone\'s date format setting. \'MMDD\' will write month first, \'DDMM\' will write day first') + '
</tr>' +
773 '
<hr><table><tr><td>Weekday Length:
<br><input class=
"textInput" name=
"settings.weekDayLength" type=
"text" value=
"' + weekDayLength + '" /></td>' + printHintBox('defines how many characters of the weekday will be shown. E.g.
2 will cut
"Friday" to
"Fr"') +
774 '
<hr><table><tr><td>Update Data Interval:
<br><input class=
"textInput" name=
"settings.updateDataInterval" type=
"text" value=
"' + updateDataInterval + '" /></td>' + printHintBox('how many minutes to wait before updating the displayed data. The higher the number, the less battery is used') +
775 '
<hr><table><tr><td>Calendar Application UID:
<br><input class=
"textInput" name=
"settings.calendarApp" type=
"text" value=
"0x' + calendarApp.toString(16) + '" /></td>' + printHintBox('UID of the calendar app to run when clicking the widget.
0x10005901 = buildin calendar,
0x20004ec1 = Epocware Handy Calendar') +
776 '
<hr><table><tr><td>Events Per Widget:
<br><input class=
"textInput" name=
"settings.eventsPerWidget" type=
"text" value=
"' + eventsPerWidget + '" /></td>' + printHintBox('number of events to show per widget. Default is
4') +
777 '
<hr><table><tr><td>Show Nothing Text:
<br><input name=
"settings.showNothingText" type=
"checkbox" value=
"true" ' + (showNothingText ? '
checked=
"checked"' : '') + '
/></td>' + printHintBox('if enabled, show a text if no events are in the list') +
778 '
<hr><table><tr><td>"nothing" Text:
<br><input class=
"textInput" name=
"settings.nothingText" type=
"text" value=
"' + nothingText + '" /></td>' + printHintBox('text to show when no events are in the list') +
779 '
<hr><table><tr><td>Enable Daylight Saving:
<br><input name=
"settings.enableDaylightSaving" type=
"checkbox" value=
"true" ' + (enableDaylightSaving ? '
checked=
"checked"' : '') + '
/></td>' + printHintBox('enable this if you are in a timezone that has daylight saving time (+
1h)') +
780 '
<hr style=
"margin-bottom:60px;"><h1 class=
"title">CSS Styles
</h1>' +
781 '
<hr><table><tr><td>.background:
<br><input class=
"textInput" name=
"settings.cssStyle_background" type=
"text" value=
"' + cssStyle_background + '" /></td>' + printHintBox('Defines the background of the widget. If you want to use a background image, enable
"useBackgroundImage" instead. For the default themes, black, gray, and light blue, codes are #
292029, #e7dfe7, #
009aef') +
782 '
<hr><table><tr><td>.backgroundFullscreen:
<br><input class=
"textInput" name=
"settings.cssStyle_backgroundFullscreen" type=
"text" value=
"' + cssStyle_backgroundFullscreen + '" /></td>' + printHintBox('Same as background but for the fullscreen version of the widget') +
783 '
<hr><table><tr><td>.weekDay:
<br><input class=
"textInput" name=
"settings.cssStyle_weekDay" type=
"text" value=
"' + cssStyle_weekDay + '" /></td>' + printHintBox('Defines the appearance of all week day texts') +
784 '
<hr><table><tr><td>.date:
<br><input class=
"textInput" name=
"settings.cssStyle_date" type=
"text" value=
"' + cssStyle_date + '" /></td>' + printHintBox('Defines the appearance of all date texts') +
785 '
<hr><table><tr><td>.today:
<br><input class=
"textInput" name=
"settings.cssStyle_today" type=
"text" value=
"' + cssStyle_today + '" /></td>' + printHintBox('Defines the appearance of
"Today" text') +
786 '
<hr><table><tr><td>.tomorrow:
<br><input class=
"textInput" name=
"settings.cssStyle_tomorrow" type=
"text" value=
"' + cssStyle_tomorrow + '" /></td>' + printHintBox('Defines the appearance of
"Tomorrow" text') +
787 '
<hr><table><tr><td>.time:
<br><input class=
"textInput" name=
"settings.cssStyle_time" type=
"text" value=
"' + cssStyle_time + '" /></td>' + printHintBox('Defines the appearance of all time texts') +
788 '
<hr><table><tr><td>.now:
<br><input class=
"textInput" name=
"settings.cssStyle_now" type=
"text" value=
"' + cssStyle_now + '" /></td>' + printHintBox('Defines the appearance of
"Now" text') +
789 '
<hr><table><tr><td>.description:
<br><input class=
"textInput" name=
"settings.cssStyle_description" type=
"text" value=
"' + cssStyle_description + '" /></td>' + printHintBox('Defines the appearance of all event descriptions') +
790 '
<hr><table><tr><td>.icon:
<br><input class=
"textInput" name=
"settings.cssStyle_icon" type=
"text" value=
"' + cssStyle_icon + '" /></td>' + printHintBox('Defines size and appearance of icons') +
791 '
<hr style=
"margin-bottom:60px;"><input name=
"reset" type=
"button" value=
"Restore Defaults" onclick=
"javascript:restoreDefaultSettings();showSettings();" />' +
795 function changeCssClass(classname, properties)
797 for(var i =
0; i < document.styleSheets[
0]['cssRules'].length; i++)
799 if (document.styleSheets[
0]['cssRules'][i].selectorText == classname) {
800 document.styleSheets[
0].deleteRule(i);
801 document.styleSheets[
0].insertRule(classname + ' { ' + properties + ' }', document.styleSheets[
0]['cssRules'].length);
807 function updateCssClasses()
809 changeCssClass(
".background", cssStyle_background);
810 changeCssClass(
".backgroundFullscreen", cssStyle_backgroundFullscreen);
811 changeCssClass(
".weekDay", cssStyle_weekDay);
812 changeCssClass(
".date", cssStyle_date);
813 changeCssClass(
".today", cssStyle_today);
814 changeCssClass(
".tomorrow", cssStyle_tomorrow);
815 changeCssClass(
".time", cssStyle_time);
816 changeCssClass(
".now", cssStyle_now);
817 changeCssClass(
".description", cssStyle_description);
818 changeCssClass(
".icon", cssStyle_icon);
821 function restoreDefaultSettings()
825 useBackgroundImage = true;
826 showCombinedDateTime = false;
828 showTodayAsText = true;
830 tomorrowText = 'Tomorrow';
831 showNowAsText = true;
836 updateDataInterval =
5;
837 calendarApp =
0x10005901;
839 showNothingText = true;
840 nothingText = 'No further events within ' + monthRange + ' months';
841 enableDaylightSaving = true;
843 cssStyle_background =
"color:#ffffff; background-color:#000000";
844 cssStyle_backgroundFullscreen =
"color:#ffffff; background-color:#000000";
845 cssStyle_weekDay =
"";
847 cssStyle_today =
"color:#ff0000";
848 cssStyle_tomorrow =
"color:#0000ff";
850 cssStyle_now =
"color:#ff00ff";
851 cssStyle_description =
"";
852 cssStyle_icon =
"width:15px; height:15px";
855 function loadSettings()
857 if (widget.preferenceForKey('monthRange'))
858 monthRange = Number(widget.preferenceForKey('monthRange'));
862 if (widget.preferenceForKey('includeTodos'))
863 includeTodos = (widget.preferenceForKey('includeTodos') == 'true');
867 if (widget.preferenceForKey('useBackgroundImage'))
868 useBackgroundImage = (widget.preferenceForKey('useBackgroundImage') == 'true');
870 useBackgroundImage = true;
872 if (widget.preferenceForKey('showCombinedDateTime'))
873 showCombinedDateTime = (widget.preferenceForKey('showCombinedDateTime') == 'true');
875 showCombinedDateTime = false;
877 if (widget.preferenceForKey('showLocation'))
878 showLocation = (widget.preferenceForKey('showLocation') == 'true');
882 if (widget.preferenceForKey('showTodayAsText'))
883 showTodayAsText = (widget.preferenceForKey('showTodayAsText') == 'true');
885 showTodayAsText = true;
887 if (widget.preferenceForKey('todayText'))
888 todayText = widget.preferenceForKey('todayText');
892 if (widget.preferenceForKey('tomorrowText'))
893 tomorrowText = widget.preferenceForKey('tomorrowText');
895 tomorrowText = 'Tomorrow';
897 if (widget.preferenceForKey('showNowAsText'))
898 showNowAsText = (widget.preferenceForKey('showNowAsText') == 'true');
900 showNowAsText = true;
902 if (widget.preferenceForKey('nowText'))
903 nowText = widget.preferenceForKey('nowText');
907 if (widget.preferenceForKey('dateSeparator'))
908 dateSeparator = widget.preferenceForKey('dateSeparator');
912 if (widget.preferenceForKey('dateFormat'))
913 dateFormat = widget.preferenceForKey('dateFormat');
917 if (widget.preferenceForKey('weekDayLength'))
918 weekDayLength = Number(widget.preferenceForKey('weekDayLength'));
922 if (widget.preferenceForKey('updateDataInterval'))
923 updateDataInterval = Number(widget.preferenceForKey('updateDataInterval'));
925 updateDataInterval =
5;
927 if (widget.preferenceForKey('calendarApp'))
928 calendarApp = Number(widget.preferenceForKey('calendarApp'));
930 calendarApp =
0x10005901;
932 if (widget.preferenceForKey('eventsPerWidget'))
933 eventsPerWidget = Number(widget.preferenceForKey('eventsPerWidget'));
937 if (widget.preferenceForKey('showNothingText'))
938 showNothingText = (widget.preferenceForKey('showNothingText') == 'true');
940 showNothingText = true;
942 if (widget.preferenceForKey('nothingText'))
943 nothingText = widget.preferenceForKey('nothingText');
945 nothingText = 'No further events within ' + monthRange + ' months';
947 if (widget.preferenceForKey('enableDaylightSaving'))
948 enableDaylightSaving = (widget.preferenceForKey('enableDaylightSaving') == 'true');
950 enableDaylightSaving = true;
954 if (widget.preferenceForKey('cssStyle_background'))
955 cssStyle_background = widget.preferenceForKey('cssStyle_background');
957 cssStyle_background =
"color:#ffffff; background-color:#000000";
959 if (widget.preferenceForKey('cssStyle_backgroundFullscreen'))
960 cssStyle_backgroundFullscreen = widget.preferenceForKey('cssStyle_backgroundFullscreen');
962 cssStyle_backgroundFullscreen =
"color:#ffffff; background-color:#000000";
964 if (widget.preferenceForKey('cssStyle_weekDay'))
965 cssStyle_weekDay = widget.preferenceForKey('cssStyle_weekDay');
967 cssStyle_weekDay =
"";
969 if (widget.preferenceForKey('cssStyle_date'))
970 cssStyle_date = widget.preferenceForKey('cssStyle_date');
974 if (widget.preferenceForKey('cssStyle_today'))
975 cssStyle_today = widget.preferenceForKey('cssStyle_today');
977 cssStyle_today =
"color:#ff0000";
979 if (widget.preferenceForKey('cssStyle_tomorrow'))
980 cssStyle_tomorrow = widget.preferenceForKey('cssStyle_tomorrow');
982 cssStyle_tomorrow =
"color:#0000ff";
984 if (widget.preferenceForKey('cssStyle_time'))
985 cssStyle_time = widget.preferenceForKey('cssStyle_time');
989 if (widget.preferenceForKey('cssStyle_now'))
990 cssStyle_now = widget.preferenceForKey('cssStyle_now');
992 cssStyle_now =
"color:#ff00ff";
994 if (widget.preferenceForKey('cssStyle_description'))
995 cssStyle_description = widget.preferenceForKey('cssStyle_description');
997 cssStyle_description =
"";
999 if (widget.preferenceForKey('cssStyle_icon'))
1000 cssStyle_icon = widget.preferenceForKey('cssStyle_icon');
1002 cssStyle_icon =
"width:15px; height:15px";
1005 function saveSettings()
1007 widget.setPreferenceForKey(monthRange.toString(), 'monthRange');
1008 widget.setPreferenceForKey(includeTodos ? 'true' : 'false', 'includeTodos');
1009 widget.setPreferenceForKey(useBackgroundImage ? 'true' : 'false', 'useBackgroundImage');
1010 widget.setPreferenceForKey(showCombinedDateTime ? 'true' : 'false', 'showCombinedDateTime');
1011 widget.setPreferenceForKey(showLocation ? 'true' : 'false', 'showLocation');
1012 widget.setPreferenceForKey(showTodayAsText ? 'true' : 'false', 'showTodayAsText');
1013 widget.setPreferenceForKey(todayText, 'todayText');
1014 widget.setPreferenceForKey(tomorrowText, 'tomorrowText');
1015 widget.setPreferenceForKey(showNowAsText ? 'true' : 'false', 'showNowAsText');
1016 widget.setPreferenceForKey(nowText, 'nowText');
1017 widget.setPreferenceForKey(dateSeparator, 'dateSeparator');
1018 widget.setPreferenceForKey(dateFormat, 'dateFormat');
1019 widget.setPreferenceForKey(weekDayLength.toString(), 'weekDayLength');
1020 widget.setPreferenceForKey(updateDataInterval.toString(), 'updateDataInterval');
1021 widget.setPreferenceForKey(calendarApp.toString(), 'calendarApp');
1022 widget.setPreferenceForKey(eventsPerWidget.toString(), 'eventsPerWidget');
1023 widget.setPreferenceForKey(showNothingText ? 'true' : 'false', 'showNothingText');
1024 widget.setPreferenceForKey(nothingText, 'nothingText');
1025 widget.setPreferenceForKey(enableDaylightSaving ? 'true' : 'false', 'enableDaylightSaving');
1027 widget.setPreferenceForKey(cssStyle_background, 'cssStyle_background');
1028 widget.setPreferenceForKey(cssStyle_backgroundFullscreen, 'cssStyle_backgroundFullscreen');
1029 widget.setPreferenceForKey(cssStyle_weekDay, 'cssStyle_weekDay');
1030 widget.setPreferenceForKey(cssStyle_date, 'cssStyle_date');
1031 widget.setPreferenceForKey(cssStyle_today, 'cssStyle_today');
1032 widget.setPreferenceForKey(cssStyle_tomorrow, 'cssStyle_tomorrow');
1033 widget.setPreferenceForKey(cssStyle_time, 'cssStyle_time');
1034 widget.setPreferenceForKey(cssStyle_now, 'cssStyle_now');
1035 widget.setPreferenceForKey(cssStyle_description, 'cssStyle_description');
1036 widget.setPreferenceForKey(cssStyle_icon, 'cssStyle_icon');
1039 function toggleVisibility(elementId)
1041 if (document.getElementById(elementId).style.display ==
"none")
1042 document.getElementById(elementId).style.display =
"block";
1044 document.getElementById(elementId).style.display =
"none";
1048 function printHintBox(text)
1051 return '
<td width=
"1%" align=
"right" onclick=
"javascript:toggleVisibility(\'info' + uniqueId + '\')">Help
</td></tr></table>'+
1052 '
<div class=
"settingsInfo" id=
"info' + uniqueId + '">' + text + '
</div>';
1055 function showAbout()
1058 document.getElementById(
"homescreenView").style.display =
"none";
1059 document.getElementById(
"fullscreenView").style.display =
"none";
1060 document.getElementById(
"aboutView").style.display =
"block";
1061 document.getElementById(
"settingsView").style.display =
"none";
1062 document.onclick = null;
1064 window.menu.setLeftSoftkeyLabel(
" ", function(){});
1065 window.menu.setRightSoftkeyLabel(
"Back", function()
1071 //document.getElementById(
"aboutView").innerHTML = 'aboutView';
1072 document.getElementById(
"name").innerHTML =
"Coming Next " + version;
1075 function updateFullscreen()
1079 function showFullscreen()
1081 document.getElementById(
"homescreenView").style.display =
"none";
1082 document.getElementById(
"fullscreenView").style.display =
"block";
1083 document.getElementById(
"aboutView").style.display =
"none";
1084 document.getElementById(
"settingsView").style.display =
"none";
1085 document.getElementById('body').className =
"backgroundFullscreen";
1086 document.onclick = launchCalendar;
1091 function updateHomescreen()
1093 if (useBackgroundImage) {
1094 // check for screen rotation
1095 if (orientation != 'portrait' && screen.width ==
360 && screen.height ==
640) {
1096 window.widget.prepareForTransition(
"fade");
1097 orientation = 'portrait';
1098 document.getElementById('body').style.backgroundImage = 'url(background_' + orientation + '.png)';
1099 document.getElementById('body').style.backgroundColor = 'none';
1100 window.widget.performTransition();
1101 } else if (orientation != 'landscape' && screen.width ==
640 && screen.height ==
360) {
1102 window.widget.prepareForTransition(
"fade");
1103 orientation = 'landscape';
1104 document.getElementById('body').style.backgroundImage = 'url(background_' + orientation + '.png)';
1105 document.getElementById('body').style.backgroundColor = 'none';
1106 window.widget.performTransition();
1108 else if (document.getElementById('body').style.backgroundImage ==
"")
1110 document.getElementById('body').style.backgroundImage = 'url(background_' + orientation + '.png)';
1115 function showHomescreen()
1117 document.getElementById(
"homescreenView").style.display =
"block";
1118 document.getElementById(
"fullscreenView").style.display =
"none";
1119 document.getElementById(
"aboutView").style.display =
"none";
1120 document.getElementById(
"settingsView").style.display =
"none";
1121 document.getElementById('body').className =
"background";
1122 document.onclick = null;
1128 <style type=
"text/css">
1129 table { margin:
0px; padding:
0px; border-spacing:
0px; }
1130 td { padding:
0px
5px
0px
0px; white-space:nowrap; overflow:hidden; }
1131 hr { color:#ffffff; background-color:#ffffff; height:
1px; text-align:left; border-style:none; }
1132 .settingsInfo { display:none; font-style:italic; }
1133 .title { font-weight:bold; font-size:
14pt; }
1134 .textInput { width:
90%; }
1135 #homescreenView { width:
315px; height:
91px; overflow:hidden; }
1136 #calendarList { position:absolute; left:
10px; top:
4px; width:
295px; height:
75px; overflow:hidden; }
1137 #name { text-align:center; }
1138 #appicon { display: block; margin-left: auto; margin-right: auto; margin-top:
50px; }
1139 #smallappicon { width:
22px; height:
22px; margin-right:
10px; float:left; }
1144 <body id=
"body" class=
"background">
1145 <div id=
"homescreenView">
1146 <div id=
"calendarList"></div>
1148 <div id=
"fullscreenView" style=
"display:none;">
1149 <img src=
"Icon.png" id=
"smallappicon">
1150 <h1 class=
"title">Coming Next
</h1>
1152 <div id=
"fullscreenCalendarList">loading...
</div>
1154 <div id=
"settingsView" style=
"display:none">
1155 <img src=
"Icon.png" id=
"smallappicon">
1156 <h1 class=
"title">Settings
</h1>
1158 <div id=
"settingsList"></div>
1160 <div id=
"aboutView" style=
"display:none">
1161 <img src=
"Icon.png" id=
"appicon">
1162 <h1 id=
"name">Coming Next
</h1>
1164 <p>Created by Dr. Cochambre and Michael Prager.
</p>
1165 <p>This software is open source and licensed under the GPLv3.
</p>
1166 <p>Visit https://sourceforge.net/projects/comingnext/ for free updates.
</p>