Commit b8d4ed1f273f293339e13e6cad8d82c6507da2eb

  • avatar
  • dBsooner <daniel.beames @dbt…nk.com>
  • Wed Oct 07 06:38:56 CEST 2009
Reorganized everything into new structure
  
1Index: /usr/palm/applications/com.palm.app.amazonstore/app/models/download-manager.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.amazonstore/app/models/download-manager.js
4+++ /usr/palm/applications/com.palm.app.amazonstore/app/models/download-manager.js
5@@ -437,9 +437,9 @@ var DownloadManager = Class.create({
6 }).bind(this));
7 }
8
9- if (userInitiated && AppAssistant.connectionResponse.wifi.state == "disconnected") {
10- this.showWifiRequiredDialog();
11- }
12+ //if (userInitiated && AppAssistant.connectionResponse.wifi.state == "disconnected") {
13+ //this.showWifiRequiredDialog();
14+ //}
15 }
16 else if (userInitiated) {
17 Mojo.Log.info("Amazon App: DOWNLOAD MANGER purchaseCB: purchase FAILED");
18@@ -462,8 +462,8 @@ var DownloadManager = Class.create({
19 // download only if wifi is on
20 Mojo.Log.info("Amazon App: DOWNLOAD MANGER download: wifi: %s, userInitiated: %s", AppAssistant.connectionResponse.wifi.state, userInitiated);
21
22- if (AppAssistant.connectionResponse.wifi.state == "connected") {
23- if ( (this.IpInterfaceSet != "" && this.IpInterfaceSet == AppAssistant.connectionResponse.wifi.ipAddress)
24+ if (true || AppAssistant.connectionResponse.wifi.state == "connected") {
25+ if (true || (this.IpInterfaceSet != "" && this.IpInterfaceSet == AppAssistant.connectionResponse.wifi.ipAddress)
26 || PalmSystem.version.indexOf("desktop") >= 0)
27 {
28 Mojo.Log.info("Amazon App: DOWNLOAD MANGER download: track: %s, serviceRequestCounter: %d", track.title, this.serviceRequestCounter);
  
1diff --git a/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js b/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
2index 4da3e85..590fab5 100644
3--- a/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
4+++ b/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
5@@ -10,7 +10,7 @@ var LauncherAssistant = Class.create({
6 */
7 kQuickLaunchHeight: 67,
8
9- kPageIndicatorSpacing: 6, /* spacing between each page indicator */
10+ kPageIndicatorSpacing: 1, /* spacing between each page indicator */
11 kPageMargin: 10, /* 10 pixel margin on each side of a page */
12 kPageWidthNoMargin: NaN,
13 kPageWidth: NaN,
14@@ -324,9 +324,9 @@ var LauncherAssistant = Class.create({
15 var newAppDiv = $(newAppInfo.launchPointId);
16 Mojo.assert(newAppDiv !== undefined, "Application (%d) was inserted into the DOM but unable to be retrieved!", newAppInfo.launchPointId);
17 if (isNaN(this.kAppWidth) || isNaN(this.kAppHeight)) {
18- this.kAppWidth = newAppDiv.getWidth();
19- this.kAppHeight = newAppDiv.getHeight();
20- this.kAppsPerRow = Math.round(this.kPageWidthNoMargin / this.kAppWidth);
21+ this.kAppWidth = 75;
22+ this.kAppHeight = 90;
23+ this.kAppsPerRow = 4;
24 }
25
26 Mojo.listen(newAppDiv, Mojo.Event.tap, this.onAppTapped.bindAsEventListener(this));
27@@ -439,7 +439,7 @@ var LauncherAssistant = Class.create({
28 /* determines the position of an app element at appIndex within a page */
29 calculateAppPosition: function(appIndex) {
30 return {
31- left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) + this.kPageMargin),
32+ left: (((appIndex % this.kAppsPerRow) * this.kAppWidth)),
33 top: (Math.floor(appIndex/this.kAppsPerRow) * this.kAppHeight)
34 };
35 },
36diff --git a/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css b/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
37index b1244af..0abf90f 100644
38--- a/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
39+++ b/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
40@@ -121,8 +121,8 @@ body.palm-default
41
42 .launcher_page .name {
43 position:absolute;
44- top: 68px;
45- width:100px;
46+ top: 48px;
47+ width:80px;
48 height: 34px;
49 max-height: 34px;
50 clear:both;
51@@ -130,7 +130,8 @@ body.palm-default
52 color:white;
53 text-align:center;
54 font-weight:bold;
55- font-size: 14px;
56+ font-size: 11px;
57+ left: 10px;
58 overflow: hidden;
59 text-overflow: ellipsis;
60 z-index:5;
61@@ -164,8 +165,8 @@ body.palm-default
62 }
63
64 .draggable {
65- width:64px;
66- height:64px;
67+ width:48px;
68+ height:48px;
69 margin: 0 auto;
70 -webkit-user-drag: any;
71 -webkit-user-select: none;
72@@ -213,8 +214,8 @@ body.palm-default
73
74 #app-icon {
75 float:left;
76- width:64px;
77- height:64px;
78+ width:32px;
79+ height:32px;
80 background: center center no-repeat;
81 }
82
  
14X4 Launcher page for webOS 1.2.0
2diff --git a/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js b/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
3index 4da3e85..48fc720 100644
4--- a/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
5+++ b/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
6@@ -10,7 +10,7 @@ var LauncherAssistant = Class.create({
7 */
8 kQuickLaunchHeight: 67,
9
10- kPageIndicatorSpacing: 6, /* spacing between each page indicator */
11+ kPageIndicatorSpacing: 1, /* spacing between each page indicator */
12 kPageMargin: 10, /* 10 pixel margin on each side of a page */
13 kPageWidthNoMargin: NaN,
14 kPageWidth: NaN,
15@@ -324,9 +324,9 @@ var LauncherAssistant = Class.create({
16 var newAppDiv = $(newAppInfo.launchPointId);
17 Mojo.assert(newAppDiv !== undefined, "Application (%d) was inserted into the DOM but unable to be retrieved!", newAppInfo.launchPointId);
18 if (isNaN(this.kAppWidth) || isNaN(this.kAppHeight)) {
19- this.kAppWidth = newAppDiv.getWidth();
20- this.kAppHeight = newAppDiv.getHeight();
21- this.kAppsPerRow = Math.round(this.kPageWidthNoMargin / this.kAppWidth);
22+ this.kAppWidth = 80;
23+ this.kAppHeight = 85;
24+ this.kAppsPerRow = 4;
25 }
26
27 Mojo.listen(newAppDiv, Mojo.Event.tap, this.onAppTapped.bindAsEventListener(this));
28@@ -439,7 +439,7 @@ var LauncherAssistant = Class.create({
29 /* determines the position of an app element at appIndex within a page */
30 calculateAppPosition: function(appIndex) {
31 return {
32- left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) + this.kPageMargin),
33+ left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) - 10),
34 top: (Math.floor(appIndex/this.kAppsPerRow) * this.kAppHeight)
35 };
36 },
37diff --git a/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css b/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
38index b1244af..61ea830 100644
39--- a/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
40+++ b/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
41@@ -121,8 +121,9 @@ body.palm-default
42
43 .launcher_page .name {
44 position:absolute;
45- top: 68px;
46- width:100px;
47+ top: 48px;
48+ left:9px;
49+ width:80px;
50 height: 34px;
51 max-height: 34px;
52 clear:both;
53@@ -130,7 +131,7 @@ body.palm-default
54 color:white;
55 text-align:center;
56 font-weight:bold;
57- font-size: 14px;
58+ font-size: 12px;
59 overflow: hidden;
60 text-overflow: ellipsis;
61 z-index:5;
62@@ -164,8 +165,8 @@ body.palm-default
63 }
64
65 .draggable {
66- width:64px;
67- height:64px;
68+ width:48px;
69+ height:48px;
70 margin: 0 auto;
71 -webkit-user-drag: any;
72 -webkit-user-select: none;
73@@ -213,8 +214,8 @@ body.palm-default
74
75 #app-icon {
76 float:left;
77- width:64px;
78- height:64px;
79+ width:32px;
80+ height:32px;
81 background: center center no-repeat;
82 }
  
1More icons per row with reduced margins and increase space between columns
2
3Updated for 1.2
4
5Variation by StoneRyno of the original patch
6
7Index: /usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
8===================================================================
9--- .orig/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
10+++ /usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
11@@ -10,7 +10,7 @@ var LauncherAssistant = Class.create({
12 */
13 kQuickLaunchHeight: 67,
14
15- kPageIndicatorSpacing: 6, /* spacing between each page indicator */
16+ kPageIndicatorSpacing: 1, /* spacing between each page indicator */
17 kPageMargin: 10, /* 10 pixel margin on each side of a page */
18 kPageWidthNoMargin: NaN,
19 kPageWidth: NaN,
20@@ -324,9 +324,9 @@ var LauncherAssistant = Class.create({
21 var newAppDiv = $(newAppInfo.launchPointId);
22 Mojo.assert(newAppDiv !== undefined, "Application (%d) was inserted into the DOM but unable to be retrieved!", newAppInfo.launchPointId);
23 if (isNaN(this.kAppWidth) || isNaN(this.kAppHeight)) {
24- this.kAppWidth = newAppDiv.getWidth();
25- this.kAppHeight = newAppDiv.getHeight();
26- this.kAppsPerRow = Math.round(this.kPageWidthNoMargin / this.kAppWidth);
27+ this.kAppWidth = 64;
28+ this.kAppHeight = 90;
29+ this.kAppsPerRow = 5;
30 }
31
32 Mojo.listen(newAppDiv, Mojo.Event.tap, this.onAppTapped.bindAsEventListener(this));
33@@ -439,7 +439,7 @@ var LauncherAssistant = Class.create({
34 /* determines the position of an app element at appIndex within a page */
35 calculateAppPosition: function(appIndex) {
36 return {
37- left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) + this.kPageMargin),
38+ left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) - 18),
39 top: (Math.floor(appIndex/this.kAppsPerRow) * this.kAppHeight)
40 };
41 },
42Index: /usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
43===================================================================
44--- .orig/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
45+++ /usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
46@@ -121,7 +121,7 @@ body.palm-default
47
48 .launcher_page .name {
49 position:absolute;
50- top: 68px;
51+ top: 48px;
52 width:100px;
53 height: 34px;
54 max-height: 34px;
55@@ -130,7 +130,7 @@ body.palm-default
56 color:white;
57 text-align:center;
58 font-weight:bold;
59- font-size: 14px;
60+ font-size: 9px;
61 overflow: hidden;
62 text-overflow: ellipsis;
63 z-index:5;
64@@ -164,8 +164,8 @@ body.palm-default
65 }
66
67 .draggable {
68- width:64px;
69- height:64px;
70+ width:48px;
71+ height:48px;
72 margin: 0 auto;
73 -webkit-user-drag: any;
74 -webkit-user-select: none;
75@@ -213,8 +213,8 @@ body.palm-default
76
77 #app-icon {
78 float:left;
79- width:64px;
80- height:64px;
81+ width:32px;
82+ height:32px;
83 background: center center no-repeat;
84 }
85
  
15X4 Launcher page for webOS 1.2.1
2Index: /usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
3===================================================================
4--- .orig/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
5+++ /usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
6@@ -10,7 +10,7 @@ var LauncherAssistant = Class.create({
7 */
8 kQuickLaunchHeight: 67,
9
10- kPageIndicatorSpacing: 6, /* spacing between each page indicator */
11+ kPageIndicatorSpacing: 1, /* spacing between each page indicator */
12 kPageMargin: 10, /* 10 pixel margin on each side of a page */
13 kPageWidthNoMargin: NaN,
14 kPageWidth: NaN,
15@@ -324,9 +324,9 @@ var LauncherAssistant = Class.create({
16 var newAppDiv = $(newAppInfo.launchPointId);
17 Mojo.assert(newAppDiv !== undefined, "Application (%d) was inserted into the DOM but unable to be retrieved!", newAppInfo.launchPointId);
18 if (isNaN(this.kAppWidth) || isNaN(this.kAppHeight)) {
19- this.kAppWidth = newAppDiv.getWidth();
20- this.kAppHeight = newAppDiv.getHeight();
21- this.kAppsPerRow = Math.round(this.kPageWidthNoMargin / this.kAppWidth);
22+ this.kAppWidth = 64;
23+ this.kAppHeight = 85;
24+ this.kAppsPerRow = 5;
25 }
26
27 Mojo.listen(newAppDiv, Mojo.Event.tap, this.onAppTapped.bindAsEventListener(this));
28@@ -439,7 +439,7 @@ var LauncherAssistant = Class.create({
29 /* determines the position of an app element at appIndex within a page */
30 calculateAppPosition: function(appIndex) {
31 return {
32- left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) + this.kPageMargin),
33+ left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) - 18),
34 top: (Math.floor(appIndex/this.kAppsPerRow) * this.kAppHeight)
35 };
36 },
37Index: /usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
38===================================================================
39--- .orig/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
40+++ /usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
41@@ -121,8 +121,9 @@ body.palm-default
42
43 .launcher_page .name {
44 position:absolute;
45- top: 68px;
46- width:100px;
47+ top: 48px;
48+ left:20px;
49+ width:65px;
50 height: 34px;
51 max-height: 34px;
52 clear:both;
53@@ -130,7 +131,7 @@ body.palm-default
54 color:white;
55 text-align:center;
56 font-weight:bold;
57- font-size: 14px;
58+ font-size: 12px;
59 overflow: hidden;
60 text-overflow: ellipsis;
61 z-index:5;
62@@ -164,8 +165,8 @@ body.palm-default
63 }
64
65 .draggable {
66- width:64px;
67- height:64px;
68+ width:48px;
69+ height:48px;
70 margin: 0 auto;
71 -webkit-user-drag: any;
72 -webkit-user-select: none;
73@@ -213,8 +214,8 @@ body.palm-default
74
75 #app-icon {
76 float:left;
77- width:64px;
78- height:64px;
79+ width:32px;
80+ height:32px;
81 background: center center no-repeat;
82 }
83
  
1Add / Delete Pages in the Launcher
2Index: /usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
3===================================================================
4--- .orig/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
5+++ /usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
6@@ -23,8 +23,8 @@ var LauncherAssistant = Class.create({
7 visible: true,
8 label: $L('Launcher'),
9 items: [
10- /*{ label: $L('New page'), command: 'newpage' },
11- { label: $L('Delete page'), command: 'deletepage' },*/
12+ { label: $L('New page'), command: 'newpage' },
13+ { label: $L('Delete page'), command: 'deletepage' },
14 Mojo.Menu.editItem,
15 { label: $L('List Apps...'), command: 'listapps' },
16 Mojo.Menu.helpItem
17@@ -117,7 +117,6 @@ var LauncherAssistant = Class.create({
18 case 'listapps':
19 ApplicationService.launch(this.deviceInfo.id, this.deviceInfo.params);
20 break;
21- /*
22 case 'newpage':
23 if (this.pageDivs.length < 10) {
24 this.insertPage(this.activePageIndex, true);
25@@ -131,7 +130,6 @@ var LauncherAssistant = Class.create({
26 }
27 }
28 break;
29- */
30 }
31 }
32 else if (event.type === Mojo.Event.commandEnable) {
  
1diff --git a/usr/palm/applications/com.palm.app.musicplayer/appinfo.json b/usr/palm/applications/com.palm.app.musicplayer/appinfo.json
2index 268b023..ddbf5d3 100644
3--- a/usr/palm/applications/com.palm.app.musicplayer/appinfo.json
4+++ b/usr/palm/applications/com.palm.app.musicplayer/appinfo.json
5@@ -5,5 +5,6 @@
6 "id": "com.palm.app.musicplayer",
7 "keywords": ["Audio", "Tunes", "Songs"],
8 "miniicon": "images/notification-small-music.png",
9- "icon": "icon.png"
10+ "icon": "icon.png",
11+ "visible": false
12 }
  
1diff --git a/usr/palm/applications/com.handson.app.nascar/appinfo.json b/usr/palm/applications/com.handson.app.nascar/appinfo.json
2index 1a4252a..3425a00 100644
3--- a/usr/palm/applications/com.handson.app.nascar/appinfo.json
4+++ b/usr/palm/applications/com.handson.app.nascar/appinfo.json
5@@ -6,6 +6,7 @@
6 "icon": "icon.png",
7 "version": "1.14",
8 "vendor": "Hands-On Mobile",
9- "vendorurl": "http://www.handson.com"
10+ "vendorurl": "http://www.handson.com",
11+ "visible": false
12 }
13
  
1diff --git a/usr/palm/applications/com.handson.app.nfl/appinfo.json b/usr/palm/applications/com.handson.app.nfl/appinfo.json
2index 1fca174..3d40d04 100644
3--- a/usr/palm/applications/com.handson.app.nfl/appinfo.json
4+++ b/usr/palm/applications/com.handson.app.nfl/appinfo.json
5@@ -6,6 +6,7 @@
6 "icon": "icon.png",
7 "version": "1.25",
8 "vendor": "Hands-On Mobile",
9- "vendorurl": "http://www.handson.com"
10+ "vendorurl": "http://www.handson.com",
11+ "visible": false
12 }
13
  
1diff --git a/usr/palm/applications/com.mobitv.app.sprinttv/appinfo.json b/usr/palm/applications/com.mobitv.app.sprinttv/appinfo.json
2index 4ff8cbd..67ac3eb 100755
3--- a/usr/palm/applications/com.mobitv.app.sprinttv/appinfo.json
4+++ b/usr/palm/applications/com.mobitv.app.sprinttv/appinfo.json
5@@ -6,5 +6,6 @@
6 "icon": "icon.png",
7 "version": "1.5",
8 "vendor": "Sprint",
9- "vendorurl": "www.sprint.com"
10+ "vendorurl": "www.sprint.com",
11+ "visible": false
12 }
13\ No newline at end of file
  
1diff --git a/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js b/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
2index 64244b6..e68c9d2 100644
3--- a/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
4+++ b/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
5@@ -157,6 +157,10 @@ var LauncherAssistant = Class.create({
6
7 /* keep track of which page we are on */
8 onPageChange: function(event) {
9+ var scroller = this.getPageScroller(this.activePageIndex);
10+ if (scroller && scroller.mojo) {
11+ scroller.mojo.revealTop(0);
12+ }
13 this.activePageIndex = event.value;
14 this.updatePageIndicators();
15 },
  
1diff --git a/usr/palm/applications/com.palm.app.devmodeswitcher/appinfo.json b/usr/palm/applications/com.palm.app.devmodeswitcher/appinfo.json
2index 7d9da85..c0f2522 100644
3--- a/usr/palm/applications/com.palm.app.devmodeswitcher/appinfo.json
4+++ b/usr/palm/applications/com.palm.app.devmodeswitcher/appinfo.json
5@@ -5,6 +5,6 @@
6 "id": "com.palm.app.devmodeswitcher",
7 "icon": "icon.png",
8 "noWindow": false,
9- "visible": false
10+ "visible": true
11 }
12
  
1Add / Delete Pages in the Launcher
2
3Tested-On: 1.1
4
5From: Rod Whitby <rod@whitby.id.au>
6
7http://predev.wikidot.com/add-delete-pages-in-the-launcher
8
9Original announcement in #webos-internals IRC channel:
10
11Jun 11 15:33:00 <jwsh> I put some instructions on how to enable adding pages to the launcher on the wiki
12---
13
14 .../app/controllers/launcher-assistant.js | 6 ++----
15 1 files changed, 2 insertions(+), 4 deletions(-)
16
17
18Index: /usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
19===================================================================
20--- .orig/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
21+++ /usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
22@@ -23,8 +23,8 @@ var LauncherAssistant = Class.create({
23 visible: true,
24 label: $L('Launcher'),
25 items: [
26- /*{ label: $L('New page'), command: 'newpage' },
27- { label: $L('Delete page'), command: 'deletepage' },*/
28+ { label: $L('New page'), command: 'newpage' },
29+ { label: $L('Delete page'), command: 'deletepage' },
30 Mojo.Menu.editItem,
31 { label: $L('List Apps...'), command: 'listapps' },
32 Mojo.Menu.helpItem
33@@ -117,7 +117,6 @@ var LauncherAssistant = Class.create({
34 case 'listapps':
35 ApplicationService.launch(this.deviceInfo.id, this.deviceInfo.params);
36 break;
37- /*
38 case 'newpage':
39 if (this.pageDivs.length < 10) {
40 this.insertPage(this.activePageIndex, true);
41@@ -131,7 +130,6 @@ var LauncherAssistant = Class.create({
42 }
43 }
44 break;
45- */
46 }
47 }
48 else if (event.type === Mojo.Event.commandEnable) {
  
1diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/chrome.js b/usr/palm/applications/com.palm.app.browser/app/controllers/chrome.js
2index 4e0f974..fc1520d 100644
3--- a/usr/palm/applications/com.palm.app.browser/app/controllers/chrome.js
4+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/chrome.js
5@@ -102,12 +102,39 @@ Chrome.prototype._hidePortrait = function() {
6 }
7 };
8
9+Chrome.prototype.show = UrlBar.prototype._showNoOp;
10+Chrome.prototype.hide = UrlBar.prototype._hideNoOp;
11+
12 Chrome.prototype._showNoOp = function() {
13 // DO NOTHING - We don't show anything in landscape.
14+ var animator;
15+ var element = this.controller.get(this._elementName);
16+
17+ // If we are visible then the current spacer height is
18+ if (element && (this._currentHeight === 0)) {
19+ animator = Mojo.Animation.animateStyle(element, 'height', 'linear', {
20+ from: 0,
21+ to: this._maxHeight,
22+ duration: 0.15,
23+ reverse: false
24+ });
25+ this._currentHeight = this._maxHeight;
26+ }
27 };
28
29 Chrome.prototype._hideNoOp = function() {
30 // DO NOTHING - We should not be displayed in landscape.
31+ var animator;
32+ var element = this.controller.get(this._elementName);
33+ if (element && (this._currentHeight > 0)) {
34+ animator = Mojo.Animation.animateStyle(element, 'height', 'linear', {
35+ from: 0,
36+ to: this._maxHeight,
37+ duration: 0.15,
38+ reverse: true
39+ });
40+ this._currentHeight = 0;
41+ }
42 };
43
44 Chrome.prototype.isVisible = function() {
45diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/downloaddialog-assistant.js b/usr/palm/applications/com.palm.app.browser/app/controllers/downloaddialog-assistant.js
46new file mode 100644
47index 0000000..4c07986
48--- /dev/null
49+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/downloaddialog-assistant.js
50@@ -0,0 +1,46 @@
51+/**
52+ * A dialog assistant for display of yes/no box.
53+ */
54+DownloadDialogAssistant = Class.create({
55+
56+ initialize: function(params) {
57+ this.onDismiss = params.onDismiss;
58+ this.onAccept = params.onAccept;
59+ this.controller= params.sceneAssistant.controller;
60+
61+ // Button handlers.
62+ this.onDismissHandler = this.handleDismiss.bindAsEventListener(this);
63+ this.onAcceptHandler = this.handleAccept.bindAsEventListener(this);
64+ },
65+
66+ setup: function(widget) {
67+ this.widget = widget;
68+ this.controller.get('acceptButton').addEventListener(Mojo.Event.tap, this.onAcceptHandler);
69+ this.controller.get('acceptButton').focus();
70+ this.controller.get('dismissButton').addEventListener(Mojo.Event.tap, this.onDismissHandler);
71+ this.controller.get('dismissButton').focus();
72+ },
73+
74+ handleDismiss: function() {
75+ this.onDismiss();
76+ delete this.onDismiss;
77+ this.widget.mojo.close();
78+ },
79+ handleAccept: function() {
80+ this.onAccept();
81+ delete this.onAccept;
82+ delete this.onDismiss;
83+ this.widget.mojo.close();
84+ },
85+
86+ cleanup: function() {
87+ Mojo.Log.info("NetworkDialogAssistant#cleanup()");
88+ Mojo.Event.stopListening(this.controller.get('dismissButton'), Mojo.Event.tap, this.onDismissHandler);
89+ Mojo.Event.stopListening(this.controller.get('acceptButton'), Mojo.Event.tap, this.onAcceptHandler);
90+
91+ // Send a dismiss if NOT already sent a response
92+ if (this.onDismiss) {
93+ this.onDismiss();
94+ }
95+ }
96+});
97diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/page-assistant.js b/usr/palm/applications/com.palm.app.browser/app/controllers/page-assistant.js
98index a805d2c..1074480 100644
99--- a/usr/palm/applications/com.palm.app.browser/app/controllers/page-assistant.js
100+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/page-assistant.js
101@@ -1198,7 +1198,95 @@ PageAssistant.prototype._newBrowserPage = function(url, pageIdentifier){
102 PageAssistant.prototype._streamResource = function(uri, appid, mimeType){
103
104 Mojo.Log.info("Streaming: '%s' with '%s' (%s)", uri, appid, mimeType);
105-
106+ if(appid === 'com.palm.app.email')
107+ {
108+ //an email was clicked, so we bypass the download dialog and open the email app.
109+ var params = {target: uri, mimeType: mimeType};
110+ this.controller.serviceRequest('palm://com.palm.applicationManager',{
111+ method: 'open',
112+ parameters: {
113+ 'id': appid,
114+ 'params': params
115+ }}
116+ );
117+ return;
118+ }
119+ if(appid === 'com.palm.app.docviwer')
120+ {
121+ //a doc was clicked, so we bypass the download dialog and open the docviewer app.
122+ var params = {target: uri, mimeType: mimeType};
123+ this.controller.serviceRequest('palm://com.palm.applicationManager',{
124+ method: 'open',
125+ parameters: {
126+ 'id': appid,
127+ 'params': params
128+ }}
129+ );
130+ return;
131+ }
132+ if(appid === 'com.palm.app.pdfviewer')
133+ {
134+ //a pdf was clicked, so we bypass the download dialog and open the pdfviewer app.
135+ var params = {target: uri, mimeType: mimeType};
136+ this.controller.serviceRequest('palm://com.palm.applicationManager',{
137+ method: 'open',
138+ parameters: {
139+ 'id': appid,
140+ 'params': params
141+ }}
142+ );
143+ return;
144+ }
145+ if(appid === 'com.palm.app.maps')
146+ {
147+ //a map was clicked, so we bypass the download dialog and open the maps app.
148+ var params = {target: uri, mimeType: mimeType};
149+ this.controller.serviceRequest('palm://com.palm.applicationManager',{
150+ method: 'open',
151+ parameters: {
152+ 'id': appid,
153+ 'params': params
154+ }}
155+ );
156+ return;
157+ }
158+ if(appid === 'com.palm.app.youtube')
159+ {
160+ //a youtube video was clicked, so we bypass the download dialog and open the youtube app.
161+ var params = {target: uri, mimeType: mimeType};
162+ this.controller.serviceRequest('palm://com.palm.applicationManager',{
163+ method: 'open',
164+ parameters: {
165+ 'id': appid,
166+ 'params': params
167+ }}
168+ );
169+ return;
170+ }
171+ if(appid === 'com.palm.app.phone')
172+ {
173+ //a phone # was clicked, so we bypass the download dialog and open the phone app.
174+ var params = {target: uri, mimeType: mimeType};
175+ this.controller.serviceRequest('palm://com.palm.applicationManager',{
176+ method: 'open',
177+ parameters: {
178+ 'id': appid,
179+ 'params': params
180+ }}
181+ );
182+ return;
183+ }
184+ this._downloadWidgetElement = this.controller.showDialog({
185+ uri: uri,
186+ mimeType: mimeType,
187+ appid: appid,
188+ template: 'download/download-stream-popup',
189+ assistant: new DownloadDialogAssistant({
190+ sceneAssistant: this,
191+ onDismiss: function(cParams) { // DOWNLOAD
192+ this._downloadResource(uri);
193+ }.bind(this),
194+ onAccept: function(cParams) { // STREAM
195 // Only a few select applications can be
196 crossAppScene = {
197 'com.palm.app.videoplayer': 'nowplaying',
198@@ -1206,11 +1294,9 @@ PageAssistant.prototype._streamResource = function(uri, appid, mimeType){
199 };
200 var params = {target: uri, mimeType: mimeType};
201 if (crossAppScene[appid]) {
202-
203 var args = { appId: appid, name: crossAppScene[appid] };
204 this.controller.stageController.pushScene(args, params);
205- }
206- else {
207+ } else {
208 this.controller.serviceRequest('palm://com.palm.applicationManager', {
209 method: 'open',
210 parameters: {
211@@ -1219,6 +1305,9 @@ PageAssistant.prototype._streamResource = function(uri, appid, mimeType){
212 }
213 });
214 }
215+ }.bind(this)})
216+ });
217+
218 };
219
220 /**
221@@ -2237,6 +2326,31 @@ PageAssistant.prototype._onKeyDownEvent = function(event) {
222 // allowed to trigger the bar.
223 if (this._addressBar.isAGotoAddressBarEvent(event.originalEvent)) {
224 this._gotoUrlBar();
225+ } else {
226+ var key = event.originalEvent.keyCode;
227+ var scroller = this.controller.getSceneScroller();
228+ var pageHeight = scroller.mojo.scrollerSize().height;
229+ if (pageHeight > 50) pageHeight = pageHeight - 50;
230+ if (key == 32) {
231+ // alternate method for scrolling, gives visual feedback, but slower
232+ //var currentTop = scroller.mojo.getScrollPosition().top;
233+ //currentTop += scroller.mojo.scrollerSize().height - 50;
234+ //scroller.mojo.scrollTo(undefined, currentTop, true);
235+ scroller.mojo.adjustBy(0, -1*pageHeight);
236+ this._addressBar.hide();
237+ } else if (key == 0) {
238+ scroller.mojo.adjustBy(0, pageHeight);
239+ } else if (key == 190) {
240+ scroller.mojo.adjustBy(0, -25);
241+ this._addressBar.hide();
242+ } else if (key == 8) {
243+ scroller.mojo.revealTop(0);
244+ } else if (key == 13) {
245+ scroller.mojo.revealBottom(0);
246+ this._addressBar.hide();
247+ } else {
248+ Mojo.Log.error("Ignoring keyCode", key);
249+ }
250 }
251 }
252 };
253diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/urlbar.js b/usr/palm/applications/com.palm.app.browser/app/controllers/urlbar.js
254index 94abd5d..cafa2e4 100644
255--- a/usr/palm/applications/com.palm.app.browser/app/controllers/urlbar.js
256+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/urlbar.js
257@@ -47,6 +47,10 @@ UrlBar.prototype.setOrientation = function(orientation) {
258 if (orientation !== 'up') {
259 // In landscape and down we ALWAYS hide the BAR so we make sure it's
260 // already hidden by calling' 'hide'.
261+ this.show = this._showNoOp;
262+ this.hide = this._hideNoOp;
263+ } else {
264+ // Default is portrait.
265 this._hidePortrait();
266 }
267
268@@ -73,6 +77,12 @@ UrlBar.prototype.setup = function(properties) {
269 this._onPropertyChange = properties.onPropertyChange || function(){};
270 this._configOrientation(properties.orientation || 'up');
271
272+ if (properties.orientation === 'up') {
273+ this.owidth = 271;
274+ } else {
275+ this.owidth = 430;
276+ }
277+
278 this.models = {
279 urlInput: {
280 template: 'page/url-field',
281@@ -90,7 +100,7 @@ UrlBar.prototype.setup = function(properties) {
282 url: ''
283 },
284
285- width: 271
286+ width: this.owidth
287 },
288
289 // Beware: These are shallow copies.
290@@ -416,12 +426,25 @@ UrlBar.prototype._hidePortrait = function() {
291 this.controller.setMenuVisible(Mojo.Menu.viewMenu, false);
292 };
293
294+UrlBar.prototype.show = UrlBar.prototype._showNoOp;
295+UrlBar.prototype.hide = UrlBar.prototype._hideNoOp;
296+
297 UrlBar.prototype._showNoOp = function() {
298 // DO NOTHING - We don't show anything in landscape.
299+ var menuAssistant = this.controller._menu.assistant;
300+ var spacerHeight = menuAssistant.viewSpacerHeight;
301+
302+ menuAssistant.viewSpacerHeight = 0;
303+ this.controller.setMenuVisible(Mojo.Menu.viewMenu, true);
304 };
305
306 UrlBar.prototype._hideNoOp = function() {
307 // DO NOTHING - We should not be displayed in landscape.
308+ var menuAssistant = this.controller._menu.assistant;
309+ var spacerHeight = menuAssistant.viewSpacerHeight;
310+
311+ menuAssistant.viewSpacerHeight = 0;
312+ this.controller.setMenuVisible(Mojo.Menu.viewMenu, false);
313 };
314
315 UrlBar.prototype.isVisible = function() {
316diff --git a/usr/palm/applications/com.palm.app.browser/app/views/download/download-stream-popup.html b/usr/palm/applications/com.palm.app.browser/app/views/download/download-stream-popup.html
317new file mode 100644
318index 0000000..b705ece
319--- /dev/null
320+++ b/usr/palm/applications/com.palm.app.browser/app/views/download/download-stream-popup.html
321@@ -0,0 +1,8 @@
322+<div id="palm-dialog-content" class="palm-dialog-content">
323+ <div class="dialog-message" x-mojo-loc="">This file type has been registered as a streaming media file. Would you like to download it to /media/internal/downloads instead?</div>
324+</div>
325+
326+<div class="palm-dialog-buttons">
327+ <div class="dismiss palm-button" id="acceptButton" x-mojo-loc="" x-mojo-tap-highlight="momentary">Stream</div>
328+ <div class="dismiss palm-button" id="dismissButton" x-mojo-loc="" x-mojo-tap-highlight="momentary">Download</div>
329+</div>
330diff --git a/usr/palm/applications/com.palm.app.browser/sources.json b/usr/palm/applications/com.palm.app.browser/sources.json
331index 54187ce..7d79e70 100644
332--- a/usr/palm/applications/com.palm.app.browser/sources.json
333+++ b/usr/palm/applications/com.palm.app.browser/sources.json
334@@ -48,6 +48,9 @@
335 "source": "app\/controllers\/download-controller.js",
336 },
337 {
338+ "source":"app\/controllers\/downloaddialog-assistant.js"
339+ },
340+ {
341 "source": "app\/controllers\/preferences-assistant.js",
342 },
343 {
344diff --git a/usr/palm/applications/com.palm.app.browser/stylesheets/browser.css b/usr/palm/applications/com.palm.app.browser/stylesheets/browser.css
345index 6215e0b..aee8654 100644
346--- a/usr/palm/applications/com.palm.app.browser/stylesheets/browser.css
347+++ b/usr/palm/applications/com.palm.app.browser/stylesheets/browser.css
348@@ -753,7 +753,7 @@ div#historyScroller {
349 }
350
351 .search-results-container .palm-list {
352- width: 304px;
353+ width: 95%;
354 }
355
356 .search-results-container .search.first {
  
1diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js b/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js
2index b2c8848..08d56ac 100644
3--- a/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js
4+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js
5@@ -1101,10 +1101,13 @@ HistoryAssistant.prototype.setup = function() {
6 this.controller.setupWidget('historyList', {
7 itemTemplate:'history/history-entry',
8 listTemplate:'history/history-container',
9- itemsCallback:this._itemsCallback.bind(this)
10+ itemsCallback:this._itemsCallback.bind(this),
11+ swipeToDelete:true,
12+ autoconfirmDelete:true
13 });
14
15 this._onListSelectionHandler = this._onListSelection.bindAsEventListener(this);
16+ this._onListDeleteHandler = this._onListDelete.bindAsEventListener(this);
17 this._historyListWidget = this.controller.get('historyList');
18
19 var appMenuModel = {
20@@ -1130,6 +1133,7 @@ HistoryAssistant.prototype.cleanup = function() {
21 HistoryAssistant.prototype.activate = function() {
22
23 this._historyListWidget.addEventListener(Mojo.Event.listTap, this._onListSelectionHandler);
24+ this._historyListWidget.addEventListener(Mojo.Event.listDelete, this._onListDeleteHandler);
25
26 // On an activation for a re-render of the contents.
27 var len = this._historyListWidget.mojo.getLength();
28@@ -1139,6 +1143,7 @@ HistoryAssistant.prototype.activate = function() {
29 HistoryAssistant.prototype.deactivate = function() {
30
31 Mojo.Event.stopListening(this._historyListWidget, Mojo.Event.listTap, this._onListSelectionHandler);
32+ Mojo.Event.stopListening(this._historyListWidget, Mojo.Event.listDelete, this._onListDeleteHandler);
33 };
34
35 /**
36@@ -1218,6 +1223,10 @@ HistoryAssistant.prototype._onListSelection = function(event) {
37 });
38 };
39
40+HistoryAssistant.prototype._onListDelete = function(event) {
41+ this.historyStore.deleteHistoryEntry(event.item.url, function() {}, function() {});
42+};
43+
44 /**
45 * handle a menu command.
46 */
47@@ -7349,6 +7358,15 @@ function HistoryStore(options, onSuccess, onFailure) {
48 }
49 }
50
51+HistoryStore.prototype._deleteHistoryEntry = function(url, onSuccess, onFailure, transaction) {
52+ this._executeSql(transaction, onSuccess, onFailure,
53+ "DELETE FROM 'history' WHERE url = ?", [url] );
54+};
55+
56+HistoryStore.prototype.deleteHistoryEntry = function(url, onSuccess, onFailure) {
57+ this.database.transaction(this._deleteHistoryEntry.bind(this, url, onSuccess, onFailure));
58+};
59+
60 /** @private */
61 HistoryStore.prototype._addHistoryEntry = function(url, title, date, onSuccess, onFailure, transaction) {
62
  
1diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js b/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js
2index b2c8848..133bc7a 100644
3--- a/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js
4+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js
5@@ -1101,10 +1101,13 @@ HistoryAssistant.prototype.setup = function() {
6 this.controller.setupWidget('historyList', {
7 itemTemplate:'history/history-entry',
8 listTemplate:'history/history-container',
9- itemsCallback:this._itemsCallback.bind(this)
10+ itemsCallback:this._itemsCallback.bind(this),
11+ swipeToDelete:true,
12+ autoconfirmDelete:false
13 });
14
15 this._onListSelectionHandler = this._onListSelection.bindAsEventListener(this);
16+ this._onListDeleteHandler = this._onListDelete.bindAsEventListener(this);
17 this._historyListWidget = this.controller.get('historyList');
18
19 var appMenuModel = {
20@@ -1130,6 +1133,7 @@ HistoryAssistant.prototype.cleanup = function() {
21 HistoryAssistant.prototype.activate = function() {
22
23 this._historyListWidget.addEventListener(Mojo.Event.listTap, this._onListSelectionHandler);
24+ this._historyListWidget.addEventListener(Mojo.Event.listDelete, this._onListDeleteHandler);
25
26 // On an activation for a re-render of the contents.
27 var len = this._historyListWidget.mojo.getLength();
28@@ -1139,6 +1143,7 @@ HistoryAssistant.prototype.activate = function() {
29 HistoryAssistant.prototype.deactivate = function() {
30
31 Mojo.Event.stopListening(this._historyListWidget, Mojo.Event.listTap, this._onListSelectionHandler);
32+ Mojo.Event.stopListening(this._historyListWidget, Mojo.Event.listDelete, this._onListDeleteHandler);
33 };
34
35 /**
36@@ -1218,6 +1223,10 @@ HistoryAssistant.prototype._onListSelection = function(event) {
37 });
38 };
39
40+HistoryAssistant.prototype._onListDelete = function(event) {
41+ this.historyStore.deleteHistoryEntry(event.item.url, function() {}, function() {});
42+};
43+
44 /**
45 * handle a menu command.
46 */
47@@ -7349,6 +7358,15 @@ function HistoryStore(options, onSuccess, onFailure) {
48 }
49 }
50
51+HistoryStore.prototype._deleteHistoryEntry = function(url, onSuccess, onFailure, transaction) {
52+ this._executeSql(transaction, onSuccess, onFailure,
53+ "DELETE FROM 'history' WHERE url = ?", [url] );
54+};
55+
56+HistoryStore.prototype.deleteHistoryEntry = function(url, onSuccess, onFailure) {
57+ this.database.transaction(this._deleteHistoryEntry.bind(this, url, onSuccess, onFailure));
58+};
59+
60 /** @private */
61 HistoryStore.prototype._addHistoryEntry = function(url, title, date, onSuccess, onFailure, transaction) {
62
  
1diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/chrome.js b/usr/palm/applications/com.palm.app.browser/app/controllers/chrome.js
2index 4e0f974..fc1520d 100644
3--- a/usr/palm/applications/com.palm.app.browser/app/controllers/chrome.js
4+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/chrome.js
5@@ -102,12 +102,39 @@ Chrome.prototype._hidePortrait = function() {
6 }
7 };
8
9+Chrome.prototype.show = UrlBar.prototype._showNoOp;
10+Chrome.prototype.hide = UrlBar.prototype._hideNoOp;
11+
12 Chrome.prototype._showNoOp = function() {
13 // DO NOTHING - We don't show anything in landscape.
14+ var animator;
15+ var element = this.controller.get(this._elementName);
16+
17+ // If we are visible then the current spacer height is
18+ if (element && (this._currentHeight === 0)) {
19+ animator = Mojo.Animation.animateStyle(element, 'height', 'linear', {
20+ from: 0,
21+ to: this._maxHeight,
22+ duration: 0.15,
23+ reverse: false
24+ });
25+ this._currentHeight = this._maxHeight;
26+ }
27 };
28
29 Chrome.prototype._hideNoOp = function() {
30 // DO NOTHING - We should not be displayed in landscape.
31+ var animator;
32+ var element = this.controller.get(this._elementName);
33+ if (element && (this._currentHeight > 0)) {
34+ animator = Mojo.Animation.animateStyle(element, 'height', 'linear', {
35+ from: 0,
36+ to: this._maxHeight,
37+ duration: 0.15,
38+ reverse: true
39+ });
40+ this._currentHeight = 0;
41+ }
42 };
43
44 Chrome.prototype.isVisible = function() {
45diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/downloaddialog-assistant.js b/usr/palm/applications/com.palm.app.browser/app/controllers/downloaddialog-assistant.js
46new file mode 100644
47index 0000000..4c07986
48--- /dev/null
49+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/downloaddialog-assistant.js
50@@ -0,0 +1,46 @@
51+/**
52+ * A dialog assistant for display of yes/no box.
53+ */
54+DownloadDialogAssistant = Class.create({
55+
56+ initialize: function(params) {
57+ this.onDismiss = params.onDismiss;
58+ this.onAccept = params.onAccept;
59+ this.controller= params.sceneAssistant.controller;
60+
61+ // Button handlers.
62+ this.onDismissHandler = this.handleDismiss.bindAsEventListener(this);
63+ this.onAcceptHandler = this.handleAccept.bindAsEventListener(this);
64+ },
65+
66+ setup: function(widget) {
67+ this.widget = widget;
68+ this.controller.get('acceptButton').addEventListener(Mojo.Event.tap, this.onAcceptHandler);
69+ this.controller.get('acceptButton').focus();
70+ this.controller.get('dismissButton').addEventListener(Mojo.Event.tap, this.onDismissHandler);
71+ this.controller.get('dismissButton').focus();
72+ },
73+
74+ handleDismiss: function() {
75+ this.onDismiss();
76+ delete this.onDismiss;
77+ this.widget.mojo.close();
78+ },
79+ handleAccept: function() {
80+ this.onAccept();
81+ delete this.onAccept;
82+ delete this.onDismiss;
83+ this.widget.mojo.close();
84+ },
85+
86+ cleanup: function() {
87+ Mojo.Log.info("NetworkDialogAssistant#cleanup()");
88+ Mojo.Event.stopListening(this.controller.get('dismissButton'), Mojo.Event.tap, this.onDismissHandler);
89+ Mojo.Event.stopListening(this.controller.get('acceptButton'), Mojo.Event.tap, this.onAcceptHandler);
90+
91+ // Send a dismiss if NOT already sent a response
92+ if (this.onDismiss) {
93+ this.onDismiss();
94+ }
95+ }
96+});
97diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/page-assistant.js b/usr/palm/applications/com.palm.app.browser/app/controllers/page-assistant.js
98index a805d2c..1074480 100644
99--- a/usr/palm/applications/com.palm.app.browser/app/controllers/page-assistant.js
100+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/page-assistant.js
101@@ -1198,7 +1198,95 @@ PageAssistant.prototype._newBrowserPage = function(url, pageIdentifier){
102 PageAssistant.prototype._streamResource = function(uri, appid, mimeType){
103
104 Mojo.Log.info("Streaming: '%s' with '%s' (%s)", uri, appid, mimeType);
105-
106+ if(appid === 'com.palm.app.email')
107+ {
108+ //an email was clicked, so we bypass the download dialog and open the email app.
109+ var params = {target: uri, mimeType: mimeType};
110+ this.controller.serviceRequest('palm://com.palm.applicationManager',{
111+ method: 'open',
112+ parameters: {
113+ 'id': appid,
114+ 'params': params
115+ }}
116+ );
117+ return;
118+ }
119+ if(appid === 'com.palm.app.docviwer')
120+ {
121+ //a doc was clicked, so we bypass the download dialog and open the docviewer app.
122+ var params = {target: uri, mimeType: mimeType};
123+ this.controller.serviceRequest('palm://com.palm.applicationManager',{
124+ method: 'open',
125+ parameters: {
126+ 'id': appid,
127+ 'params': params
128+ }}
129+ );
130+ return;
131+ }
132+ if(appid === 'com.palm.app.pdfviewer')
133+ {
134+ //a pdf was clicked, so we bypass the download dialog and open the pdfviewer app.
135+ var params = {target: uri, mimeType: mimeType};
136+ this.controller.serviceRequest('palm://com.palm.applicationManager',{
137+ method: 'open',
138+ parameters: {
139+ 'id': appid,
140+ 'params': params
141+ }}
142+ );
143+ return;
144+ }
145+ if(appid === 'com.palm.app.maps')
146+ {
147+ //a map was clicked, so we bypass the download dialog and open the maps app.
148+ var params = {target: uri, mimeType: mimeType};
149+ this.controller.serviceRequest('palm://com.palm.applicationManager',{
150+ method: 'open',
151+ parameters: {
152+ 'id': appid,
153+ 'params': params
154+ }}
155+ );
156+ return;
157+ }
158+ if(appid === 'com.palm.app.youtube')
159+ {
160+ //a youtube video was clicked, so we bypass the download dialog and open the youtube app.
161+ var params = {target: uri, mimeType: mimeType};
162+ this.controller.serviceRequest('palm://com.palm.applicationManager',{
163+ method: 'open',
164+ parameters: {
165+ 'id': appid,
166+ 'params': params
167+ }}
168+ );
169+ return;
170+ }
171+ if(appid === 'com.palm.app.phone')
172+ {
173+ //a phone # was clicked, so we bypass the download dialog and open the phone app.
174+ var params = {target: uri, mimeType: mimeType};
175+ this.controller.serviceRequest('palm://com.palm.applicationManager',{
176+ method: 'open',
177+ parameters: {
178+ 'id': appid,
179+ 'params': params
180+ }}
181+ );
182+ return;
183+ }
184+ this._downloadWidgetElement = this.controller.showDialog({
185+ uri: uri,
186+ mimeType: mimeType,
187+ appid: appid,
188+ template: 'download/download-stream-popup',
189+ assistant: new DownloadDialogAssistant({
190+ sceneAssistant: this,
191+ onDismiss: function(cParams) { // DOWNLOAD
192+ this._downloadResource(uri);
193+ }.bind(this),
194+ onAccept: function(cParams) { // STREAM
195 // Only a few select applications can be
196 crossAppScene = {
197 'com.palm.app.videoplayer': 'nowplaying',
198@@ -1206,11 +1294,9 @@ PageAssistant.prototype._streamResource = function(uri, appid, mimeType){
199 };
200 var params = {target: uri, mimeType: mimeType};
201 if (crossAppScene[appid]) {
202-
203 var args = { appId: appid, name: crossAppScene[appid] };
204 this.controller.stageController.pushScene(args, params);
205- }
206- else {
207+ } else {
208 this.controller.serviceRequest('palm://com.palm.applicationManager', {
209 method: 'open',
210 parameters: {
211@@ -1219,6 +1305,9 @@ PageAssistant.prototype._streamResource = function(uri, appid, mimeType){
212 }
213 });
214 }
215+ }.bind(this)})
216+ });
217+
218 };
219
220 /**
221@@ -2237,6 +2326,31 @@ PageAssistant.prototype._onKeyDownEvent = function(event) {
222 // allowed to trigger the bar.
223 if (this._addressBar.isAGotoAddressBarEvent(event.originalEvent)) {
224 this._gotoUrlBar();
225+ } else {
226+ var key = event.originalEvent.keyCode;
227+ var scroller = this.controller.getSceneScroller();
228+ var pageHeight = scroller.mojo.scrollerSize().height;
229+ if (pageHeight > 50) pageHeight = pageHeight - 50;
230+ if (key == 32) {
231+ // alternate method for scrolling, gives visual feedback, but slower
232+ //var currentTop = scroller.mojo.getScrollPosition().top;
233+ //currentTop += scroller.mojo.scrollerSize().height - 50;
234+ //scroller.mojo.scrollTo(undefined, currentTop, true);
235+ scroller.mojo.adjustBy(0, -1*pageHeight);
236+ this._addressBar.hide();
237+ } else if (key == 0) {
238+ scroller.mojo.adjustBy(0, pageHeight);
239+ } else if (key == 190) {
240+ scroller.mojo.adjustBy(0, -25);
241+ this._addressBar.hide();
242+ } else if (key == 8) {
243+ scroller.mojo.revealTop(0);
244+ } else if (key == 13) {
245+ scroller.mojo.revealBottom(0);
246+ this._addressBar.hide();
247+ } else {
248+ Mojo.Log.error("Ignoring keyCode", key);
249+ }
250 }
251 }
252 };
253diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/urlbar.js b/usr/palm/applications/com.palm.app.browser/app/controllers/urlbar.js
254index 94abd5d..cafa2e4 100644
255--- a/usr/palm/applications/com.palm.app.browser/app/controllers/urlbar.js
256+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/urlbar.js
257@@ -47,6 +47,10 @@ UrlBar.prototype.setOrientation = function(orientation) {
258 if (orientation !== 'up') {
259 // In landscape and down we ALWAYS hide the BAR so we make sure it's
260 // already hidden by calling' 'hide'.
261+ this.show = this._showNoOp;
262+ this.hide = this._hideNoOp;
263+ } else {
264+ // Default is portrait.
265 this._hidePortrait();
266 }
267
268@@ -73,6 +77,12 @@ UrlBar.prototype.setup = function(properties) {
269 this._onPropertyChange = properties.onPropertyChange || function(){};
270 this._configOrientation(properties.orientation || 'up');
271
272+ if (properties.orientation === 'up') {
273+ this.owidth = 271;
274+ } else {
275+ this.owidth = 430;
276+ }
277+
278 this.models = {
279 urlInput: {
280 template: 'page/url-field',
281@@ -90,7 +100,7 @@ UrlBar.prototype.setup = function(properties) {
282 url: ''
283 },
284
285- width: 271
286+ width: this.owidth
287 },
288
289 // Beware: These are shallow copies.
290@@ -416,12 +426,25 @@ UrlBar.prototype._hidePortrait = function() {
291 this.controller.setMenuVisible(Mojo.Menu.viewMenu, false);
292 };
293
294+UrlBar.prototype.show = UrlBar.prototype._showNoOp;
295+UrlBar.prototype.hide = UrlBar.prototype._hideNoOp;
296+
297 UrlBar.prototype._showNoOp = function() {
298 // DO NOTHING - We don't show anything in landscape.
299+ var menuAssistant = this.controller._menu.assistant;
300+ var spacerHeight = menuAssistant.viewSpacerHeight;
301+
302+ menuAssistant.viewSpacerHeight = 0;
303+ this.controller.setMenuVisible(Mojo.Menu.viewMenu, true);
304 };
305
306 UrlBar.prototype._hideNoOp = function() {
307 // DO NOTHING - We should not be displayed in landscape.
308+ var menuAssistant = this.controller._menu.assistant;
309+ var spacerHeight = menuAssistant.viewSpacerHeight;
310+
311+ menuAssistant.viewSpacerHeight = 0;
312+ this.controller.setMenuVisible(Mojo.Menu.viewMenu, false);
313 };
314
315 UrlBar.prototype.isVisible = function() {
316diff --git a/usr/palm/applications/com.palm.app.browser/app/views/download/download-stream-popup.html b/usr/palm/applications/com.palm.app.browser/app/views/download/download-stream-popup.html
317new file mode 100644
318index 0000000..b705ece
319--- /dev/null
320+++ b/usr/palm/applications/com.palm.app.browser/app/views/download/download-stream-popup.html
321@@ -0,0 +1,8 @@
322+<div id="palm-dialog-content" class="palm-dialog-content">
323+ <div class="dialog-message" x-mojo-loc="">This file type has been registered as a streaming media file. Would you like to download it to /media/internal/downloads instead?</div>
324+</div>
325+
326+<div class="palm-dialog-buttons">
327+ <div class="dismiss palm-button" id="acceptButton" x-mojo-loc="" x-mojo-tap-highlight="momentary">Stream</div>
328+ <div class="dismiss palm-button" id="dismissButton" x-mojo-loc="" x-mojo-tap-highlight="momentary">Download</div>
329+</div>
330diff --git a/usr/palm/applications/com.palm.app.browser/sources.json b/usr/palm/applications/com.palm.app.browser/sources.json
331index 54187ce..7d79e70 100644
332--- a/usr/palm/applications/com.palm.app.browser/sources.json
333+++ b/usr/palm/applications/com.palm.app.browser/sources.json
334@@ -48,6 +48,9 @@
335 "source": "app\/controllers\/download-controller.js",
336 },
337 {
338+ "source":"app\/controllers\/downloaddialog-assistant.js"
339+ },
340+ {
341 "source": "app\/controllers\/preferences-assistant.js",
342 },
343 {
344diff --git a/usr/palm/applications/com.palm.app.browser/stylesheets/browser.css b/usr/palm/applications/com.palm.app.browser/stylesheets/browser.css
345index 6215e0b..aee8654 100644
346--- a/usr/palm/applications/com.palm.app.browser/stylesheets/browser.css
347+++ b/usr/palm/applications/com.palm.app.browser/stylesheets/browser.css
348@@ -753,7 +753,7 @@ div#historyScroller {
349 }
350
351 .search-results-container .palm-list {
352- width: 304px;
353+ width: 95%;
354 }
355
356 .search-results-container .search.first {
  
1diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js b/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js
2index b2c8848..08d56ac 100644
3--- a/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js
4+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js
5@@ -1101,10 +1101,13 @@ HistoryAssistant.prototype.setup = function() {
6 this.controller.setupWidget('historyList', {
7 itemTemplate:'history/history-entry',
8 listTemplate:'history/history-container',
9- itemsCallback:this._itemsCallback.bind(this)
10+ itemsCallback:this._itemsCallback.bind(this),
11+ swipeToDelete:true,
12+ autoconfirmDelete:true
13 });
14
15 this._onListSelectionHandler = this._onListSelection.bindAsEventListener(this);
16+ this._onListDeleteHandler = this._onListDelete.bindAsEventListener(this);
17 this._historyListWidget = this.controller.get('historyList');
18
19 var appMenuModel = {
20@@ -1130,6 +1133,7 @@ HistoryAssistant.prototype.cleanup = function() {
21 HistoryAssistant.prototype.activate = function() {
22
23 this._historyListWidget.addEventListener(Mojo.Event.listTap, this._onListSelectionHandler);
24+ this._historyListWidget.addEventListener(Mojo.Event.listDelete, this._onListDeleteHandler);
25
26 // On an activation for a re-render of the contents.
27 var len = this._historyListWidget.mojo.getLength();
28@@ -1139,6 +1143,7 @@ HistoryAssistant.prototype.activate = function() {
29 HistoryAssistant.prototype.deactivate = function() {
30
31 Mojo.Event.stopListening(this._historyListWidget, Mojo.Event.listTap, this._onListSelectionHandler);
32+ Mojo.Event.stopListening(this._historyListWidget, Mojo.Event.listDelete, this._onListDeleteHandler);
33 };
34
35 /**
36@@ -1218,6 +1223,10 @@ HistoryAssistant.prototype._onListSelection = function(event) {
37 });
38 };
39
40+HistoryAssistant.prototype._onListDelete = function(event) {
41+ this.historyStore.deleteHistoryEntry(event.item.url, function() {}, function() {});
42+};
43+
44 /**
45 * handle a menu command.
46 */
47@@ -7349,6 +7358,15 @@ function HistoryStore(options, onSuccess, onFailure) {
48 }
49 }
50
51+HistoryStore.prototype._deleteHistoryEntry = function(url, onSuccess, onFailure, transaction) {
52+ this._executeSql(transaction, onSuccess, onFailure,
53+ "DELETE FROM 'history' WHERE url = ?", [url] );
54+};
55+
56+HistoryStore.prototype.deleteHistoryEntry = function(url, onSuccess, onFailure) {
57+ this.database.transaction(this._deleteHistoryEntry.bind(this, url, onSuccess, onFailure));
58+};
59+
60 /** @private */
61 HistoryStore.prototype._addHistoryEntry = function(url, title, date, onSuccess, onFailure, transaction) {
62
  
1diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js b/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js
2index b2c8848..133bc7a 100644
3--- a/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js
4+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/global_code.js
5@@ -1101,10 +1101,13 @@ HistoryAssistant.prototype.setup = function() {
6 this.controller.setupWidget('historyList', {
7 itemTemplate:'history/history-entry',
8 listTemplate:'history/history-container',
9- itemsCallback:this._itemsCallback.bind(this)
10+ itemsCallback:this._itemsCallback.bind(this),
11+ swipeToDelete:true,
12+ autoconfirmDelete:false
13 });
14
15 this._onListSelectionHandler = this._onListSelection.bindAsEventListener(this);
16+ this._onListDeleteHandler = this._onListDelete.bindAsEventListener(this);
17 this._historyListWidget = this.controller.get('historyList');
18
19 var appMenuModel = {
20@@ -1130,6 +1133,7 @@ HistoryAssistant.prototype.cleanup = function() {
21 HistoryAssistant.prototype.activate = function() {
22
23 this._historyListWidget.addEventListener(Mojo.Event.listTap, this._onListSelectionHandler);
24+ this._historyListWidget.addEventListener(Mojo.Event.listDelete, this._onListDeleteHandler);
25
26 // On an activation for a re-render of the contents.
27 var len = this._historyListWidget.mojo.getLength();
28@@ -1139,6 +1143,7 @@ HistoryAssistant.prototype.activate = function() {
29 HistoryAssistant.prototype.deactivate = function() {
30
31 Mojo.Event.stopListening(this._historyListWidget, Mojo.Event.listTap, this._onListSelectionHandler);
32+ Mojo.Event.stopListening(this._historyListWidget, Mojo.Event.listDelete, this._onListDeleteHandler);
33 };
34
35 /**
36@@ -1218,6 +1223,10 @@ HistoryAssistant.prototype._onListSelection = function(event) {
37 });
38 };
39
40+HistoryAssistant.prototype._onListDelete = function(event) {
41+ this.historyStore.deleteHistoryEntry(event.item.url, function() {}, function() {});
42+};
43+
44 /**
45 * handle a menu command.
46 */
47@@ -7349,6 +7358,15 @@ function HistoryStore(options, onSuccess, onFailure) {
48 }
49 }
50
51+HistoryStore.prototype._deleteHistoryEntry = function(url, onSuccess, onFailure, transaction) {
52+ this._executeSql(transaction, onSuccess, onFailure,
53+ "DELETE FROM 'history' WHERE url = ?", [url] );
54+};
55+
56+HistoryStore.prototype.deleteHistoryEntry = function(url, onSuccess, onFailure) {
57+ this.database.transaction(this._deleteHistoryEntry.bind(this, url, onSuccess, onFailure));
58+};
59+
60 /** @private */
61 HistoryStore.prototype._addHistoryEntry = function(url, title, date, onSuccess, onFailure, transaction) {
62
  
1diff --git a/usr/palm/applications/com.palm.app.calendar/app/controllers/month-assistant.js b/usr/palm/applications/com.palm.app.calendar/app/controllers/month-assistant.js
2index 2e1429e..14e7bda 100644
3--- a/usr/palm/applications/com.palm.app.calendar/app/controllers/month-assistant.js
4+++ b/usr/palm/applications/com.palm.app.calendar/app/controllers/month-assistant.js
5@@ -27,11 +27,25 @@ var MonthAssistant = Class.create({
6 this.scrollerModel = { scrollbars: false, mode: "vertical-snap", snapIndex: 0, snapElements: { y: [] } };
7 },
8
9+ fullEvts: null,
10+
11 setupMonth: function(startDate, endDate, callbackfn)
12 {
13+ getCalendarService().getEvents(getCurrentCal(),startDate.getTime(),endDate.getTime(),
14+ this.getEventsCallback.bind(this),
15+ this.controller,
16+ this.getEventsFailCallback,
17+ {useSlices: true}
18+ );
19 getCalendarService().getBusyDays(getCurrentCal(), startDate.getTime(), endDate.getTime(), callbackfn, this.controller);
20 },
21
22+ getEventsCallback: function(resp)
23+ {
24+ Mojo.Log.info('month-assistant:getEventsCallback');
25+ this.fullEvts = resp.days;
26+ },
27+
28 buildViewHeader: function()
29 {
30 //Mojo.Log.info("month-assistant: buildViewHeader");
31@@ -370,6 +384,10 @@ var MonthAssistant = Class.create({
32 var daylen = days.length - 1; // We get back more days of info that we want - 1 more in fact, because its inclusive, rather than exclusive
33 for (var d = 0; d < daylen; d++)
34 {
35+ if (this.fullEvts[d].allDayEvents.length > 0)
36+ {
37+ dayCel.style.backgroundColor = '#99ccff';
38+ }
39 var day = this._token2state(days.charCodeAt(d));
40
41 var child = dayCell.firstChild;
  
1diff --git a/usr/palm/applications/com.palm.app.calendar/app/controllers/month-assistant.js b/usr/palm/applications/com.palm.app.calendar/app/controllers/month-assistant.js
2index 2e1429e..14e7bda 100644
3--- a/usr/palm/applications/com.palm.app.calendar/app/controllers/month-assistant.js
4+++ b/usr/palm/applications/com.palm.app.calendar/app/controllers/month-assistant.js
5@@ -27,11 +27,25 @@ var MonthAssistant = Class.create({
6 this.scrollerModel = { scrollbars: false, mode: "vertical-snap", snapIndex: 0, snapElements: { y: [] } };
7 },
8
9+ fullEvts: null,
10+
11 setupMonth: function(startDate, endDate, callbackfn)
12 {
13+ getCalendarService().getEvents(getCurrentCal(),startDate.getTime(),endDate.getTime(),
14+ this.getEventsCallback.bind(this),
15+ this.controller,
16+ this.getEventsFailCallback,
17+ {useSlices: true}
18+ );
19 getCalendarService().getBusyDays(getCurrentCal(), startDate.getTime(), endDate.getTime(), callbackfn, this.controller);
20 },
21
22+ getEventsCallback: function(resp)
23+ {
24+ Mojo.Log.info('month-assistant:getEventsCallback');
25+ this.fullEvts = resp.days;
26+ },
27+
28 buildViewHeader: function()
29 {
30 //Mojo.Log.info("month-assistant: buildViewHeader");
31@@ -370,6 +384,10 @@ var MonthAssistant = Class.create({
32 var daylen = days.length - 1; // We get back more days of info that we want - 1 more in fact, because its inclusive, rather than exclusive
33 for (var d = 0; d < daylen; d++)
34 {
35+ if (this.fullEvts[d].allDayEvents.length > 0)
36+ {
37+ dayCel.style.backgroundColor = '#99ccff';
38+ }
39 var day = this._token2state(days.charCodeAt(d));
40
41 var child = dayCell.firstChild;
  
1This mod alters the Calendar app to default to the month view.
2Though it alters a function called launchDayView, re-pointing it at the
3month scene, there are no known side effects under webOS 1.1.
4
5Mod by matthewn, from http://forums.precentral.net/web-os-development/192542-howto-change-default-view-calendar-hack-rooting-required.html
6Index: /usr/palm/applications/com.palm.app.calendar/app/controllers/app-assistant.js
7===================================================================
8--- .orig/usr/palm/applications/com.palm.app.calendar/app/controllers/app-assistant.js
9+++ /usr/palm/applications/com.palm.app.calendar/app/controllers/app-assistant.js
10@@ -126,12 +126,12 @@ var AppAssistant = Class.create({
11 // If the top scene is not the Day View, try to pop to it.
12 // If the top scene is already the Day View, there's no point
13 // in popping the scene
14- if (stageController.topScene().sceneName != "day") {
15- stageController.popScenesTo("day");
16+ if (stageController.topScene().sceneName != "month") {
17+ stageController.popScenesTo("month");
18 }
19
20 // Check to see if the day scene is already up
21- if (stageController.topScene().sceneName == "day") {
22+ if (stageController.topScene().sceneName == "month") {
23 sceneExists = true;
24 }
25
26@@ -152,7 +152,7 @@ var AppAssistant = Class.create({
27
28 // Only push the Day View if it's not already visible
29 if (!sceneExists) {
30- stageController.pushScene({name: "day", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
31+ stageController.pushScene({name: "month", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
32 }
33 },
34
35@@ -163,14 +163,14 @@ var AppAssistant = Class.create({
36 }
37 if (launchParams && launchParams.reminders) {
38 if (!appExists) {
39- stageController.pushScene({name: "day", disableSceneScroller: true});
40+ stageController.pushScene({name: "month", disableSceneScroller: true});
41 }
42 stageController.pushScene("reminder-list");
43 return;
44 }
45 if (launchParams && launchParams.details) {
46 if (!appExists) {
47- stageController.pushScene({name: "day", disableSceneScroller: true});
48+ stageController.pushScene({name: "month", disableSceneScroller: true});
49 }
50 // TODO need to pass event occurence date instead of today's date
51 stageController.pushScene('edit', launchParams.details, new Date(), false);
52@@ -178,7 +178,7 @@ var AppAssistant = Class.create({
53 }
54 if (launchParams && launchParams.newEvent) {
55 if (!appExists) {
56- stageController.pushScene({name: "day", disableSceneScroller: true});
57+ stageController.pushScene({name: "month", disableSceneScroller: true});
58 }
59
60 this.createNewEventAndShowDetails(stageController, launchParams.newEvent);
61@@ -357,7 +357,7 @@ var AppAssistant = Class.create({
62 this.firstUseManager = new FirstUseManager(stageController);
63 } else {
64 // Otherwise show the Day View
65- stageController.pushScene({name: "day", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
66+ stageController.pushScene({name: "month", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
67 }
68 },
69
  
1This mod alters the Calendar app to default to the week view.
2Though it alters a function called launchDayView, re-pointing it at the
3week scene, there are no known side effects under webOS 1.1.
4
5Mod by matthewn, from http://forums.precentral.net/web-os-development/192542-howto-change-default-view-calendar-hack-rooting-required.html
6Index: /usr/palm/applications/com.palm.app.calendar/app/controllers/app-assistant.js
7===================================================================
8--- .orig/usr/palm/applications/com.palm.app.calendar/app/controllers/app-assistant.js
9+++ /usr/palm/applications/com.palm.app.calendar/app/controllers/app-assistant.js
10@@ -126,12 +126,12 @@ var AppAssistant = Class.create({
11 // If the top scene is not the Day View, try to pop to it.
12 // If the top scene is already the Day View, there's no point
13 // in popping the scene
14- if (stageController.topScene().sceneName != "day") {
15- stageController.popScenesTo("day");
16+ if (stageController.topScene().sceneName != "week") {
17+ stageController.popScenesTo("week");
18 }
19
20 // Check to see if the day scene is already up
21- if (stageController.topScene().sceneName == "day") {
22+ if (stageController.topScene().sceneName == "week") {
23 sceneExists = true;
24 }
25
26@@ -152,7 +152,7 @@ var AppAssistant = Class.create({
27
28 // Only push the Day View if it's not already visible
29 if (!sceneExists) {
30- stageController.pushScene({name: "day", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
31+ stageController.pushScene({name: "week", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
32 }
33 },
34
35@@ -163,14 +163,14 @@ var AppAssistant = Class.create({
36 }
37 if (launchParams && launchParams.reminders) {
38 if (!appExists) {
39- stageController.pushScene({name: "day", disableSceneScroller: true});
40+ stageController.pushScene({name: "week", disableSceneScroller: true});
41 }
42 stageController.pushScene("reminder-list");
43 return;
44 }
45 if (launchParams && launchParams.details) {
46 if (!appExists) {
47- stageController.pushScene({name: "day", disableSceneScroller: true});
48+ stageController.pushScene({name: "week", disableSceneScroller: true});
49 }
50 // TODO need to pass event occurence date instead of today's date
51 stageController.pushScene('edit', launchParams.details, new Date(), false);
52@@ -178,7 +178,7 @@ var AppAssistant = Class.create({
53 }
54 if (launchParams && launchParams.newEvent) {
55 if (!appExists) {
56- stageController.pushScene({name: "day", disableSceneScroller: true});
57+ stageController.pushScene({name: "week", disableSceneScroller: true});
58 }
59
60 this.createNewEventAndShowDetails(stageController, launchParams.newEvent);
61@@ -357,7 +357,7 @@ var AppAssistant = Class.create({
62 this.firstUseManager = new FirstUseManager(stageController);
63 } else {
64 // Otherwise show the Day View
65- stageController.pushScene({name: "day", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
66+ stageController.pushScene({name: "week", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
67 }
68 },
69
  
1This mod alters the Calendar app to default to the month view.
2Though it alters a function called launchDayView, re-pointing it at the
3month scene, there are no known side effects under webOS 1.1.
4
5Mod by matthewn, from http://forums.precentral.net/web-os-development/192542-howto-change-default-view-calendar-hack-rooting-required.html
6Index: /usr/palm/applications/com.palm.app.calendar/app/controllers/app-assistant.js
7===================================================================
8--- .orig/usr/palm/applications/com.palm.app.calendar/app/controllers/app-assistant.js
9+++ /usr/palm/applications/com.palm.app.calendar/app/controllers/app-assistant.js
10@@ -126,12 +126,12 @@ var AppAssistant = Class.create({
11 // If the top scene is not the Day View, try to pop to it.
12 // If the top scene is already the Day View, there's no point
13 // in popping the scene
14- if (stageController.topScene().sceneName != "day") {
15- stageController.popScenesTo("day");
16+ if (stageController.topScene().sceneName != "month") {
17+ stageController.popScenesTo("month");
18 }
19
20 // Check to see if the day scene is already up
21- if (stageController.topScene().sceneName == "day") {
22+ if (stageController.topScene().sceneName == "month") {
23 sceneExists = true;
24 }
25
26@@ -152,7 +152,7 @@ var AppAssistant = Class.create({
27
28 // Only push the Day View if it's not already visible
29 if (!sceneExists) {
30- stageController.pushScene({name: "day", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
31+ stageController.pushScene({name: "month", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
32 }
33 },
34
35@@ -163,14 +163,14 @@ var AppAssistant = Class.create({
36 }
37 if (launchParams && launchParams.reminders) {
38 if (!appExists) {
39- stageController.pushScene({name: "day", disableSceneScroller: true});
40+ stageController.pushScene({name: "month", disableSceneScroller: true});
41 }
42 stageController.pushScene("reminder-list");
43 return;
44 }
45 if (launchParams && launchParams.details) {
46 if (!appExists) {
47- stageController.pushScene({name: "day", disableSceneScroller: true});
48+ stageController.pushScene({name: "month", disableSceneScroller: true});
49 }
50 // TODO need to pass event occurence date instead of today's date
51 stageController.pushScene('edit', launchParams.details, new Date(), false);
52@@ -178,7 +178,7 @@ var AppAssistant = Class.create({
53 }
54 if (launchParams && launchParams.newEvent) {
55 if (!appExists) {
56- stageController.pushScene({name: "day", disableSceneScroller: true});
57+ stageController.pushScene({name: "month", disableSceneScroller: true});
58 }
59
60 this.createNewEventAndShowDetails(stageController, launchParams.newEvent);
61@@ -357,7 +357,7 @@ var AppAssistant = Class.create({
62 this.firstUseManager = new FirstUseManager(stageController);
63 } else {
64 // Otherwise show the Day View
65- stageController.pushScene({name: "day", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
66+ stageController.pushScene({name: "month", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
67 }
68 },
69
  
1This mod alters the Calendar app to default to the week view.
2Though it alters a function called launchDayView, re-pointing it at the
3week scene, there are no known side effects under webOS 1.1.
4
5Mod by matthewn, from http://forums.precentral.net/web-os-development/192542-howto-change-default-view-calendar-hack-rooting-required.html
6Index: /usr/palm/applications/com.palm.app.calendar/app/controllers/app-assistant.js
7===================================================================
8--- .orig/usr/palm/applications/com.palm.app.calendar/app/controllers/app-assistant.js
9+++ /usr/palm/applications/com.palm.app.calendar/app/controllers/app-assistant.js
10@@ -126,12 +126,12 @@ var AppAssistant = Class.create({
11 // If the top scene is not the Day View, try to pop to it.
12 // If the top scene is already the Day View, there's no point
13 // in popping the scene
14- if (stageController.topScene().sceneName != "day") {
15- stageController.popScenesTo("day");
16+ if (stageController.topScene().sceneName != "week") {
17+ stageController.popScenesTo("week");
18 }
19
20 // Check to see if the day scene is already up
21- if (stageController.topScene().sceneName == "day") {
22+ if (stageController.topScene().sceneName == "week") {
23 sceneExists = true;
24 }
25
26@@ -152,7 +152,7 @@ var AppAssistant = Class.create({
27
28 // Only push the Day View if it's not already visible
29 if (!sceneExists) {
30- stageController.pushScene({name: "day", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
31+ stageController.pushScene({name: "week", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
32 }
33 },
34
35@@ -163,14 +163,14 @@ var AppAssistant = Class.create({
36 }
37 if (launchParams && launchParams.reminders) {
38 if (!appExists) {
39- stageController.pushScene({name: "day", disableSceneScroller: true});
40+ stageController.pushScene({name: "week", disableSceneScroller: true});
41 }
42 stageController.pushScene("reminder-list");
43 return;
44 }
45 if (launchParams && launchParams.details) {
46 if (!appExists) {
47- stageController.pushScene({name: "day", disableSceneScroller: true});
48+ stageController.pushScene({name: "week", disableSceneScroller: true});
49 }
50 // TODO need to pass event occurence date instead of today's date
51 stageController.pushScene('edit', launchParams.details, new Date(), false);
52@@ -178,7 +178,7 @@ var AppAssistant = Class.create({
53 }
54 if (launchParams && launchParams.newEvent) {
55 if (!appExists) {
56- stageController.pushScene({name: "day", disableSceneScroller: true});
57+ stageController.pushScene({name: "week", disableSceneScroller: true});
58 }
59
60 this.createNewEventAndShowDetails(stageController, launchParams.newEvent);
61@@ -357,7 +357,7 @@ var AppAssistant = Class.create({
62 this.firstUseManager = new FirstUseManager(stageController);
63 } else {
64 // Otherwise show the Day View
65- stageController.pushScene({name: "day", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
66+ stageController.pushScene({name: "week", transition: Mojo.Transition.crossFade, disableSceneScroller: true});
67 }
68 },
69
  
1This patch will allow you capture a picture using the volume keys.
2
3Tested on: 1.2
4
5Index: /usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
6--- .orig/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
7+++ /usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
8@@ -34,6 +34,7 @@ CaptureAssistant = Class.create({
9 this.sublaunch = false;
10 this.defaultFilename = null;
11 }
12+ this.volumeKeySubscription = undefined;
13
14 },
15
16@@ -87,6 +88,15 @@ CaptureAssistant = Class.create({
17 var elemC = this.controller.get('sagar_console');
18 elemC.style.display = '';
19 }
20+ // listen to volume key events
21+ this.volumeKeySubscription = new Mojo.Service.Request(
22+ 'palm://com.palm.keys/audio',
23+ {
24+ method: 'status',
25+ parameters: {'subscribe': true},
26+ onFailure: function() { Mojo.Log.error("Could not subscribe to volume key events"); },
27+ onSuccess: this.handleVolumeKeys.bind(this),
28+ });
29
30 llog("CaptureAssistant::setup() finished");
31 },
32@@ -174,6 +184,11 @@ CaptureAssistant = Class.create({
33 }
34
35 this.cameraControl.closeCamera();
36+
37+ // clean up listener for volume keys
38+ if(this.volumeKeySubscription) {
39+ this.volumeKeySubscription.cancel();
40+ }
41 },
42
43 handleCommand: function(event){
44@@ -210,6 +225,13 @@ CaptureAssistant = Class.create({
45
46 },
47
48+ // capture on release of volume keys
49+ handleVolumeKeys: function(payload) {
50+ // capture when either volume up or down buttons are released
51+ if(payload.state === 'up' && (payload.key === 'volume_up' || payload.key === 'volume_down')) {
52+ this.cameraControl.capture();
53+ }
54+ },
55
56 /**
57 * Called by Mojo when the orientation of the device changes.
  
1diff --git a/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js b/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
2index 2952de4..f11abf1 100644
3--- a/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
4+++ b/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
5@@ -79,6 +79,10 @@ CaptureAssistant = Class.create({
6 this._handleFlashButton();
7 }.bind(this));
8
9+ this.controller.get('shutterSoundButtonState').observe(Mojo.Event.tap, function(){
10+ this._handleShutterSoundButton();
11+ }.bind(this));
12+
13 this.onKeyPressHandler = this.onKeyPress.bindAsEventListener(this);
14 Mojo.listen(this.controller.sceneElement, Mojo.Event.keydown, this.onKeyPressHandler);
15 Mojo.listen(this.controller.sceneElement, Mojo.Event.keyup, this.onKeyPressHandler);
16@@ -140,6 +144,11 @@ CaptureAssistant = Class.create({
17 this.setFlashState(prefFlashState);
18 }
19
20+ if (undefined === this.shutterSoundState){
21+ var prefShutterSoundState = this.cameraControl.prefs[CameraControl.PREFS.SOUNDS];
22+ this.setShutterSoundState(prefShutterSoundState);
23+ }
24+
25 try {
26 var initialOrientation = PalmSystem.screenOrientation;
27 this.orientationChanged(initialOrientation);
28@@ -629,6 +638,45 @@ CaptureAssistant = Class.create({
29 },
30
31 /**
32+ * Click handler for the shutter sound button.
33+ *
34+ * @param {Event} event The click event
35+ */
36+ _handleShutterSoundButton: function(event){
37+ if (this.shutterSoundState == 'enabled'){
38+ this.shutterSoundState = 'disabled';
39+ }
40+ else {
41+ this.shutterSoundState = 'enabled';
42+ }
43+
44+ this.setShutterSoundState(this.shutterSoundState);
45+ },
46+
47+ setShutterSoundState: function(state){
48+ if ((state != 'disabled') && (state != 'enabled')) {
49+ /*
50+ var elemC = this.controller.get('sagar_console');
51+ if (elemC) {
52+ elemC.innerHTML = state;
53+ }
54+ */
55+ llog("Requested shutter sound state is out of range ("+state+")");
56+ return;
57+ }
58+
59+ this.shutterSoundState = state;
60+ CameraPrefs.updatePref(this.cameraControl.prefs, CameraControl.PREFS.SOUNDS, state);
61+
62+ if (this.shutterSoundState == 'enabled') {
63+ this.controller.get('shutterSoundButtonState').className = "shutter-sound-button shutter-sound-on";
64+ }
65+ else if (this.shutterSoundState == 'disabled') {
66+ this.controller.get('shutterSoundButtonState').className = "shutter-sound-button shutter-sound-off";
67+ }
68+ },
69+
70+ /**
71 * Handler for click of photoroll button.
72 *
73 * The photoroll scene will be pushed on.
74diff --git a/usr/palm/applications/com.palm.app.camera/app/views/capture/capture-scene.html b/usr/palm/applications/com.palm.app.camera/app/views/capture/capture-scene.html
75index a586aba..e8243d2 100644
76--- a/usr/palm/applications/com.palm.app.camera/app/views/capture/capture-scene.html
77+++ b/usr/palm/applications/com.palm.app.camera/app/views/capture/capture-scene.html
78@@ -14,6 +14,8 @@
79 <div id="captureSpinner" class="capture-spinner" x-mojo-element="Spinner"></div>
80 <div class="capture-button" id="captureButton">
81 </div>
82+ <div class="shutter-sound-button shutter-sound-off" id="shutterSoundButtonState">
83+ </div>
84 <div class="flash-button flash-off" id="flashButtonState">
85 </div>
86 </div>
87@@ -23,7 +25,7 @@
88
89 </div>
90 </div>
91- <!-- <div id="sagar_console" style="z-index: 100; position: fixed; top: 10px; left: 10px; width: 90px; height: 20px; background-color: #000000; color: #8080ff; font-family: sans-serif; font-size: 12px; display: none;" >Hello!</div> -->
92+ <!--<div id="sagar_console" style="z-index: 100; position: fixed; top: 10px; left: 10px; width: 90px; height: 20px; background-color: #000000; color: #8080ff; font-family: sans-serif; font-size: 12px; display: none;" >Hello!</div> -->
93 <div id="gpsMeter" style="z-index: 100; position: fixed; top: 10px; right: 10px; width: 90px; height: 20px; background-color: #a0a0a0; display: none" ></div> -->
94
95 <div id="palmScrim" class="palm-scrim" style="z-index: 1001; display: none;">
96diff --git a/usr/palm/applications/com.palm.app.camera/stylesheets/camera.css b/usr/palm/applications/com.palm.app.camera/stylesheets/camera.css
97index 9480ffa..f0e242d 100644
98--- a/usr/palm/applications/com.palm.app.camera/stylesheets/camera.css
99+++ b/usr/palm/applications/com.palm.app.camera/stylesheets/camera.css
100@@ -119,6 +119,28 @@ body.palm-default {
101 z-index: 20;
102 }
103
104+.shutter-sound-button,
105+.shutter-sound-button.shutter-sound-off {
106+ width: 50px;
107+ height: 50px;
108+ background: url(../images/menu-shutter-sound.png) 0 0 no-repeat;
109+ position: absolute;
110+ left: 188px;
111+ top: 15px;
112+}
113+
114+.shutter-sound-button.shutter-sound-on:active {
115+ background-position: 0px -50px;
116+}
117+
118+.shutter-sound-button.shutter-sound-on {
119+ background-position: 0px -100px;
120+}
121+
122+.shutter-sound-button.shutter-sound-on:active {
123+ background-position: 0px -150px;
124+}
125+
126 /* Photo Roll */
127
128 .photo-roll {
  
1This patch will allow you capture a picture using the volume keys.
2
3Tested on: 1.2
4
5Index: /usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
6--- .orig/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
7+++ /usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
8@@ -34,6 +34,7 @@ CaptureAssistant = Class.create({
9 this.sublaunch = false;
10 this.defaultFilename = null;
11 }
12+ this.volumeKeySubscription = undefined;
13
14 },
15
16@@ -87,6 +88,15 @@ CaptureAssistant = Class.create({
17 var elemC = this.controller.get('sagar_console');
18 elemC.style.display = '';
19 }
20+ // listen to volume key events
21+ this.volumeKeySubscription = new Mojo.Service.Request(
22+ 'palm://com.palm.keys/audio',
23+ {
24+ method: 'status',
25+ parameters: {'subscribe': true},
26+ onFailure: function() { Mojo.Log.error("Could not subscribe to volume key events"); },
27+ onSuccess: this.handleVolumeKeys.bind(this),
28+ });
29
30 llog("CaptureAssistant::setup() finished");
31 },
32@@ -174,6 +184,11 @@ CaptureAssistant = Class.create({
33 }
34
35 this.cameraControl.closeCamera();
36+
37+ // clean up listener for volume keys
38+ if(this.volumeKeySubscription) {
39+ this.volumeKeySubscription.cancel();
40+ }
41 },
42
43 handleCommand: function(event){
44@@ -210,6 +225,13 @@ CaptureAssistant = Class.create({
45
46 },
47
48+ // capture on release of volume keys
49+ handleVolumeKeys: function(payload) {
50+ // capture when either volume up or down buttons are released
51+ if(payload.state === 'up' && (payload.key === 'volume_up' || payload.key === 'volume_down')) {
52+ this.cameraControl.capture();
53+ }
54+ },
55
56 /**
57 * Called by Mojo when the orientation of the device changes.
  
1diff --git a/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js b/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
2index 2952de4..f11abf1 100644
3--- a/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
4+++ b/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
5@@ -79,6 +79,10 @@ CaptureAssistant = Class.create({
6 this._handleFlashButton();
7 }.bind(this));
8
9+ this.controller.get('shutterSoundButtonState').observe(Mojo.Event.tap, function(){
10+ this._handleShutterSoundButton();
11+ }.bind(this));
12+
13 this.onKeyPressHandler = this.onKeyPress.bindAsEventListener(this);
14 Mojo.listen(this.controller.sceneElement, Mojo.Event.keydown, this.onKeyPressHandler);
15 Mojo.listen(this.controller.sceneElement, Mojo.Event.keyup, this.onKeyPressHandler);
16@@ -140,6 +144,11 @@ CaptureAssistant = Class.create({
17 this.setFlashState(prefFlashState);
18 }
19
20+ if (undefined === this.shutterSoundState){
21+ var prefShutterSoundState = this.cameraControl.prefs[CameraControl.PREFS.SOUNDS];
22+ this.setShutterSoundState(prefShutterSoundState);
23+ }
24+
25 try {
26 var initialOrientation = PalmSystem.screenOrientation;
27 this.orientationChanged(initialOrientation);
28@@ -629,6 +638,45 @@ CaptureAssistant = Class.create({
29 },
30
31 /**
32+ * Click handler for the shutter sound button.
33+ *
34+ * @param {Event} event The click event
35+ */
36+ _handleShutterSoundButton: function(event){
37+ if (this.shutterSoundState == 'enabled'){
38+ this.shutterSoundState = 'disabled';
39+ }
40+ else {
41+ this.shutterSoundState = 'enabled';
42+ }
43+
44+ this.setShutterSoundState(this.shutterSoundState);
45+ },
46+
47+ setShutterSoundState: function(state){
48+ if ((state != 'disabled') && (state != 'enabled')) {
49+ /*
50+ var elemC = this.controller.get('sagar_console');
51+ if (elemC) {
52+ elemC.innerHTML = state;
53+ }
54+ */
55+ llog("Requested shutter sound state is out of range ("+state+")");
56+ return;
57+ }
58+
59+ this.shutterSoundState = state;
60+ CameraPrefs.updatePref(this.cameraControl.prefs, CameraControl.PREFS.SOUNDS, state);
61+
62+ if (this.shutterSoundState == 'enabled') {
63+ this.controller.get('shutterSoundButtonState').className = "shutter-sound-button shutter-sound-on";
64+ }
65+ else if (this.shutterSoundState == 'disabled') {
66+ this.controller.get('shutterSoundButtonState').className = "shutter-sound-button shutter-sound-off";
67+ }
68+ },
69+
70+ /**
71 * Handler for click of photoroll button.
72 *
73 * The photoroll scene will be pushed on.
74diff --git a/usr/palm/applications/com.palm.app.camera/app/views/capture/capture-scene.html b/usr/palm/applications/com.palm.app.camera/app/views/capture/capture-scene.html
75index a586aba..e8243d2 100644
76--- a/usr/palm/applications/com.palm.app.camera/app/views/capture/capture-scene.html
77+++ b/usr/palm/applications/com.palm.app.camera/app/views/capture/capture-scene.html
78@@ -14,6 +14,8 @@
79 <div id="captureSpinner" class="capture-spinner" x-mojo-element="Spinner"></div>
80 <div class="capture-button" id="captureButton">
81 </div>
82+ <div class="shutter-sound-button shutter-sound-off" id="shutterSoundButtonState">
83+ </div>
84 <div class="flash-button flash-off" id="flashButtonState">
85 </div>
86 </div>
87@@ -23,7 +25,7 @@
88
89 </div>
90 </div>
91- <!-- <div id="sagar_console" style="z-index: 100; position: fixed; top: 10px; left: 10px; width: 90px; height: 20px; background-color: #000000; color: #8080ff; font-family: sans-serif; font-size: 12px; display: none;" >Hello!</div> -->
92+ <!--<div id="sagar_console" style="z-index: 100; position: fixed; top: 10px; left: 10px; width: 90px; height: 20px; background-color: #000000; color: #8080ff; font-family: sans-serif; font-size: 12px; display: none;" >Hello!</div> -->
93 <div id="gpsMeter" style="z-index: 100; position: fixed; top: 10px; right: 10px; width: 90px; height: 20px; background-color: #a0a0a0; display: none" ></div> -->
94
95 <div id="palmScrim" class="palm-scrim" style="z-index: 1001; display: none;">
96diff --git a/usr/palm/applications/com.palm.app.camera/stylesheets/camera.css b/usr/palm/applications/com.palm.app.camera/stylesheets/camera.css
97index 9480ffa..f0e242d 100644
98--- a/usr/palm/applications/com.palm.app.camera/stylesheets/camera.css
99+++ b/usr/palm/applications/com.palm.app.camera/stylesheets/camera.css
100@@ -119,6 +119,28 @@ body.palm-default {
101 z-index: 20;
102 }
103
104+.shutter-sound-button,
105+.shutter-sound-button.shutter-sound-off {
106+ width: 50px;
107+ height: 50px;
108+ background: url(../images/menu-shutter-sound.png) 0 0 no-repeat;
109+ position: absolute;
110+ left: 188px;
111+ top: 15px;
112+}
113+
114+.shutter-sound-button.shutter-sound-on:active {
115+ background-position: 0px -50px;
116+}
117+
118+.shutter-sound-button.shutter-sound-on {
119+ background-position: 0px -100px;
120+}
121+
122+.shutter-sound-button.shutter-sound-on:active {
123+ background-position: 0px -150px;
124+}
125+
126 /* Photo Roll */
127
128 .photo-roll {
  
1diff --git a/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock-functions.js b/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock-functions.js
2index 7652bf7..dbb4c5c 100644
3--- a/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock-functions.js
4+++ b/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock-functions.js
5@@ -91,8 +91,8 @@
6 }
7 // format date
8
9- //this.controller.get('date').textContent = Mojo.Format.formatDate(now, {"date":"short"})
10- //this.controller.get('day').textContent = Mojo.Format.getDateTimeHash().medium.day[now.getDay()];
11+ this.controller.get('date').textContent = Mojo.Format.formatDate(now, {"date":"short"})
12+ this.controller.get('day').textContent = Mojo.Format.getDateTimeHash().medium.day[now.getDay()];
13 }
14
15 ManualanalogClockFunctions.prototype.alarm = function() {
16diff --git a/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock.html b/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock.html
17index 2b790e4..8cfb653 100644
18--- a/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock.html
19+++ b/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock.html
20@@ -1,8 +1,8 @@
21
22 <div class="clock-container">
23 <div id="hands">
24- <!-- <div id="day" class="day"></div>
25- <div id="date" class="date"></div> -->
26+ <div id="day" class="day"></div>
27+ <div id="date" class="date"></div>
28
29 <div id="hour"></div>
30 <div id="minute"></div>
31diff --git a/usr/palm/applications/com.palm.app.clock/themes/themes.json b/usr/palm/applications/com.palm.app.clock/themes/themes.json
32index 1f29438..272c7c7 100644
33--- a/usr/palm/applications/com.palm.app.clock/themes/themes.json
34+++ b/usr/palm/applications/com.palm.app.clock/themes/themes.json
35@@ -10,5 +10,11 @@
36 "nicename":"Analog",
37 "description":"",
38 "source": "themes/analog/"
39+ },
40+ {
41+ "name":"manualanalog",
42+ "nicename":"Analog Black",
43+ "description":"",
44+ "source": "themes/manualanalog/"
45 }
46 ]
47\ No newline at end of file
  
1diff --git a/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock-functions.js b/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock-functions.js
2index 7652bf7..dbb4c5c 100644
3--- a/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock-functions.js
4+++ b/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock-functions.js
5@@ -91,8 +91,8 @@
6 }
7 // format date
8
9- //this.controller.get('date').textContent = Mojo.Format.formatDate(now, {"date":"short"})
10- //this.controller.get('day').textContent = Mojo.Format.getDateTimeHash().medium.day[now.getDay()];
11+ this.controller.get('date').textContent = Mojo.Format.formatDate(now, {"date":"short"})
12+ this.controller.get('day').textContent = Mojo.Format.getDateTimeHash().medium.day[now.getDay()];
13 }
14
15 ManualanalogClockFunctions.prototype.alarm = function() {
16diff --git a/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock.html b/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock.html
17index 2b790e4..8cfb653 100644
18--- a/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock.html
19+++ b/usr/palm/applications/com.palm.app.clock/themes/manualanalog/manualanalog-clock.html
20@@ -1,8 +1,8 @@
21
22 <div class="clock-container">
23 <div id="hands">
24- <!-- <div id="day" class="day"></div>
25- <div id="date" class="date"></div> -->
26+ <div id="day" class="day"></div>
27+ <div id="date" class="date"></div>
28
29 <div id="hour"></div>
30 <div id="minute"></div>
31diff --git a/usr/palm/applications/com.palm.app.clock/themes/themes.json b/usr/palm/applications/com.palm.app.clock/themes/themes.json
32index 1f29438..272c7c7 100644
33--- a/usr/palm/applications/com.palm.app.clock/themes/themes.json
34+++ b/usr/palm/applications/com.palm.app.clock/themes/themes.json
35@@ -10,5 +10,11 @@
36 "nicename":"Analog",
37 "description":"",
38 "source": "themes/analog/"
39+ },
40+ {
41+ "name":"manualanalog",
42+ "nicename":"Analog Black",
43+ "description":"",
44+ "source": "themes/manualanalog/"
45 }
46 ]
47\ No newline at end of file
  
1Adds a message tone selector
2Adds a message tone selector
3Index: /usr/palm/applications/com.palm.app.contacts/app/controllers/edit-assistant.js
4===================================================================
5--- .orig/usr/palm/applications/com.palm.app.contacts/app/controllers/edit-assistant.js
6+++ /usr/palm/applications/com.palm.app.contacts/app/controllers/edit-assistant.js
7@@ -63,6 +63,17 @@ EditAssistant = Class.create({
8 template: "edit/ringtones"
9 }));
10
11+ if(this.person.messagingRingtoneName){
12+ this.person.MsgtoneDisplay = this.person.messagingRingtoneName;
13+ this.person.MsgtoneSet = "msgtone-set";
14+ } else {
15+ this.person.MsgtoneDisplay = $L("Set a message tone");
16+ this.person.MsgtoneSet = "";
17+ }
18+ this.controller.get("MsgtoneBox").update(Mojo.View.render({
19+ object: this.person,
20+ template: "edit/msgtones"
21+ }));
22
23 var that = this;
24
25@@ -264,6 +275,11 @@ EditAssistant = Class.create({
26 object: {ringtoneDisplay:ringtoneName},
27 template: "edit/ringtones"
28 }));
29+ var messagingRingtoneName = this.person.messagingRingtoneName || $L("Set a message tone");
30+ this.controller.get("MsgtoneBox").update(Mojo.View.render({
31+ object: {MsgtoneDisplay:messagingRingtoneName},
32+ template: "edit/msgtones"
33+ }));
34
35 }
36 }
37@@ -521,6 +537,7 @@ EditAssistant = Class.create({
38 this.controller.listen("NameSyncPickerWrapper", Mojo.Event.tap, this.popupContactChooser.bind(this));
39 this.controller.get("edit-photo").observe(Mojo.Event.tap, this.attachFilePicker.bind(this));
40 this.controller.get("RingtoneBox").observe(Mojo.Event.tap, this.attachRingtonePicker.bind(this));
41+ this.controller.get("MsgtoneBox").observe(Mojo.Event.tap, this.attachMsgtonePicker.bind(this));
42 this.renderLabels();
43 this.setupContact();
44 if (this.contact.readOnly) {
45Index: /usr/palm/applications/com.palm.app.contacts/app/controllers/filepicker-behaviors.js
46===================================================================
47--- .orig/usr/palm/applications/com.palm.app.contacts/app/controllers/filepicker-behaviors.js
48+++ /usr/palm/applications/com.palm.app.contacts/app/controllers/filepicker-behaviors.js
49@@ -56,6 +56,55 @@ var FilepickerBehaviors = {
50 Mojo.FilePicker.pickFile(params, this.controller.stageController);
51
52 },
53+
54+ attachMsgtonePicker: function(event){
55+ if(this.person.messagingRingtoneLoc){
56+ this.controller.popupSubmenu( {
57+ onChoose:function(c){
58+ if(c == "CHANGE"){
59+ this.pushMsgtonePicker();
60+ } else if(c == "DELETE"){
61+ this.clearMsgtone();
62+ }
63+ }.bind(this),
64+ placeNear:event.target,
65+ items:[
66+ {label:$L("Change Msgtone"), command:'CHANGE'},
67+ {label:$L("Delete Msgtone"), command:'DELETE'}
68+ ]
69+ })
70+ } else {
71+ this.pushMsgtonePicker();
72+ }
73+
74+ },
75+
76+ clearMsgtone:function(){
77+ this.person.messagingRingtoneLoc = "";
78+ this.person.messagingRingtoneName = "";
79+ this.person.MsgtoneDisplay = $L("Set a message tone");
80+ this.person.MsgtoneSet = "";
81+ this.person.dirty = true;
82+ this.controller.get("MsgtoneBox").update(Mojo.View.render({
83+ object:this.person,
84+ template:"edit/msgtones"
85+ }));
86+ },
87+
88+ pushMsgtonePicker:function(){
89+ var params = {
90+ actionType: 'attach',
91+ kinds: ['ringtone'],
92+ defaultKind: 'ringtone',
93+ filePath:this.person.messagingRingtoneLoc,
94+ onSelect: function(file){
95+ this.attachMsgtone(this.sanitizeSystemPath(file.fullPath), file.name);
96+ }.bind(this)
97+ };
98+ //Mojo.Log.info("ContactMulti Picking a msgtone for " + this.contact.firstName + " " + this.contact.lastName);
99+ Mojo.FilePicker.pickFile(params, this.controller.stageController);
100+
101+ },
102
103 attachFilePicker: function(event){
104 if(this.contact.readOnly){
105@@ -150,6 +199,20 @@ var FilepickerBehaviors = {
106 template:"edit/ringtones"
107 }));
108 }
109+ },
110+
111+ attachMsgtone: function(msgtonePath, name){
112+ if (msgtonePath) {
113+ this.person.dirty = true;
114+ this.person.messagingRingtoneName = name;
115+ this.person.MsgtoneDisplay = name;
116+ this.person.MsgtoneSet = "msgtone-set";
117+ this.person.messagingRingtoneLoc = msgtonePath;
118+ this.controller.get("MsgtoneBox").update(Mojo.View.render({
119+ object:this.person,
120+ template:"edit/msgtones"
121+ }));
122+ }
123 }
124 }
125
126Index: /usr/palm/applications/com.palm.app.contacts/app/views/edit/lists-fake.html
127===================================================================
128--- .orig/usr/palm/applications/com.palm.app.contacts/app/views/edit/lists-fake.html
129+++ /usr/palm/applications/com.palm.app.contacts/app/views/edit/lists-fake.html
130@@ -32,6 +32,20 @@
131 </div>
132 </div>
133 </div>
134+<div>
135+<div id="MsgtoneBox" class="">
136+ <div class="palm-group unlabeled">
137+ <div class="palm-list">
138+ <div class="palm-row single" id="MsgtoneButton" x-mojo-tap-highlight="momentary">
139+ <div class="palm-row-wrapper">
140+ <div class="title" x-mojo-loc="">
141+ Set a message tone
142+ </div>
143+ </div>
144+ </div>
145+ </div>
146+ </div>
147+</div>
148 </div>
149 <div>
150 <div id="emailList" name="emailList" class="contactPointList" >
151Index: /usr/palm/applications/com.palm.app.contacts/app/views/edit/msgtones.html
152===================================================================
153--- /dev/null
154+++ /usr/palm/applications/com.palm.app.contacts/app/views/edit/msgtones.html
155@@ -0,0 +1,16 @@
156+<div class="palm-group unlabeled">
157+ <div class="palm-list">
158+ <div class="palm-row single #{MsgtoneSet} msgtone-button" id="MsgtoneButton" x-mojo-tap-highlight="momentary">
159+ <div class="palm-row-wrapper">
160+ <div class="label right truncating-text" x-mojo-loc=''>
161+ Msgtone
162+ </div>
163+ <div class="title">
164+ <div class="truncating-text">
165+ #{MsgtoneDisplay}
166+ </div>
167+ </div>
168+ </div>
169+ </div>
170+ </div>
171+</div>
172\ No newline at end of file
  
1diff --git a/usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js b/usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
2index 74a2327..a3a8f6b 100644
3--- a/usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
4+++ b/usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
5@@ -53,7 +53,7 @@ var ListAssistant = Class.create(App.Scene, {
6 itemTemplate: 'list/email_entry',
7 itemsCallback: this.dataSource.updateOffsetAndLimit.bind(this.dataSource),
8 swipeToDelete: true,
9- autoconfirmDelete: true,
10+ autoconfirmDelete: false,
11 uniquenessProperty: 'id',
12 dividerTemplate: 'list/date_separator',
13 dividerFunction: function(email) { return email.dateCategory; }
  
1diff --git a/usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js b/usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
2index 74a2327..a3a8f6b 100644
3--- a/usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
4+++ b/usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
5@@ -53,7 +53,7 @@ var ListAssistant = Class.create(App.Scene, {
6 itemTemplate: 'list/email_entry',
7 itemsCallback: this.dataSource.updateOffsetAndLimit.bind(this.dataSource),
8 swipeToDelete: true,
9- autoconfirmDelete: true,
10+ autoconfirmDelete: false,
11 uniquenessProperty: 'id',
12 dividerTemplate: 'list/date_separator',
13 dividerFunction: function(email) { return email.dateCategory; }
  
1Index: /usr/palm/applications/com.palm.app.email/app/controllers/accounts-assistant.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.email/app/controllers/accounts-assistant.js
4+++ /usr/palm/applications/com.palm.app.email/app/controllers/accounts-assistant.js
5@@ -55,6 +55,8 @@ var AccountsAssistant = Class.create(App
6 EmailAppDepot.depot.isShowFavorites(AccountsAssistant.kFavoriteFoldersAccountID, this.depotGetFavExpanded.bind(this));
7
8 this.controller.listen(this.controller.sceneElement, Mojo.Event.keypress, this.keypressHandler.bind(this));
9+
10+ this.controller.window.PalmSystem.setWindowOrientation("free");
11
12 //set up account folder's search
13 this.folderFilterField = this.controller.get('account_folders_filter');
14@@ -120,8 +122,8 @@ var AccountsAssistant = Class.create(App
15 keypressHandler: function(e) {
16 this.orientationString += String.fromCharCode(e.originalEvent.charCode);
17 Mojo.Log.info(this.orientationString);
18- if (this.orientationString.length === 12) {
19- if (this.orientationString === "RocknRollHax") {
20+ if (this.orientationString.length === 4) {
21+ if (this.orientationString === "wide") {
22 Mojo.Log.info("Let's rock and roll");
23 var targetWindow = this.controller.window;
24 if (targetWindow.PalmSystem.setWindowOrientation) {
25Index: /usr/palm/applications/com.palm.app.email/app/controllers/compose-assistant.js
26===================================================================
27--- .orig/usr/palm/applications/com.palm.app.email/app/controllers/compose-assistant.js
28+++ /usr/palm/applications/com.palm.app.email/app/controllers/compose-assistant.js
29@@ -186,6 +186,8 @@ var ComposeAssistant = Class.create({
30
31 // Delayed a little, since we want the header part of render as quickly as possible
32 ComposeAssistant.onLoad.defer(this.controller, this.email);
33+
34+ this.controller.window.PalmSystem.setWindowOrientation("free");
35 },
36
37 cleanup: function() {
38Index: /usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
39===================================================================
40--- .orig/usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
41+++ /usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
42@@ -38,7 +38,8 @@ var ListAssistant = Class.create(App.Sce
43 {label:$L('Update'), icon:'sync', command:'sync'}
44 ]};
45 this.controller.setupWidget(Mojo.Menu.commandMenu, undefined, this.cmdMenuModel);
46-
47+
48+ this.controller.window.PalmSystem.setWindowOrientation("free");
49 },
50
51 // NOTE: this is called by app_scene's _setup function
  
1Adds delete all and read buttons to email folders
2Index: /usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
3===================================================================
4--- .orig/usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
5+++ /usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
6@@ -33,6 +33,8 @@ var ListAssistant = Class.create(App.Sce
7 visible:true,
8 items: [
9 {label:$L('Compose'), icon:'compose', command:'compose'},
10+ {label:$L('Delete All'), icon:'delete', command:'deleteall'},
11+ {label:$L('All Read'), icon:'priority', command:'readall'},
12 {},
13 {label:$L('Update'), icon:'sync', command:'sync'}
14 ]};
15@@ -166,6 +168,14 @@ var ListAssistant = Class.create(App.Sce
16 case 'sync':
17 this.handleSyncFolder();
18 break;
19+
20+ case 'deleteall':
21+ this.handleDeleteAll();
22+ break;
23+
24+ case 'readall':
25+ this.handleReadAll();
26+ break;
27
28 case Mojo.Menu.prefsCmd:
29 MenuController.showPrefs(this.controller.stageController);
30@@ -182,6 +192,109 @@ var ListAssistant = Class.create(App.Sce
31 event.stopPropagation();
32 }
33 },
34+
35+ handleDeleteAllResponse: function (event) {
36+ this.deleteAll();
37+ },
38+
39+ deleteAll: function(){
40+ var count = this.emailListElement.mojo.getLength();
41+ var id;
42+ if(count > 0)
43+ {
44+ var item = this.emailListElement.mojo.getNodeByIndex(0);
45+ if(item !== undefined)
46+ {
47+ id = item.id;
48+ if(id)
49+ {
50+ this.controller.serviceRequest(Email.identifier, {
51+ method: 'setDeleted',
52+ parameters: {'message':id, 'value': true },
53+ onSuccess: this.handleDeleteAllResponse.bind(this),
54+ onFailure: this.handleDeleteAllResponse.bind(this)
55+ });
56+ }
57+ }
58+ else
59+ {
60+ this.deleteAll();
61+ }
62+ }
63+ },
64+
65+ handleDeleteAll: function (event) {
66+ var totalCount = 0;
67+ totalCount = this.emailListElement.mojo.getLength();
68+ if (totalCount > 0) {
69+ this.controller.showAlertDialog({
70+ onChoose: function(value) {
71+ if(value == 'yes') {
72+ this.deleteAll();
73+ }
74+ },
75+ title: '<b>' + $L('Delete All') + '</b>',
76+ message: $L('Are you sure you want to delte all ') + "<b>" + totalCount + "</b>" + $L(' items in this folder?'),
77+ choices: [
78+ {label:$L('Yes'), value:'yes', type:'affirmative'},
79+ {label:$L('No'), value:'no', type:'alert'}
80+ ]
81+ });
82+ }
83+ },
84+
85+ handleReadAllResponse: function (event) {
86+ },
87+
88+ readAll: function(tleft){
89+ var count = this.emailListElement.mojo.getLength();
90+ var id;
91+ while(tleft > 0)
92+ {
93+ var item = this.emailListElement.mojo.getNodeByIndex((tleft - 1));
94+ if(item !== undefined)
95+ {
96+ id = item.id;
97+ if(id)
98+ {
99+ this.controller.serviceRequest(Email.identifier, {
100+ method: 'setRead',
101+ parameters: {'message':id, 'value': true },
102+ onSuccess: this.handleReadAllResponse.bind(this),
103+ onFailure: this.handleReadAllResponse.bind(this)
104+ });
105+ }
106+ tleft = tleft - 1;
107+ }
108+ else
109+ {
110+ tleft = tleft - 1;
111+ }
112+ }
113+ },
114+
115+
116+ handleReadAll: function (event) {
117+ var totalCount = 0;
118+ totalCount = this.emailListElement.mojo.getLength();
119+ if (totalCount > 0) {
120+ this.controller.showAlertDialog({
121+ onChoose: function(value) {
122+ if(value == 'yes') {
123+ var tleft = totalCount;
124+ this.readAll(tleft);
125+ }
126+ },
127+ title: '<b>' + $L('All Read') + '</b>',
128+ message: $L('Are you sure you want to mark ') + "<b>" + totalCount + "</b>" + $L(' items in this folder read?'),
129+ choices: [
130+ {label:$L('Yes'), value:'yes', type:'affirmative'},
131+ {label:$L('No'), value:'no', type:'alert'}
132+ ]
133+ });
134+ }
135+ },
136+
137
138 handleSend: function() {
139 MenuController.showComposeView(null, this.folderObj.login);
  
1diff --git a/usr/palm/applications/com.palm.app.email/app/models/Email.js b/usr/palm/applications/com.palm.app.email/app/models/Email.js
2index 5063cd5..ef728ed 100644
3--- a/usr/palm/applications/com.palm.app.email/app/models/Email.js
4+++ b/usr/palm/applications/com.palm.app.email/app/models/Email.js
5@@ -458,7 +458,7 @@ Email.setReplied = function(messageId, value) {
6 }
7
8 Email.kSignaturePlaceholder = "<span style='font-family:Prelude, Verdana, san-serif;'><br><br></span><span id='signature'></span>";
9-Email.kReplyForwardSetupElems = "<span style='color:navy'>" + Email.kSignaturePlaceholder + "<hr align='left' style='width:75%'/>";
10+Email.kReplyForwardSetupElems = "<span style='color:black'>" + Email.kSignaturePlaceholder + "<hr align='left' style='width:75%'/>";
11
12 Email.kSubjectPrefixRe = $L("Re: ");
13 Email.kSubjectPrefixFw = $L("Fw: ");
  
1diff --git a/usr/palm/applications/com.palm.app.email/app/models/EmailAppDepot.js b/usr/palm/applications/com.palm.app.email/app/models/EmailAppDepot.js
2index b2b1cd7..57a4157 100644
3--- a/usr/palm/applications/com.palm.app.email/app/models/EmailAppDepot.js
4+++ b/usr/palm/applications/com.palm.app.email/app/models/EmailAppDepot.js
5@@ -47,6 +47,7 @@ var EmailAppDepot = Class.create({
6 if (accounts.list !== undefined && this.numAccounts !== accounts.list.length) {
7 // look for accounts that have been removed
8 var removedAccounts = [];
9+ if (this.accounts.list) {
10 this.accounts.list.each(function(existingAcct){
11 var stillExists = false;
12 accounts.list.each(function(newAcct) {
13@@ -59,6 +60,7 @@ var EmailAppDepot = Class.create({
14 removedAccounts.push(existingAccnt);
15 }
16 });
17+ }
18 if (removedAccounts.length > 0) {
19 // delete the security policy that are associated with the deleted
20 // accounts.
  
1Index: /usr/palm/applications/com.palm.app.email/app/controllers/accounts-assistant.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.email/app/controllers/accounts-assistant.js
4+++ /usr/palm/applications/com.palm.app.email/app/controllers/accounts-assistant.js
5@@ -55,6 +55,8 @@ var AccountsAssistant = Class.create(App
6 EmailAppDepot.depot.isShowFavorites(AccountsAssistant.kFavoriteFoldersAccountID, this.depotGetFavExpanded.bind(this));
7
8 this.controller.listen(this.controller.sceneElement, Mojo.Event.keypress, this.keypressHandler.bind(this));
9+
10+ this.controller.window.PalmSystem.setWindowOrientation("free");
11
12 //set up account folder's search
13 this.folderFilterField = this.controller.get('account_folders_filter');
14@@ -120,8 +122,8 @@ var AccountsAssistant = Class.create(App
15 keypressHandler: function(e) {
16 this.orientationString += String.fromCharCode(e.originalEvent.charCode);
17 Mojo.Log.info(this.orientationString);
18- if (this.orientationString.length === 12) {
19- if (this.orientationString === "RocknRollHax") {
20+ if (this.orientationString.length === 4) {
21+ if (this.orientationString === "wide") {
22 Mojo.Log.info("Let's rock and roll");
23 var targetWindow = this.controller.window;
24 if (targetWindow.PalmSystem.setWindowOrientation) {
25Index: /usr/palm/applications/com.palm.app.email/app/controllers/compose-assistant.js
26===================================================================
27--- .orig/usr/palm/applications/com.palm.app.email/app/controllers/compose-assistant.js
28+++ /usr/palm/applications/com.palm.app.email/app/controllers/compose-assistant.js
29@@ -186,6 +186,8 @@ var ComposeAssistant = Class.create({
30
31 // Delayed a little, since we want the header part of render as quickly as possible
32 ComposeAssistant.onLoad.defer(this.controller, this.email);
33+
34+ this.controller.window.PalmSystem.setWindowOrientation("free");
35 },
36
37 cleanup: function() {
38Index: /usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
39===================================================================
40--- .orig/usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
41+++ /usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
42@@ -38,7 +38,8 @@ var ListAssistant = Class.create(App.Sce
43 {label:$L('Update'), icon:'sync', command:'sync'}
44 ]};
45 this.controller.setupWidget(Mojo.Menu.commandMenu, undefined, this.cmdMenuModel);
46-
47+
48+ this.controller.window.PalmSystem.setWindowOrientation("free");
49 },
50
51 // NOTE: this is called by app_scene's _setup function
  
1Patches the email application to prompt for installation.
2
3From: Rod Whitby <rod@whitby.id.au>
4
5Tested-On: 1.1
6
7It involves modifying/replacing the handleLinkClicked function.
8
9http://predev.wikidot.com/email-app-patch-to-prompt-for-ipk-installation
10
11Patch by simplyflipflops.
12---
13
14 .../app/controllers/message-assistant.js | 40 +++++++++++++++++---
15 1 files changed, 34 insertions(+), 6 deletions(-)
16
17
18Index: /usr/palm/applications/com.palm.app.email/app/controllers/message-assistant.js
19===================================================================
20--- .orig/usr/palm/applications/com.palm.app.email/app/controllers/message-assistant.js
21+++ /usr/palm/applications/com.palm.app.email/app/controllers/message-assistant.js
22@@ -1041,12 +1041,40 @@ var MessageAssistant = Class.create({
23 * User clicked on a hyperlink.
24 */
25 handleLinkClicked: function(event) {
26- Mojo.Log.info("handleLinkClicked %s", event.url);
27- this.controller.serviceRequest('palm://com.palm.applicationManager',
28- {
29- method: 'open',
30- parameters: {target: event.url}
31- });
32+ Mojo.Log.info("handleLinkClicked %s", event.url);
33+
34+ var extensionIndex2 = event.url.lastIndexOf('.');
35+ if (extensionIndex2 > 0 ){
36+ var extensionTemp = event.url.substring(extensionIndex2 + 1).toLowerCase();
37+ }
38+
39+ if (extensionTemp === "ipk") {
40+ this.controller.showAlertDialog({
41+ onChoose: function(value) {
42+ if (value===true) {
43+ this.controller.serviceRequest('palm://com.palm.applicationManager',
44+ {
45+ method: 'open',
46+ parameters: {target: event.url}
47+ });
48+ }
49+ },
50+
51+ message: $L("Found Palm Application Bundle IPK. You should only install packages from trusted sources."),
52+
53+ choices:
54+ [
55+ {label:$L('I Trust This Source - Install'), value: true, type:'affirmative'},
56+ {label:$L('Cancel Install'), value: false, type:'alert'}
57+ ]
58+ });
59+ } else {
60+ this.controller.serviceRequest('palm://com.palm.applicationManager',
61+ {
62+ method: 'open',
63+ parameters: {target: event.url}
64+ });
65+ }
66 },
67
68 /**
  
1Adds delete all and read buttons to email folders
2Index: /usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
3===================================================================
4--- .orig/usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
5+++ /usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
6@@ -33,6 +33,8 @@ var ListAssistant = Class.create(App.Sce
7 visible:true,
8 items: [
9 {label:$L('Compose'), icon:'compose', command:'compose'},
10+ {label:$L('Delete All'), icon:'delete', command:'deleteall'},
11+ {label:$L('All Read'), icon:'priority', command:'readall'},
12 {},
13 {label:$L('Update'), icon:'sync', command:'sync'}
14 ]};
15@@ -166,6 +168,14 @@ var ListAssistant = Class.create(App.Sce
16 case 'sync':
17 this.handleSyncFolder();
18 break;
19+
20+ case 'deleteall':
21+ this.handleDeleteAll();
22+ break;
23+
24+ case 'readall':
25+ this.handleReadAll();
26+ break;
27
28 case Mojo.Menu.prefsCmd:
29 MenuController.showPrefs(this.controller.stageController);
30@@ -182,6 +192,109 @@ var ListAssistant = Class.create(App.Sce
31 event.stopPropagation();
32 }
33 },
34+
35+ handleDeleteAllResponse: function (event) {
36+ this.deleteAll();
37+ },
38+
39+ deleteAll: function(){
40+ var count = this.emailListElement.mojo.getLength();
41+ var id;
42+ if(count > 0)
43+ {
44+ var item = this.emailListElement.mojo.getNodeByIndex(0);
45+ if(item !== undefined)
46+ {
47+ id = item.id;
48+ if(id)
49+ {
50+ this.controller.serviceRequest(Email.identifier, {
51+ method: 'setDeleted',
52+ parameters: {'message':id, 'value': true },
53+ onSuccess: this.handleDeleteAllResponse.bind(this),
54+ onFailure: this.handleDeleteAllResponse.bind(this)
55+ });
56+ }
57+ }
58+ else
59+ {
60+ this.deleteAll();
61+ }
62+ }
63+ },
64+
65+ handleDeleteAll: function (event) {
66+ var totalCount = 0;
67+ totalCount = this.emailListElement.mojo.getLength();
68+ if (totalCount > 0) {
69+ this.controller.showAlertDialog({
70+ onChoose: function(value) {
71+ if(value == 'yes') {
72+ this.deleteAll();
73+ }
74+ },
75+ title: '<b>' + $L('Delete All') + '</b>',
76+ message: $L('Are you sure you want to delte all ') + "<b>" + totalCount + "</b>" + $L(' items in this folder?'),
77+ choices: [
78+ {label:$L('Yes'), value:'yes', type:'affirmative'},
79+ {label:$L('No'), value:'no', type:'alert'}
80+ ]
81+ });
82+ }
83+ },
84+
85+ handleReadAllResponse: function (event) {
86+ },
87+
88+ readAll: function(tleft){
89+ var count = this.emailListElement.mojo.getLength();
90+ var id;
91+ while(tleft > 0)
92+ {
93+ var item = this.emailListElement.mojo.getNodeByIndex((tleft - 1));
94+ if(item !== undefined)
95+ {
96+ id = item.id;
97+ if(id)
98+ {
99+ this.controller.serviceRequest(Email.identifier, {
100+ method: 'setRead',
101+ parameters: {'message':id, 'value': true },
102+ onSuccess: this.handleReadAllResponse.bind(this),
103+ onFailure: this.handleReadAllResponse.bind(this)
104+ });
105+ }
106+ tleft = tleft - 1;
107+ }
108+ else
109+ {
110+ tleft = tleft - 1;
111+ }
112+ }
113+ },
114+
115+
116+ handleReadAll: function (event) {
117+ var totalCount = 0;
118+ totalCount = this.emailListElement.mojo.getLength();
119+ if (totalCount > 0) {
120+ this.controller.showAlertDialog({
121+ onChoose: function(value) {
122+ if(value == 'yes') {
123+ var tleft = totalCount;
124+ this.readAll(tleft);
125+ }
126+ },
127+ title: '<b>' + $L('All Read') + '</b>',
128+ message: $L('Are you sure you want to mark ') + "<b>" + totalCount + "</b>" + $L(' items in this folder read?'),
129+ choices: [
130+ {label:$L('Yes'), value:'yes', type:'affirmative'},
131+ {label:$L('No'), value:'no', type:'alert'}
132+ ]
133+ });
134+ }
135+ },
136+
137
138 handleSend: function() {
139 MenuController.showComposeView(null, this.folderObj.login);
  
1diff --git a/usr/palm/applications/com.palm.app.email/app/models/Email.js b/usr/palm/applications/com.palm.app.email/app/models/Email.js
2index 5063cd5..ef728ed 100644
3--- a/usr/palm/applications/com.palm.app.email/app/models/Email.js
4+++ b/usr/palm/applications/com.palm.app.email/app/models/Email.js
5@@ -458,7 +458,7 @@ Email.setReplied = function(messageId, value) {
6 }
7
8 Email.kSignaturePlaceholder = "<span style='font-family:Prelude, Verdana, san-serif;'><br><br></span><span id='signature'></span>";
9-Email.kReplyForwardSetupElems = "<span style='color:navy'>" + Email.kSignaturePlaceholder + "<hr align='left' style='width:75%'/>";
10+Email.kReplyForwardSetupElems = "<span style='color:black'>" + Email.kSignaturePlaceholder + "<hr align='left' style='width:75%'/>";
11
12 Email.kSubjectPrefixRe = $L("Re: ");
13 Email.kSubjectPrefixFw = $L("Fw: ");
  
1diff --git a/usr/palm/applications/com.palm.app.email/app/models/EmailAppDepot.js b/usr/palm/applications/com.palm.app.email/app/models/EmailAppDepot.js
2index b2b1cd7..57a4157 100644
3--- a/usr/palm/applications/com.palm.app.email/app/models/EmailAppDepot.js
4+++ b/usr/palm/applications/com.palm.app.email/app/models/EmailAppDepot.js
5@@ -47,6 +47,7 @@ var EmailAppDepot = Class.create({
6 if (accounts.list !== undefined && this.numAccounts !== accounts.list.length) {
7 // look for accounts that have been removed
8 var removedAccounts = [];
9+ if (this.accounts.list) {
10 this.accounts.list.each(function(existingAcct){
11 var stillExists = false;
12 accounts.list.each(function(newAcct) {
13@@ -59,6 +60,7 @@ var EmailAppDepot = Class.create({
14 removedAccounts.push(existingAccnt);
15 }
16 });
17+ }
18 if (removedAccounts.length > 0) {
19 // delete the security policy that are associated with the deleted
20 // accounts.
  
1diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/da_dk/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/da_dk/alternatechars_table.json
2index 79e8589..5ee1935 100644
3--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/da_dk/alternatechars_table.json
4+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/da_dk/alternatechars_table.json
5@@ -1,28 +1,28 @@
6 [
7- {"keyCode": 65, "letter":"a", "list": ["æ","å","à","á","â","ä","ã","Æ","Å","À","Á","Â","Ä","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
8+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
9 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
10 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
11- {"keyCode": 68, "letter":"d", "list": ["†","‡","ð","Ð"]},
12- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
13- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
14- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
15+ {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
16+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
17+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
18+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
19 {"keyCode": 74, "letter":"j", "list": ["¡"]},
20- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
21+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
22 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
23 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
24 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
25- {"keyCode": 79, "letter":"o", "list": ["ò","ó","ô","œ","ö","ø","õ","Ò","Ó","Ô","Œ","Ö","Ø","Õ","º","“","”","„","<",">","«","»"]},
26+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
27 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
28 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
29 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
30 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
31 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
32- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
33+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
34 {"keyCode": 86, "letter":"v", "list": ["^"]},
35 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
36 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
37 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
38- {"keyCode": 90, "letter":"z", "list": ["•"]},
39+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
40 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
41 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
42 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
43diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/de_ch/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/de_ch/alternatechars_table.json
44index 907a312..5ee1935 100644
45--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/de_ch/alternatechars_table.json
46+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/de_ch/alternatechars_table.json
47@@ -1,28 +1,28 @@
48 [
49- {"keyCode": 65, "letter":"a", "list": ["ä","à","â","æ","á","å","ã","Ä","À","Â","Æ","Á","Å","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
50+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
51 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
52 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
53 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
54- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
55- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
56- {"keyCode": 73, "letter":"i", "list": ["î","ï","ì","í","Î","Ï","Ì","Í","÷","‰"]},
57+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
58+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
59+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
60 {"keyCode": 74, "letter":"j", "list": ["¡"]},
61- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
62+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
63 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
64 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
65 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
66- {"keyCode": 79, "letter":"o", "list": ["ö","ô","œ","ò","ó","õ","ø","Ö","Ô","Œ","Ò","Ó","Õ","Ø","º","“","”","„","<",">","«","»"]},
67+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
68 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
69 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
70 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
71 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
72 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
73- {"keyCode": 85, "letter":"u", "list": ["ü","ù","û","ú","Ü","Ù","Û","Ú","[","]","{","}","<",">","«","»"]},
74+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
75 {"keyCode": 86, "letter":"v", "list": ["^"]},
76 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
77 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
78 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
79- {"keyCode": 90, "letter":"z", "list": ["•"]},
80+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
81 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
82 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
83 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
84diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/de_de/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/de_de/alternatechars_table.json
85index 907a312..5ee1935 100644
86--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/de_de/alternatechars_table.json
87+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/de_de/alternatechars_table.json
88@@ -1,28 +1,28 @@
89 [
90- {"keyCode": 65, "letter":"a", "list": ["ä","à","â","æ","á","å","ã","Ä","À","Â","Æ","Á","Å","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
91+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
92 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
93 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
94 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
95- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
96- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
97- {"keyCode": 73, "letter":"i", "list": ["î","ï","ì","í","Î","Ï","Ì","Í","÷","‰"]},
98+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
99+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
100+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
101 {"keyCode": 74, "letter":"j", "list": ["¡"]},
102- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
103+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
104 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
105 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
106 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
107- {"keyCode": 79, "letter":"o", "list": ["ö","ô","œ","ò","ó","õ","ø","Ö","Ô","Œ","Ò","Ó","Õ","Ø","º","“","”","„","<",">","«","»"]},
108+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
109 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
110 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
111 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
112 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
113 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
114- {"keyCode": 85, "letter":"u", "list": ["ü","ù","û","ú","Ü","Ù","Û","Ú","[","]","{","}","<",">","«","»"]},
115+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
116 {"keyCode": 86, "letter":"v", "list": ["^"]},
117 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
118 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
119 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
120- {"keyCode": 90, "letter":"z", "list": ["•"]},
121+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
122 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
123 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
124 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
125diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ca/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ca/alternatechars_table.json
126index 15a459e..5ee1935 100644
127--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ca/alternatechars_table.json
128+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ca/alternatechars_table.json
129@@ -7,7 +7,7 @@
130 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
131 {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
132 {"keyCode": 74, "letter":"j", "list": ["¡"]},
133- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
134+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
135 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
136 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
137 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
138@@ -22,7 +22,7 @@
139 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
140 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
141 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
142- {"keyCode": 90, "letter":"z", "list": ["•"]},
143+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
144 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
145 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
146 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
147diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_gb/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_gb/alternatechars_table.json
148index 15a459e..5ee1935 100644
149--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_gb/alternatechars_table.json
150+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_gb/alternatechars_table.json
151@@ -7,7 +7,7 @@
152 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
153 {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
154 {"keyCode": 74, "letter":"j", "list": ["¡"]},
155- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
156+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
157 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
158 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
159 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
160@@ -22,7 +22,7 @@
161 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
162 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
163 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
164- {"keyCode": 90, "letter":"z", "list": ["•"]},
165+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
166 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
167 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
168 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
169diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ie/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ie/alternatechars_table.json
170index 15a459e..5ee1935 100644
171--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ie/alternatechars_table.json
172+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ie/alternatechars_table.json
173@@ -7,7 +7,7 @@
174 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
175 {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
176 {"keyCode": 74, "letter":"j", "list": ["¡"]},
177- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
178+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
179 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
180 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
181 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
182@@ -22,7 +22,7 @@
183 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
184 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
185 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
186- {"keyCode": 90, "letter":"z", "list": ["•"]},
187+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
188 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
189 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
190 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
191diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_pl/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_pl/alternatechars_table.json
192index 136a5e5..5ee1935 100644
193--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_pl/alternatechars_table.json
194+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_pl/alternatechars_table.json
195@@ -1,28 +1,28 @@
196 [
197- {"keyCode": 65, "letter":"a", "list": ["à","á","â","ä","å","ã","æ","Ą","À","Á","Â","Ä","Å","Ã","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
198+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
199 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
200- {"keyCode": 67, "letter":"c", "list": ["ć","ç","Ć","Ç","©","¢"]},
201+ {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
202 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
203- {"keyCode": 69, "letter":"e", "list": ["ę","è","é","ê","ë","ē","Ę","È","É","Ê","Ë","€","¹","¼","½"]},
204+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
205 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
206- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
207+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
208 {"keyCode": 74, "letter":"j", "list": ["¡"]},
209- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
210- {"keyCode": 76, "letter":"l", "list": ["ł","Ł","`","‘","’","‚","‛"]},
211+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
212+ {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
213 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
214- {"keyCode": 78, "letter":"n", "list": ["ń","ñ","Ń","Ñ","¿"]},
215- {"keyCode": 79, "letter":"o", "list": ["ó","ò","ô","œ","ö","ø","õ","Ò","Ó","Ô","Œ","Ö","Ø","Õ","º","“","”","„","<",">","«","»"]},
216+ {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
217+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
218 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
219 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
220 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
221- {"keyCode": 83, "letter":"s", "list": ["ś","Ś","š","Š","ß","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
222+ {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
223 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
224- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
225+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
226 {"keyCode": 86, "letter":"v", "list": ["^"]},
227 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
228 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
229 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
230- {"keyCode": 90, "letter":"z", "list": ["ż","ź","Ż","Ź","•"]},
231+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
232 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
233 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
234 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
235diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_us/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_us/alternatechars_table.json
236index 15a459e..5ee1935 100644
237--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_us/alternatechars_table.json
238+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_us/alternatechars_table.json
239@@ -7,7 +7,7 @@
240 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
241 {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
242 {"keyCode": 74, "letter":"j", "list": ["¡"]},
243- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
244+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
245 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
246 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
247 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
248@@ -22,7 +22,7 @@
249 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
250 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
251 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
252- {"keyCode": 90, "letter":"z", "list": ["•"]},
253+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
254 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
255 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
256 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
257diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/es_es/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/es_es/alternatechars_table.json
258index 5f00c53..5ee1935 100644
259--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/es_es/alternatechars_table.json
260+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/es_es/alternatechars_table.json
261@@ -1,28 +1,28 @@
262 [
263- {"keyCode": 65, "letter":"a", "list": ["á","à","â","ã","ä","å","æ","Á","À","Â","Ã","Ä","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
264+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
265 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
266 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
267 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
268- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
269- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
270- {"keyCode": 73, "letter":"i", "list": ["í","ì","î","ï","Í","Ì","Î","Ï","÷","‰"]},
271+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
272+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
273+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
274 {"keyCode": 74, "letter":"j", "list": ["¡"]},
275- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
276+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
277 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
278 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
279 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
280- {"keyCode": 79, "letter":"o", "list": ["ó","ò","ô","œ","õ","ö","ø","Ò","Ó","Ô","Œ","Õ","Ö","Ø","º","“","”","„","<",">","«","»"]},
281+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
282 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
283 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
284 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
285 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
286 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
287- {"keyCode": 85, "letter":"u", "list": ["ú","ü","ù","û","Ú","Ü","Ù","Û","[","]","{","}","<",">","«","»"]},
288+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
289 {"keyCode": 86, "letter":"v", "list": ["^"]},
290 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
291 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
292 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
293- {"keyCode": 90, "letter":"z", "list": ["•"]},
294+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
295 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
296 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
297 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
298diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/es_mx/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/es_mx/alternatechars_table.json
299index 5f00c53..5ee1935 100644
300--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/es_mx/alternatechars_table.json
301+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/es_mx/alternatechars_table.json
302@@ -1,28 +1,28 @@
303 [
304- {"keyCode": 65, "letter":"a", "list": ["á","à","â","ã","ä","å","æ","Á","À","Â","Ã","Ä","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
305+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
306 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
307 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
308 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
309- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
310- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
311- {"keyCode": 73, "letter":"i", "list": ["í","ì","î","ï","Í","Ì","Î","Ï","÷","‰"]},
312+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
313+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
314+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
315 {"keyCode": 74, "letter":"j", "list": ["¡"]},
316- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
317+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
318 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
319 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
320 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
321- {"keyCode": 79, "letter":"o", "list": ["ó","ò","ô","œ","õ","ö","ø","Ò","Ó","Ô","Œ","Õ","Ö","Ø","º","“","”","„","<",">","«","»"]},
322+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
323 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
324 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
325 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
326 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
327 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
328- {"keyCode": 85, "letter":"u", "list": ["ú","ü","ù","û","Ú","Ü","Ù","Û","[","]","{","}","<",">","«","»"]},
329+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
330 {"keyCode": 86, "letter":"v", "list": ["^"]},
331 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
332 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
333 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
334- {"keyCode": 90, "letter":"z", "list": ["•"]},
335+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
336 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
337 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
338 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
339diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/es_us/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/es_us/alternatechars_table.json
340index f5a1647..5ee1935 100644
341--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/es_us/alternatechars_table.json
342+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/es_us/alternatechars_table.json
343@@ -1,28 +1,28 @@
344 [
345- {"keyCode": 65, "letter":"a", "list": ["á","à","â","ã","ä","å","æ","Á","À","Â","Ã","Ä","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
346+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
347 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
348 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
349 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
350- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
351+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
352 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
353- {"keyCode": 73, "letter":"i", "list": ["í","ì","î","ï","Í","Ì","Î","Ï","÷","‰"]},
354+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
355 {"keyCode": 74, "letter":"j", "list": ["¡"]},
356- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
357+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
358 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
359 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
360 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
361- {"keyCode": 79, "letter":"o", "list": ["ó","ò","ô","œ","õ","ö","ø","Ò","Ó","Ô","Œ","Õ","Ö","Ø","º","“","”","„","<",">","«","»"]},
362+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
363 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
364 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
365 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
366 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
367 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
368- {"keyCode": 85, "letter":"u", "list": ["ú","ü","ù","û","Ú","Ü","Ù","Û","[","]","{","}","<",">","«","»"]},
369+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
370 {"keyCode": 86, "letter":"v", "list": ["^"]},
371 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
372 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
373 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
374- {"keyCode": 90, "letter":"z", "list": ["•"]},
375+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
376 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
377 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
378 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
379diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/fi_fi/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/fi_fi/alternatechars_table.json
380index 438cb83..5ee1935 100644
381--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/fi_fi/alternatechars_table.json
382+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/fi_fi/alternatechars_table.json
383@@ -1,28 +1,28 @@
384 [
385- {"keyCode": 65, "letter":"a", "list": ["ä","å","à","á","â","ã","æ","Ä","Å","À","Á","Â","Ã","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
386+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
387 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
388 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
389 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
390- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
391- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
392- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
393+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
394+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
395+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
396 {"keyCode": 74, "letter":"j", "list": ["¡"]},
397- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
398+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
399 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
400 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
401 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
402- {"keyCode": 79, "letter":"o", "list": ["ò","ó","ô","œ","ö","ø","õ","Ò","Ó","Ô","Œ","Ö","Ø","Õ","º","“","”","„","<",">","«","»"]},
403+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
404 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
405 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
406 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
407 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
408 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
409- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
410+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
411 {"keyCode": 86, "letter":"v", "list": ["^"]},
412 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
413 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
414 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
415- {"keyCode": 90, "letter":"z", "list": ["•"]},
416+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
417 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
418 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
419 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
420diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ca/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ca/alternatechars_table.json
421index adea40f..5ee1935 100644
422--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ca/alternatechars_table.json
423+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ca/alternatechars_table.json
424@@ -1,28 +1,28 @@
425 [
426- {"keyCode": 65, "letter":"a", "list": ["à","â","ä","æ","á","å","ã","À","Â","Ä","Æ","Á","Å","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
427+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
428 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
429- {"keyCode": 67, "letter":"c", "list": ["ç","Ç","©","¢"]},
430+ {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
431 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
432- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
433- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
434- {"keyCode": 73, "letter":"i", "list": ["î","ï","ì","í","Î","Ï","Ì","Í","÷","‰"]},
435+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
436+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
437+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
438 {"keyCode": 74, "letter":"j", "list": ["¡"]},
439- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
440+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
441 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
442 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
443 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
444- {"keyCode": 79, "letter":"o", "list": ["ô","œ","ö","ò","ó","õ","ø","Ô","Œ","Ö","Ò","Ó","Õ","Ø","º","«","»","“","”","„","<",">"]},
445+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
446 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
447 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
448 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
449 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
450 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
451- {"keyCode": 85, "letter":"u", "list": ["ù","û","ü","ú","Ù","Û","Ü","Ú","[","]","{","}","<",">","«","»"]},
452+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
453 {"keyCode": 86, "letter":"v", "list": ["^"]},
454 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
455 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
456 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
457- {"keyCode": 90, "letter":"z", "list": ["•"]},
458+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
459 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
460 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
461 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
462diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ch/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ch/alternatechars_table.json
463index adea40f..5ee1935 100644
464--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ch/alternatechars_table.json
465+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ch/alternatechars_table.json
466@@ -1,28 +1,28 @@
467 [
468- {"keyCode": 65, "letter":"a", "list": ["à","â","ä","æ","á","å","ã","À","Â","Ä","Æ","Á","Å","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
469+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
470 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
471- {"keyCode": 67, "letter":"c", "list": ["ç","Ç","©","¢"]},
472+ {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
473 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
474- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
475- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
476- {"keyCode": 73, "letter":"i", "list": ["î","ï","ì","í","Î","Ï","Ì","Í","÷","‰"]},
477+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
478+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
479+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
480 {"keyCode": 74, "letter":"j", "list": ["¡"]},
481- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
482+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
483 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
484 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
485 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
486- {"keyCode": 79, "letter":"o", "list": ["ô","œ","ö","ò","ó","õ","ø","Ô","Œ","Ö","Ò","Ó","Õ","Ø","º","«","»","“","”","„","<",">"]},
487+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
488 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
489 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
490 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
491 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
492 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
493- {"keyCode": 85, "letter":"u", "list": ["ù","û","ü","ú","Ù","Û","Ü","Ú","[","]","{","}","<",">","«","»"]},
494+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
495 {"keyCode": 86, "letter":"v", "list": ["^"]},
496 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
497 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
498 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
499- {"keyCode": 90, "letter":"z", "list": ["•"]},
500+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
501 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
502 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
503 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
504diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_fr/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_fr/alternatechars_table.json
505index adea40f..5ee1935 100644
506--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_fr/alternatechars_table.json
507+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_fr/alternatechars_table.json
508@@ -1,28 +1,28 @@
509 [
510- {"keyCode": 65, "letter":"a", "list": ["à","â","ä","æ","á","å","ã","À","Â","Ä","Æ","Á","Å","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
511+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
512 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
513- {"keyCode": 67, "letter":"c", "list": ["ç","Ç","©","¢"]},
514+ {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
515 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
516- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
517- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
518- {"keyCode": 73, "letter":"i", "list": ["î","ï","ì","í","Î","Ï","Ì","Í","÷","‰"]},
519+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
520+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
521+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
522 {"keyCode": 74, "letter":"j", "list": ["¡"]},
523- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
524+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
525 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
526 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
527 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
528- {"keyCode": 79, "letter":"o", "list": ["ô","œ","ö","ò","ó","õ","ø","Ô","Œ","Ö","Ò","Ó","Õ","Ø","º","«","»","“","”","„","<",">"]},
529+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
530 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
531 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
532 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
533 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
534 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
535- {"keyCode": 85, "letter":"u", "list": ["ù","û","ü","ú","Ù","Û","Ü","Ú","[","]","{","}","<",">","«","»"]},
536+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
537 {"keyCode": 86, "letter":"v", "list": ["^"]},
538 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
539 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
540 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
541- {"keyCode": 90, "letter":"z", "list": ["•"]},
542+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
543 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
544 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
545 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
546diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/it_it/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/it_it/alternatechars_table.json
547index a047ded..5ee1935 100644
548--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/it_it/alternatechars_table.json
549+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/it_it/alternatechars_table.json
550@@ -1,28 +1,28 @@
551 [
552- {"keyCode": 65, "letter":"a", "list": ["à","á","â","ä","å","ã","æ","À","Á","Â","ÄÅ","Ã","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
553+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
554 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
555 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
556 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
557- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
558- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
559- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
560+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
561+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
562+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
563 {"keyCode": 74, "letter":"j", "list": ["¡"]},
564- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
565+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
566 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
567 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
568 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
569- {"keyCode": 79, "letter":"o", "list": ["ò","ó","ô","œ","ö","õ","ø","Ò","Ó","Ô","Œ","Ö","Õ","Ø","º","“","”","„","<",">","«","»"]},
570+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
571 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
572 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
573 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
574 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
575 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
576- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
577+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
578 {"keyCode": 86, "letter":"v", "list": ["^"]},
579 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
580 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
581 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
582- {"keyCode": 90, "letter":"z", "list": ["•"]},
583+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
584 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
585 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
586 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
587diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/nb_no/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/nb_no/alternatechars_table.json
588index e223fc1..5ee1935 100644
589--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/nb_no/alternatechars_table.json
590+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/nb_no/alternatechars_table.json
591@@ -1,28 +1,28 @@
592 [
593- {"keyCode": 65, "letter":"a", "list": ["å","æ","à","á","â","ä","ã","Å","Æ","À","Á","Â","Ä","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
594+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
595 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
596 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
597- {"keyCode": 68, "letter":"d", "list": ["†","‡","ð","Ð"]},
598- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
599- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
600- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
601+ {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
602+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
603+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
604+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
605 {"keyCode": 74, "letter":"j", "list": ["¡"]},
606- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
607+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
608 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
609 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
610 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
611- {"keyCode": 79, "letter":"o", "list": ["ø","ò","ó","ô","œ","ö","õ","Ø","Ò","Ó","Ô","Œ","Ö","Õ","º","“","”","„","<",">","«","»"]},
612+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
613 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
614 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
615 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
616 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
617 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
618- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
619+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
620 {"keyCode": 86, "letter":"v", "list": ["^"]},
621 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
622 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
623 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
624- {"keyCode": 90, "letter":"z", "list": ["•"]},
625+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
626 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
627 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
628 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
629diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/nl_nl/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/nl_nl/alternatechars_table.json
630index f4f1c21..5ee1935 100644
631--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/nl_nl/alternatechars_table.json
632+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/nl_nl/alternatechars_table.json
633@@ -1,28 +1,28 @@
634 [
635- {"keyCode": 65, "letter":"a", "list": ["à","á","â","ä","å","ã","æ","À","Á","Â","Ä","Å","Ã","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
636+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
637 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
638 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
639 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
640- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
641- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
642- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
643+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
644+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
645+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
646 {"keyCode": 74, "letter":"j", "list": ["¡"]},
647- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
648+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
649 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
650 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
651 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
652- {"keyCode": 79, "letter":"o", "list": ["ò","ó","ô","œ","ö","õ","ø","Ò","Ó","Ô","Œ","Ö","Õ","Ø","º","“","”","„","<",">","«","»"]},
653+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
654 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
655 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
656 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
657 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
658 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
659- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
660+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
661 {"keyCode": 86, "letter":"v", "list": ["^"]},
662 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
663 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
664 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
665- {"keyCode": 90, "letter":"z", "list": ["•"]},
666+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
667 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
668 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
669 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
670diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/pl_pl/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/pl_pl/alternatechars_table.json
671index 822f0fb..5ee1935 100644
672--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/pl_pl/alternatechars_table.json
673+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/pl_pl/alternatechars_table.json
674@@ -1,29 +1,29 @@
675 [
676- {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
677- {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
678- {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]},
679- {"keyCode": 65, "letter":"a", "list": ["à","á","â","ä","å","ã","æ","Ą","À","Á","Â","Ä","Å","Ã","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
680- {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|","¬"]},
681- {"keyCode": 67, "letter":"c", "list": ["ć","ç","Ć","Ç","©","¢"]},
682+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
683+ {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
684+ {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
685 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
686- {"keyCode": 69, "letter":"e", "list": ["ę","è","é","ê","ë","ē","Ę","È","É","Ê","Ë","€","¹","¼","½"]},
687- {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥","ƒ"]},
688- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
689+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
690+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
691+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
692 {"keyCode": 74, "letter":"j", "list": ["¡"]},
693- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
694+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
695 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
696 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
697- {"keyCode": 78, "letter":"n", "list": ["ń","ñ","Ń","Ñ","¿"]},
698- {"keyCode": 79, "letter":"o", "list": ["ó","ò","ô","œ","ö","ø","õ","Ò","Ó","Ô","Œ","Ö","Ø","Õ","º","“","”","„","<",">","«","»"]},
699+ {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
700+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
701 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
702 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
703 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
704- {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|","§"]},
705+ {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
706 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
707- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
708+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
709 {"keyCode": 86, "letter":"v", "list": ["^"]},
710 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
711 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
712- {"keyCode": 89, "letter":"y", "list": ["ÿ","ý","Ÿ","Ý","¥","[","]","{","}","<",">","«","»"]},
713- {"keyCode": 90, "letter":"z", "list": ["ž","Ž","•"]}
714+ {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
715+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
716+ {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
717+ {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
718+ {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
719 ]
720\ No newline at end of file
721diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_br/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_br/alternatechars_table.json
722index 2b3d093..5ee1935 100644
723--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_br/alternatechars_table.json
724+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_br/alternatechars_table.json
725@@ -1,28 +1,28 @@
726 [
727- {"keyCode": 65, "letter":"a", "list": ["á","ã","â","à","ä","å","æ","Á","Ã","Â","À","Ä","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
728+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
729 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
730 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
731 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
732- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
733- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
734- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
735+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
736+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
737+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
738 {"keyCode": 74, "letter":"j", "list": ["¡"]},
739- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
740+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
741 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
742 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
743 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
744- {"keyCode": 79, "letter":"o", "list": ["ò","ó","ô","œ","ö","õ","ø","Ò","Ó","Ô","Œ","Ö","Õ","Ø","º","“","”","„","<",">","«","»"]},
745+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
746 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
747 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
748 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
749 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
750 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
751- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
752+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
753 {"keyCode": 86, "letter":"v", "list": ["^"]},
754 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
755 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
756 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
757- {"keyCode": 90, "letter":"z", "list": ["•"]},
758+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
759 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
760 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
761 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
762diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_pt/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_pt/alternatechars_table.json
763index 2b3d093..5ee1935 100644
764--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_pt/alternatechars_table.json
765+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_pt/alternatechars_table.json
766@@ -1,28 +1,28 @@
767 [
768- {"keyCode": 65, "letter":"a", "list": ["á","ã","â","à","ä","å","æ","Á","Ã","Â","À","Ä","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
769+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
770 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
771 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
772 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
773- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
774- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
775- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
776+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
777+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
778+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
779 {"keyCode": 74, "letter":"j", "list": ["¡"]},
780- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
781+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
782 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
783 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
784 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
785- {"keyCode": 79, "letter":"o", "list": ["ò","ó","ô","œ","ö","õ","ø","Ò","Ó","Ô","Œ","Ö","Õ","Ø","º","“","”","„","<",">","«","»"]},
786+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
787 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
788 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
789 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
790 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
791 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
792- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
793+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
794 {"keyCode": 86, "letter":"v", "list": ["^"]},
795 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
796 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
797 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
798- {"keyCode": 90, "letter":"z", "list": ["•"]},
799+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
800 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
801 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
802 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
803diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/sv_se/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/sv_se/alternatechars_table.json
804index db0fd98..5ee1935 100644
805--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/sv_se/alternatechars_table.json
806+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/sv_se/alternatechars_table.json
807@@ -1,28 +1,28 @@
808 [
809- {"keyCode": 65, "letter":"a", "list": ["ä","å","à","á","â","ã","æ","Ä","Å","À","Á","Â","Ã","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
810+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
811 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
812 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
813 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
814- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
815+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
816 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
817- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
818+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
819 {"keyCode": 74, "letter":"j", "list": ["¡"]},
820- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
821+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
822 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
823 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
824 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
825- {"keyCode": 79, "letter":"o", "list": ["ö","ò","ó","ô","ø","œ","õ","Ö","Ò","Ó","Ô","Ø","Œ","Õ","º","“","”","„","<",">","«","»"]},
826+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
827 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
828 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
829 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
830 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
831 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
832- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
833+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
834 {"keyCode": 86, "letter":"v", "list": ["^"]},
835 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
836 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
837 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
838- {"keyCode": 90, "letter":"z", "list": ["•"]},
839+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
840 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
841 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
842 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
  
1diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/da_dk/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/da_dk/alternatechars_table.json
2index 79e8589..5ee1935 100644
3--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/da_dk/alternatechars_table.json
4+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/da_dk/alternatechars_table.json
5@@ -1,28 +1,28 @@
6 [
7- {"keyCode": 65, "letter":"a", "list": ["æ","å","à","á","â","ä","ã","Æ","Å","À","Á","Â","Ä","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
8+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
9 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
10 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
11- {"keyCode": 68, "letter":"d", "list": ["†","‡","ð","Ð"]},
12- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
13- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
14- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
15+ {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
16+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
17+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
18+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
19 {"keyCode": 74, "letter":"j", "list": ["¡"]},
20- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
21+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
22 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
23 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
24 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
25- {"keyCode": 79, "letter":"o", "list": ["ò","ó","ô","œ","ö","ø","õ","Ò","Ó","Ô","Œ","Ö","Ø","Õ","º","“","”","„","<",">","«","»"]},
26+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
27 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
28 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
29 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
30 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
31 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
32- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
33+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
34 {"keyCode": 86, "letter":"v", "list": ["^"]},
35 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
36 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
37 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
38- {"keyCode": 90, "letter":"z", "list": ["•"]},
39+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
40 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
41 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
42 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
43diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/de_ch/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/de_ch/alternatechars_table.json
44index 907a312..5ee1935 100644
45--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/de_ch/alternatechars_table.json
46+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/de_ch/alternatechars_table.json
47@@ -1,28 +1,28 @@
48 [
49- {"keyCode": 65, "letter":"a", "list": ["ä","à","â","æ","á","å","ã","Ä","À","Â","Æ","Á","Å","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
50+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
51 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
52 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
53 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
54- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
55- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
56- {"keyCode": 73, "letter":"i", "list": ["î","ï","ì","í","Î","Ï","Ì","Í","÷","‰"]},
57+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
58+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
59+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
60 {"keyCode": 74, "letter":"j", "list": ["¡"]},
61- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
62+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
63 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
64 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
65 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
66- {"keyCode": 79, "letter":"o", "list": ["ö","ô","œ","ò","ó","õ","ø","Ö","Ô","Œ","Ò","Ó","Õ","Ø","º","“","”","„","<",">","«","»"]},
67+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
68 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
69 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
70 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
71 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
72 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
73- {"keyCode": 85, "letter":"u", "list": ["ü","ù","û","ú","Ü","Ù","Û","Ú","[","]","{","}","<",">","«","»"]},
74+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
75 {"keyCode": 86, "letter":"v", "list": ["^"]},
76 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
77 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
78 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
79- {"keyCode": 90, "letter":"z", "list": ["•"]},
80+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
81 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
82 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
83 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
84diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/de_de/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/de_de/alternatechars_table.json
85index 907a312..5ee1935 100644
86--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/de_de/alternatechars_table.json
87+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/de_de/alternatechars_table.json
88@@ -1,28 +1,28 @@
89 [
90- {"keyCode": 65, "letter":"a", "list": ["ä","à","â","æ","á","å","ã","Ä","À","Â","Æ","Á","Å","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
91+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
92 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
93 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
94 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
95- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
96- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
97- {"keyCode": 73, "letter":"i", "list": ["î","ï","ì","í","Î","Ï","Ì","Í","÷","‰"]},
98+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
99+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
100+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
101 {"keyCode": 74, "letter":"j", "list": ["¡"]},
102- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
103+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
104 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
105 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
106 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
107- {"keyCode": 79, "letter":"o", "list": ["ö","ô","œ","ò","ó","õ","ø","Ö","Ô","Œ","Ò","Ó","Õ","Ø","º","“","”","„","<",">","«","»"]},
108+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
109 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
110 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
111 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
112 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
113 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
114- {"keyCode": 85, "letter":"u", "list": ["ü","ù","û","ú","Ü","Ù","Û","Ú","[","]","{","}","<",">","«","»"]},
115+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
116 {"keyCode": 86, "letter":"v", "list": ["^"]},
117 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
118 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
119 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
120- {"keyCode": 90, "letter":"z", "list": ["•"]},
121+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
122 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
123 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
124 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
125diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ca/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ca/alternatechars_table.json
126index 15a459e..5ee1935 100644
127--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ca/alternatechars_table.json
128+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ca/alternatechars_table.json
129@@ -7,7 +7,7 @@
130 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
131 {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
132 {"keyCode": 74, "letter":"j", "list": ["¡"]},
133- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
134+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
135 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
136 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
137 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
138@@ -22,7 +22,7 @@
139 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
140 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
141 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
142- {"keyCode": 90, "letter":"z", "list": ["•"]},
143+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
144 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
145 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
146 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
147diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_gb/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_gb/alternatechars_table.json
148index 15a459e..5ee1935 100644
149--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_gb/alternatechars_table.json
150+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_gb/alternatechars_table.json
151@@ -7,7 +7,7 @@
152 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
153 {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
154 {"keyCode": 74, "letter":"j", "list": ["¡"]},
155- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
156+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
157 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
158 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
159 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
160@@ -22,7 +22,7 @@
161 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
162 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
163 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
164- {"keyCode": 90, "letter":"z", "list": ["•"]},
165+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
166 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
167 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
168 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
169diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ie/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ie/alternatechars_table.json
170index 15a459e..5ee1935 100644
171--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ie/alternatechars_table.json
172+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_ie/alternatechars_table.json
173@@ -7,7 +7,7 @@
174 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
175 {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
176 {"keyCode": 74, "letter":"j", "list": ["¡"]},
177- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
178+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
179 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
180 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
181 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
182@@ -22,7 +22,7 @@
183 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
184 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
185 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
186- {"keyCode": 90, "letter":"z", "list": ["•"]},
187+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
188 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
189 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
190 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
191diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_pl/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_pl/alternatechars_table.json
192index 136a5e5..5ee1935 100644
193--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_pl/alternatechars_table.json
194+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_pl/alternatechars_table.json
195@@ -1,28 +1,28 @@
196 [
197- {"keyCode": 65, "letter":"a", "list": ["à","á","â","ä","å","ã","æ","Ą","À","Á","Â","Ä","Å","Ã","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
198+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
199 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
200- {"keyCode": 67, "letter":"c", "list": ["ć","ç","Ć","Ç","©","¢"]},
201+ {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
202 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
203- {"keyCode": 69, "letter":"e", "list": ["ę","è","é","ê","ë","ē","Ę","È","É","Ê","Ë","€","¹","¼","½"]},
204+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
205 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
206- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
207+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
208 {"keyCode": 74, "letter":"j", "list": ["¡"]},
209- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
210- {"keyCode": 76, "letter":"l", "list": ["ł","Ł","`","‘","’","‚","‛"]},
211+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
212+ {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
213 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
214- {"keyCode": 78, "letter":"n", "list": ["ń","ñ","Ń","Ñ","¿"]},
215- {"keyCode": 79, "letter":"o", "list": ["ó","ò","ô","œ","ö","ø","õ","Ò","Ó","Ô","Œ","Ö","Ø","Õ","º","“","”","„","<",">","«","»"]},
216+ {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
217+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
218 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
219 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
220 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
221- {"keyCode": 83, "letter":"s", "list": ["ś","Ś","š","Š","ß","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
222+ {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
223 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
224- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
225+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
226 {"keyCode": 86, "letter":"v", "list": ["^"]},
227 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
228 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
229 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
230- {"keyCode": 90, "letter":"z", "list": ["ż","ź","Ż","Ź","•"]},
231+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
232 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
233 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
234 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
235diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_us/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_us/alternatechars_table.json
236index 15a459e..5ee1935 100644
237--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/en_us/alternatechars_table.json
238+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/en_us/alternatechars_table.json
239@@ -7,7 +7,7 @@
240 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
241 {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
242 {"keyCode": 74, "letter":"j", "list": ["¡"]},
243- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
244+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
245 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
246 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
247 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
248@@ -22,7 +22,7 @@
249 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
250 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
251 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
252- {"keyCode": 90, "letter":"z", "list": ["•"]},
253+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
254 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
255 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
256 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
257diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/es_es/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/es_es/alternatechars_table.json
258index 5f00c53..5ee1935 100644
259--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/es_es/alternatechars_table.json
260+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/es_es/alternatechars_table.json
261@@ -1,28 +1,28 @@
262 [
263- {"keyCode": 65, "letter":"a", "list": ["á","à","â","ã","ä","å","æ","Á","À","Â","Ã","Ä","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
264+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
265 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
266 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
267 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
268- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
269- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
270- {"keyCode": 73, "letter":"i", "list": ["í","ì","î","ï","Í","Ì","Î","Ï","÷","‰"]},
271+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
272+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
273+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
274 {"keyCode": 74, "letter":"j", "list": ["¡"]},
275- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
276+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
277 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
278 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
279 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
280- {"keyCode": 79, "letter":"o", "list": ["ó","ò","ô","œ","õ","ö","ø","Ò","Ó","Ô","Œ","Õ","Ö","Ø","º","“","”","„","<",">","«","»"]},
281+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
282 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
283 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
284 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
285 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
286 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
287- {"keyCode": 85, "letter":"u", "list": ["ú","ü","ù","û","Ú","Ü","Ù","Û","[","]","{","}","<",">","«","»"]},
288+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
289 {"keyCode": 86, "letter":"v", "list": ["^"]},
290 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
291 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
292 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
293- {"keyCode": 90, "letter":"z", "list": ["•"]},
294+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
295 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
296 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
297 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
298diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/es_mx/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/es_mx/alternatechars_table.json
299index 5f00c53..5ee1935 100644
300--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/es_mx/alternatechars_table.json
301+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/es_mx/alternatechars_table.json
302@@ -1,28 +1,28 @@
303 [
304- {"keyCode": 65, "letter":"a", "list": ["á","à","â","ã","ä","å","æ","Á","À","Â","Ã","Ä","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
305+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
306 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
307 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
308 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
309- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
310- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
311- {"keyCode": 73, "letter":"i", "list": ["í","ì","î","ï","Í","Ì","Î","Ï","÷","‰"]},
312+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
313+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
314+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
315 {"keyCode": 74, "letter":"j", "list": ["¡"]},
316- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
317+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
318 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
319 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
320 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
321- {"keyCode": 79, "letter":"o", "list": ["ó","ò","ô","œ","õ","ö","ø","Ò","Ó","Ô","Œ","Õ","Ö","Ø","º","“","”","„","<",">","«","»"]},
322+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
323 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
324 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
325 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
326 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
327 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
328- {"keyCode": 85, "letter":"u", "list": ["ú","ü","ù","û","Ú","Ü","Ù","Û","[","]","{","}","<",">","«","»"]},
329+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
330 {"keyCode": 86, "letter":"v", "list": ["^"]},
331 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
332 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
333 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
334- {"keyCode": 90, "letter":"z", "list": ["•"]},
335+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
336 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
337 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
338 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
339diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/es_us/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/es_us/alternatechars_table.json
340index f5a1647..5ee1935 100644
341--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/es_us/alternatechars_table.json
342+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/es_us/alternatechars_table.json
343@@ -1,28 +1,28 @@
344 [
345- {"keyCode": 65, "letter":"a", "list": ["á","à","â","ã","ä","å","æ","Á","À","Â","Ã","Ä","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
346+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
347 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
348 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
349 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
350- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
351+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
352 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
353- {"keyCode": 73, "letter":"i", "list": ["í","ì","î","ï","Í","Ì","Î","Ï","÷","‰"]},
354+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
355 {"keyCode": 74, "letter":"j", "list": ["¡"]},
356- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
357+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
358 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
359 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
360 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
361- {"keyCode": 79, "letter":"o", "list": ["ó","ò","ô","œ","õ","ö","ø","Ò","Ó","Ô","Œ","Õ","Ö","Ø","º","“","”","„","<",">","«","»"]},
362+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
363 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
364 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
365 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
366 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
367 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
368- {"keyCode": 85, "letter":"u", "list": ["ú","ü","ù","û","Ú","Ü","Ù","Û","[","]","{","}","<",">","«","»"]},
369+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
370 {"keyCode": 86, "letter":"v", "list": ["^"]},
371 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
372 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
373 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
374- {"keyCode": 90, "letter":"z", "list": ["•"]},
375+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
376 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
377 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
378 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
379diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/fi_fi/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/fi_fi/alternatechars_table.json
380index 438cb83..5ee1935 100644
381--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/fi_fi/alternatechars_table.json
382+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/fi_fi/alternatechars_table.json
383@@ -1,28 +1,28 @@
384 [
385- {"keyCode": 65, "letter":"a", "list": ["ä","å","à","á","â","ã","æ","Ä","Å","À","Á","Â","Ã","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
386+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
387 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
388 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
389 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
390- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
391- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
392- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
393+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
394+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
395+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
396 {"keyCode": 74, "letter":"j", "list": ["¡"]},
397- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
398+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
399 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
400 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
401 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
402- {"keyCode": 79, "letter":"o", "list": ["ò","ó","ô","œ","ö","ø","õ","Ò","Ó","Ô","Œ","Ö","Ø","Õ","º","“","”","„","<",">","«","»"]},
403+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
404 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
405 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
406 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
407 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
408 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
409- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
410+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
411 {"keyCode": 86, "letter":"v", "list": ["^"]},
412 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
413 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
414 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
415- {"keyCode": 90, "letter":"z", "list": ["•"]},
416+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
417 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
418 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
419 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
420diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ca/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ca/alternatechars_table.json
421index adea40f..5ee1935 100644
422--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ca/alternatechars_table.json
423+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ca/alternatechars_table.json
424@@ -1,28 +1,28 @@
425 [
426- {"keyCode": 65, "letter":"a", "list": ["à","â","ä","æ","á","å","ã","À","Â","Ä","Æ","Á","Å","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
427+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
428 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
429- {"keyCode": 67, "letter":"c", "list": ["ç","Ç","©","¢"]},
430+ {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
431 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
432- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
433- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
434- {"keyCode": 73, "letter":"i", "list": ["î","ï","ì","í","Î","Ï","Ì","Í","÷","‰"]},
435+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
436+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
437+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
438 {"keyCode": 74, "letter":"j", "list": ["¡"]},
439- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
440+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
441 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
442 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
443 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
444- {"keyCode": 79, "letter":"o", "list": ["ô","œ","ö","ò","ó","õ","ø","Ô","Œ","Ö","Ò","Ó","Õ","Ø","º","«","»","“","”","„","<",">"]},
445+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
446 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
447 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
448 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
449 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
450 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
451- {"keyCode": 85, "letter":"u", "list": ["ù","û","ü","ú","Ù","Û","Ü","Ú","[","]","{","}","<",">","«","»"]},
452+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
453 {"keyCode": 86, "letter":"v", "list": ["^"]},
454 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
455 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
456 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
457- {"keyCode": 90, "letter":"z", "list": ["•"]},
458+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
459 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
460 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
461 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
462diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ch/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ch/alternatechars_table.json
463index adea40f..5ee1935 100644
464--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ch/alternatechars_table.json
465+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_ch/alternatechars_table.json
466@@ -1,28 +1,28 @@
467 [
468- {"keyCode": 65, "letter":"a", "list": ["à","â","ä","æ","á","å","ã","À","Â","Ä","Æ","Á","Å","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
469+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
470 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
471- {"keyCode": 67, "letter":"c", "list": ["ç","Ç","©","¢"]},
472+ {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
473 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
474- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
475- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
476- {"keyCode": 73, "letter":"i", "list": ["î","ï","ì","í","Î","Ï","Ì","Í","÷","‰"]},
477+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
478+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
479+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
480 {"keyCode": 74, "letter":"j", "list": ["¡"]},
481- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
482+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
483 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
484 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
485 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
486- {"keyCode": 79, "letter":"o", "list": ["ô","œ","ö","ò","ó","õ","ø","Ô","Œ","Ö","Ò","Ó","Õ","Ø","º","«","»","“","”","„","<",">"]},
487+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
488 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
489 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
490 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
491 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
492 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
493- {"keyCode": 85, "letter":"u", "list": ["ù","û","ü","ú","Ù","Û","Ü","Ú","[","]","{","}","<",">","«","»"]},
494+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
495 {"keyCode": 86, "letter":"v", "list": ["^"]},
496 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
497 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
498 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
499- {"keyCode": 90, "letter":"z", "list": ["•"]},
500+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
501 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
502 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
503 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
504diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_fr/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_fr/alternatechars_table.json
505index adea40f..5ee1935 100644
506--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_fr/alternatechars_table.json
507+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/fr_fr/alternatechars_table.json
508@@ -1,28 +1,28 @@
509 [
510- {"keyCode": 65, "letter":"a", "list": ["à","â","ä","æ","á","å","ã","À","Â","Ä","Æ","Á","Å","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
511+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
512 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
513- {"keyCode": 67, "letter":"c", "list": ["ç","Ç","©","¢"]},
514+ {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
515 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
516- {"keyCode": 69, "letter":"e", "list": ["é","è","ê","ë","ē","É","È","Ê","Ë","€","¹","¼","½"]},
517- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
518- {"keyCode": 73, "letter":"i", "list": ["î","ï","ì","í","Î","Ï","Ì","Í","÷","‰"]},
519+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
520+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
521+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
522 {"keyCode": 74, "letter":"j", "list": ["¡"]},
523- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
524+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
525 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
526 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
527 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
528- {"keyCode": 79, "letter":"o", "list": ["ô","œ","ö","ò","ó","õ","ø","Ô","Œ","Ö","Ò","Ó","Õ","Ø","º","«","»","“","”","„","<",">"]},
529+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
530 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
531 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
532 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
533 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
534 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
535- {"keyCode": 85, "letter":"u", "list": ["ù","û","ü","ú","Ù","Û","Ü","Ú","[","]","{","}","<",">","«","»"]},
536+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
537 {"keyCode": 86, "letter":"v", "list": ["^"]},
538 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
539 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
540 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
541- {"keyCode": 90, "letter":"z", "list": ["•"]},
542+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
543 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
544 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
545 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
546diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/it_it/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/it_it/alternatechars_table.json
547index a047ded..5ee1935 100644
548--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/it_it/alternatechars_table.json
549+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/it_it/alternatechars_table.json
550@@ -1,28 +1,28 @@
551 [
552- {"keyCode": 65, "letter":"a", "list": ["à","á","â","ä","å","ã","æ","À","Á","Â","ÄÅ","Ã","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
553+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
554 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
555 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
556 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
557- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
558- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
559- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
560+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
561+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
562+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
563 {"keyCode": 74, "letter":"j", "list": ["¡"]},
564- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
565+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
566 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
567 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
568 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
569- {"keyCode": 79, "letter":"o", "list": ["ò","ó","ô","œ","ö","õ","ø","Ò","Ó","Ô","Œ","Ö","Õ","Ø","º","“","”","„","<",">","«","»"]},
570+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
571 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
572 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
573 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
574 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
575 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
576- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
577+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
578 {"keyCode": 86, "letter":"v", "list": ["^"]},
579 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
580 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
581 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
582- {"keyCode": 90, "letter":"z", "list": ["•"]},
583+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
584 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
585 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
586 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
587diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/nb_no/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/nb_no/alternatechars_table.json
588index e223fc1..5ee1935 100644
589--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/nb_no/alternatechars_table.json
590+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/nb_no/alternatechars_table.json
591@@ -1,28 +1,28 @@
592 [
593- {"keyCode": 65, "letter":"a", "list": ["å","æ","à","á","â","ä","ã","Å","Æ","À","Á","Â","Ä","Ã","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
594+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
595 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
596 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
597- {"keyCode": 68, "letter":"d", "list": ["†","‡","ð","Ð"]},
598- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
599- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
600- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
601+ {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
602+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
603+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
604+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
605 {"keyCode": 74, "letter":"j", "list": ["¡"]},
606- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
607+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
608 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
609 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
610 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
611- {"keyCode": 79, "letter":"o", "list": ["ø","ò","ó","ô","œ","ö","õ","Ø","Ò","Ó","Ô","Œ","Ö","Õ","º","“","”","„","<",">","«","»"]},
612+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
613 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
614 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
615 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
616 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
617 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
618- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
619+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
620 {"keyCode": 86, "letter":"v", "list": ["^"]},
621 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
622 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
623 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
624- {"keyCode": 90, "letter":"z", "list": ["•"]},
625+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
626 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
627 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
628 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
629diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/nl_nl/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/nl_nl/alternatechars_table.json
630index f4f1c21..5ee1935 100644
631--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/nl_nl/alternatechars_table.json
632+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/nl_nl/alternatechars_table.json
633@@ -1,28 +1,28 @@
634 [
635- {"keyCode": 65, "letter":"a", "list": ["à","á","â","ä","å","ã","æ","À","Á","Â","Ä","Å","Ã","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
636+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
637 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
638 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
639 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
640- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
641- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
642- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
643+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
644+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
645+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
646 {"keyCode": 74, "letter":"j", "list": ["¡"]},
647- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
648+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
649 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
650 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
651 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
652- {"keyCode": 79, "letter":"o", "list": ["ò","ó","ô","œ","ö","õ","ø","Ò","Ó","Ô","Œ","Ö","Õ","Ø","º","“","”","„","<",">","«","»"]},
653+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
654 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
655 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
656 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
657 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
658 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
659- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
660+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
661 {"keyCode": 86, "letter":"v", "list": ["^"]},
662 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
663 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
664 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
665- {"keyCode": 90, "letter":"z", "list": ["•"]},
666+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
667 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
668 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
669 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
670diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/pl_pl/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/pl_pl/alternatechars_table.json
671index 822f0fb..5ee1935 100644
672--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/pl_pl/alternatechars_table.json
673+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/pl_pl/alternatechars_table.json
674@@ -1,29 +1,29 @@
675 [
676- {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
677- {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
678- {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]},
679- {"keyCode": 65, "letter":"a", "list": ["à","á","â","ä","å","ã","æ","Ą","À","Á","Â","Ä","Å","Ã","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
680- {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|","¬"]},
681- {"keyCode": 67, "letter":"c", "list": ["ć","ç","Ć","Ç","©","¢"]},
682+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
683+ {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
684+ {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
685 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
686- {"keyCode": 69, "letter":"e", "list": ["ę","è","é","ê","ë","ē","Ę","È","É","Ê","Ë","€","¹","¼","½"]},
687- {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥","ƒ"]},
688- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
689+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
690+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
691+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
692 {"keyCode": 74, "letter":"j", "list": ["¡"]},
693- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
694+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
695 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
696 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
697- {"keyCode": 78, "letter":"n", "list": ["ń","ñ","Ń","Ñ","¿"]},
698- {"keyCode": 79, "letter":"o", "list": ["ó","ò","ô","œ","ö","ø","õ","Ò","Ó","Ô","Œ","Ö","Ø","Õ","º","“","”","„","<",">","«","»"]},
699+ {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
700+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
701 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
702 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
703 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
704- {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|","§"]},
705+ {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
706 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
707- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
708+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
709 {"keyCode": 86, "letter":"v", "list": ["^"]},
710 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
711 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
712- {"keyCode": 89, "letter":"y", "list": ["ÿ","ý","Ÿ","Ý","¥","[","]","{","}","<",">","«","»"]},
713- {"keyCode": 90, "letter":"z", "list": ["ž","Ž","•"]}
714+ {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
715+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
716+ {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
717+ {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
718+ {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
719 ]
720\ No newline at end of file
721diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_br/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_br/alternatechars_table.json
722index 2b3d093..5ee1935 100644
723--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_br/alternatechars_table.json
724+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_br/alternatechars_table.json
725@@ -1,28 +1,28 @@
726 [
727- {"keyCode": 65, "letter":"a", "list": ["á","ã","â","à","ä","å","æ","Á","Ã","Â","À","Ä","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
728+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
729 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
730 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
731 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
732- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
733- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
734- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
735+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
736+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
737+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
738 {"keyCode": 74, "letter":"j", "list": ["¡"]},
739- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
740+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
741 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
742 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
743 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
744- {"keyCode": 79, "letter":"o", "list": ["ò","ó","ô","œ","ö","õ","ø","Ò","Ó","Ô","Œ","Ö","Õ","Ø","º","“","”","„","<",">","«","»"]},
745+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
746 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
747 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
748 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
749 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
750 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
751- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
752+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
753 {"keyCode": 86, "letter":"v", "list": ["^"]},
754 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
755 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
756 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
757- {"keyCode": 90, "letter":"z", "list": ["•"]},
758+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
759 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
760 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
761 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
762diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_pt/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_pt/alternatechars_table.json
763index 2b3d093..5ee1935 100644
764--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_pt/alternatechars_table.json
765+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/pt_pt/alternatechars_table.json
766@@ -1,28 +1,28 @@
767 [
768- {"keyCode": 65, "letter":"a", "list": ["á","ã","â","à","ä","å","æ","Á","Ã","Â","À","Ä","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
769+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
770 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
771 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
772 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
773- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
774- {"keyCode": 72, "letter":"h", "list": ["€","¢","£","¥"]},
775- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
776+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
777+ {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
778+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
779 {"keyCode": 74, "letter":"j", "list": ["¡"]},
780- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
781+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
782 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
783 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
784 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
785- {"keyCode": 79, "letter":"o", "list": ["ò","ó","ô","œ","ö","õ","ø","Ò","Ó","Ô","Œ","Ö","Õ","Ø","º","“","”","„","<",">","«","»"]},
786+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
787 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
788 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
789 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
790 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
791 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
792- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
793+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
794 {"keyCode": 86, "letter":"v", "list": ["^"]},
795 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
796 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
797 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
798- {"keyCode": 90, "letter":"z", "list": ["•"]},
799+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
800 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
801 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
802 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
803diff --git a/usr/palm/frameworks/mojo/submissions/200.18/resources/sv_se/alternatechars_table.json b/usr/palm/frameworks/mojo/submissions/200.18/resources/sv_se/alternatechars_table.json
804index db0fd98..5ee1935 100644
805--- a/usr/palm/frameworks/mojo/submissions/200.18/resources/sv_se/alternatechars_table.json
806+++ b/usr/palm/frameworks/mojo/submissions/200.18/resources/sv_se/alternatechars_table.json
807@@ -1,28 +1,28 @@
808 [
809- {"keyCode": 65, "letter":"a", "list": ["ä","å","à","á","â","ã","æ","Ä","Å","À","Á","Â","Ã","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
810+ {"keyCode": 65, "letter":"a", "list": ["á","à","ä","â","ã","å","æ","Á","À","Ä","Â","Ã","Å","Æ","ª","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
811 {"keyCode": 66, "letter":"b", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
812 {"keyCode": 67, "letter":"c", "list": ["©","ç","Ç","¢"]},
813 {"keyCode": 68, "letter":"d", "list": ["†","‡"]},
814- {"keyCode": 69, "letter":"e", "list": ["è","é","ê","ë","ē","È","É","Ê","Ë","€","¹","¼","½"]},
815+ {"keyCode": 69, "letter":"e", "list": ["é","è","ë","ê","ē","É","È","Ë","Ê","€","¹","¼","½"]},
816 {"keyCode": 72, "letter":"h", "list": ["¢","€","£","¥"]},
817- {"keyCode": 73, "letter":"i", "list": ["ì","í","î","ï","Ì","Í","Î","Ï","÷","‰"]},
818+ {"keyCode": 73, "letter":"i", "list": ["í","ì","ï","î","Í","Ì","Ï","Î","÷","‰"]},
819 {"keyCode": 74, "letter":"j", "list": ["¡"]},
820- {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)"]},
821+ {"keyCode": 75, "letter":"k", "list": [":-)",":-(",";-)","o_O","8)",":'(",":[",":S",":!",":O","^_^","O:-)",":-*",":-D","=-@",":/",":P",":|",":evil",":mad",":heart"]},
822 {"keyCode": 76, "letter":"l", "list": ["`","‘","’","‚","‛"]},
823 {"keyCode": 77, "letter":"m", "list": ["µ",":-)",":-(",";-)"]},
824 {"keyCode": 78, "letter":"n", "list": ["ñ","Ñ","¿"]},
825- {"keyCode": 79, "letter":"o", "list": ["ö","ò","ó","ô","ø","œ","õ","Ö","Ò","Ó","Ô","Ø","Œ","Õ","º","“","”","„","<",">","«","»"]},
826+ {"keyCode": 79, "letter":"o", "list": ["ó","ò","ö","ô","œ","õ","ø","Ó","Ò","Ö","Ô","Œ","Õ","Ø","º","“","”","„","<",">","«","»"]},
827 {"keyCode": 80, "letter":"p", "list": ["¶","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
828 {"keyCode": 81, "letter":"q", "list": ["\\","~","|"]},
829 {"keyCode": 82, "letter":"r", "list": ["®","²"]},
830 {"keyCode": 83, "letter":"s", "list": ["ß","š","Š","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","|"]},
831 {"keyCode": 84, "letter":"t", "list": ["™","³","¾"]},
832- {"keyCode": 85, "letter":"u", "list": ["ù","ú","û","ü","Ù","Ú","Û","Ü","[","]","{","}","<",">","«","»"]},
833+ {"keyCode": 85, "letter":"u", "list": ["ú","ù","ü","û","Ú","Ù","Ü","Û","[","]","{","}","<",">","«","»"]},
834 {"keyCode": 86, "letter":"v", "list": ["^"]},
835 {"keyCode": 87, "letter":"w", "list": ["÷","^","±"]},
836 {"keyCode": 88, "letter":"x", "list": ["×","¤"]},
837 {"keyCode": 89, "letter":"y", "list": ["ÿ","Ÿ","¥","[","]","{","}","<",">","«","»"]},
838- {"keyCode": 90, "letter":"z", "list": ["•"]},
839+ {"keyCode": 90, "letter":"z", "list": ["•",":doh",":mad",":wtf",":cool",":cry",":eek",":sad",":omg",":grin",":kiss",":lol",":evil",":meh",":sick",":smile",":wink",":yuck",":eww",":heart",":angel",":redface"]},
840 {"keyCode": 190, "letter":".", "list": ["…","~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
841 {"keyCode": 188, "letter":",", "list": ["~","\\","`","•","÷","^","[","]","{","}","<",">","«","»","Ø","µ","|"]},
842 {"keyCode": 48, "letter":"@", "list": ["°","•","Ø"]}
  
1diff --git a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2index ee479ac..115140c 100644
3--- a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -2337,7 +2337,9 @@ updateClockEveryMinute: function() {
6 }
7 }
8 format = format.replace(/\s?a\s?/,"");
9- $('clock').innerHTML = Mojo.Format.formatDate(date, {time: format});
10+ var formatDate = Mojo.Format.formatDate(date, {date:'short'});
11+ formatDate = formatDate.substr(0, formatDate.lastIndexOf('/'));
12+ $('clock').innerHTML = formatDate+'&nbsp;&nbsp;&nbsp;'+Mojo.Format.formatDate(date, {time:format});
13 $('today').innerHTML = Mojo.Format.formatDate(date,{date:'short'});
14 },
15
  
1diff --git a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2index ee479ac..f02e1cd 100644
3--- a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -2337,7 +2337,7 @@ updateClockEveryMinute: function() {
6 }
7 }
8 format = format.replace(/\s?a\s?/,"");
9- $('clock').innerHTML = Mojo.Format.formatDate(date, {time: format});
10+ $('clock').innerHTML = Mojo.Format.formatDate(date, {date:'short',time: format});
11 $('today').innerHTML = Mojo.Format.formatDate(date,{date:'short'});
12 },
13
  
1diff --git a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2index ee479ac..c2447db 100644
3--- a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -1430,10 +1430,49 @@ closePbapAlert: function() {
6 }
7 },
8
9+/* Format battery level percent
10+ * We use this function instead of just a variable because
11+ * sometimes this.batteryLevel is used, and sometimes
12+ * payload.percent_ui is
13+ */
14+getBatteryLevelPercent: function(percent, color, image, charging) {
15+ if (color) {
16+ if (charging == 1)
17+ bColor = '#33CCFF';
18+ else if (percent >= 70)
19+ bColor = '#33FF33';
20+ else if(percent <= 69 && percent >= 45)
21+ bColor = '#FFFF33';
22+ else if(percent <= 44 && percent >= 20)
23+ bColor = '#FFCC00';
24+ else if(percent <= 19)
25+ bColor = '#FF0000';
26+ else
27+ bColor = 'white';
28+
29+ // Use span to set color
30+ if (image != undefined)
31+ var fPercent = '<span style="color: ' + bColor + ';">' + percent + unescape('%') + '</span>';
32+ else
33+ var fPercent = '<span style="position: relative; bottom: 2px; color: ' + bColor + ';">' + percent + unescape('%') + '</span>';
34+ }
35+ else {
36+ var fPercent = percent + unescape('%');
37+ }
38+ return fPercent;
39+},
40+
41+
42 /*
43 * Handle power and charging notifications
44 */
45 handlePowerNotifications: function(payload) {
46+ // Replace this with a user definable setting
47+ var batteryLevelImage = 2; // 0 displays image (factory default)
48+ // 1 displays numerical percentage
49+ // 2 displays the image on left and numerical percentage on right (default)
50+
51+ var batteryLevelColor = 1; // Set to 0 for white, 1 for color
52
53 Mojo.Log.info("SystemUI Power Payload "+ Object.toJSON(payload));
54 if(!this.powerdServiceUp) {
55@@ -1453,7 +1492,15 @@ handlePowerNotifications: function(payload) {
56 // Show the battery level if not charging
57 if (!this.isCharging) {
58 Mojo.Log.info("SystemUI- Is Charging "+ this.isCharging + " Battery level "+ i);
59+ if (batteryLevelImage == 0) {
60 $('power').className = 'battery-' + i;
61+ } else if(batteryLevelImage == 1) {
62+ $('power').className = 'battery-percent';
63+ $('power').innerHTML = this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 0);
64+ } else if(batteryLevelImage == 2) {
65+ $('power').className = 'battery-percentimage';
66+ $('power').innerHTML = '<img src="images/battery-' + i + '.png" />' + this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor);
67+ }
68
69 //Show Banner Message if the Battery level is below 20%
70 var batteryalert = $L("#{percent_ui}% battery remaining").interpolate(payload);
71@@ -1482,10 +1529,23 @@ handlePowerNotifications: function(payload) {
72 }
73 else {
74 Mojo.Log.info("SystemUI- Is Charging "+ this.isCharging );
75- if(payload.percent_ui == 100)
76+ if (batteryLevelImage == 0) {
77+ if (payload.percent_ui == 100)
78 $('power').className = 'battery-charged';
79 else
80 $('power').className = 'battery-charging-' + i;
81+ } else if (batteryLevelImage == 1) {
82+ $('power').className = 'battery-percent';
83+ $('power').innerHTML = this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 1);
84+ } else if(batteryLevelImage == 2) {
85+ if (payload.percent_ui == 100) {
86+ $('power').className = 'battery-percentimage-charged';
87+ $('power').innerHTML = '<img src="images/battery-charged.png" />' + this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 1);
88+ } else {
89+ $('power').className = 'battery-percentimage';
90+ $('power').innerHTML = '<img src="images/battery-charging-' + i + '.png" />' + this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 1);
91+ }
92+ }
93
94 }
95
96@@ -1522,10 +1582,23 @@ handlePowerNotifications: function(payload) {
97
98 if (this.isCharging) {
99 Mojo.Log.info("SystemUI- Charger Notification "+ this.isCharging + " Last battery level "+ this.lastBatteryLevel);
100- if(this.batteryLevel == 100)
101+ if (batteryLevelImage == 0) {
102+ if (this.batteryLevel == 100)
103 $('power').className = 'battery-charged';
104 else
105 $('power').className = 'battery-charging-' + this.lastBatteryLevel;
106+ } else if(batteryLevelImage == 1) {
107+ $('power').className = 'battery-percent';
108+ $('power').innerHTML = this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true, 1);
109+ } else if(batteryLevelImage == 2) {
110+ if (this.batteryLevel == 100) {
111+ $('power').className = 'battery-percentimage-charged';
112+ $('power').innerHTML = '<img src="images/battery-charged.png" />' + this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true, 1);
113+ } else {
114+ $('power').className = 'battery-percentimage';
115+ $('power').innerHTML = '<img src="images/battery-charging-' + this.lastBatteryLevel + '.png" />' + this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true, 1);
116+ }
117+ }
118
119 var stageController = Mojo.Controller.getAppController().getStageProxy("LowBatteryAlert");
120 if (stageController) {
121@@ -1546,7 +1619,17 @@ handlePowerNotifications: function(payload) {
122 else {
123 this.chargingBannerShown = false;
124 Mojo.Log.info("SystemUI- Charger Notification "+ this.isCharging + " Last battery level "+ this.lastBatteryLevel);
125+ if (batteryLevelImage == 0) {
126 $('power').className = 'battery-' + this.lastBatteryLevel;
127+ }
128+ else if (batteryLevelImage == 1) {
129+ $('power').className = 'battery-percent';
130+ $('power').innerHTML = this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true);
131+ }
132+ else if(batteryLevelImage == 2) {
133+ $('power').className = 'battery-percentimage';
134+ $('power').innerHTML = '<img src="images/battery-' + this.lastBatteryLevel + '.png" />' + this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor);
135+ }
136 Mojo.Controller.getAppController().removeBanner('chargingAlert');
137 }
138 }
139diff --git a/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css b/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css
140index 58b22e8..b23eab5 100644
141--- a/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css
142+++ b/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css
143@@ -136,6 +136,22 @@ body.palm-default {
144 margin-left: 2px;
145 width: 17px;
146 }
147+
148+/* Begin: Battery Percent / Image w/ Percent */
149+#power.battery-percent {
150+ width: 38px;
151+ background-color: black;
152+}
153+#power.battery-percentimage {
154+ width: 49px;
155+ background-color: black;
156+}
157+#power.battery-percentimage-charged {
158+ width: 49px;
159+ background-color: black;
160+}
161+/* End: Battery Percent / Image w/ Percent */
162+
163 #power.error {
164 background: url(../images/battery-error.png) center center no-repeat;
165 }
  
1diff --git a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2index ee479ac..0618d89 100644
3--- a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -1430,10 +1430,49 @@ closePbapAlert: function() {
6 }
7 },
8
9+/* Format battery level percent
10+ * We use this function instead of just a variable because
11+ * sometimes this.batteryLevel is used, and sometimes
12+ * payload.percent_ui is
13+ */
14+getBatteryLevelPercent: function(percent, color, image, charging) {
15+ if (color) {
16+ if (charging == 1)
17+ bColor = '#33CCFF';
18+ else if (percent >= 70)
19+ bColor = '#33FF33';
20+ else if(percent <= 69 && percent >= 45)
21+ bColor = '#FFFF33';
22+ else if(percent <= 44 && percent >= 20)
23+ bColor = '#FFCC00';
24+ else if(percent <= 19)
25+ bColor = '#FF0000';
26+ else
27+ bColor = 'white';
28+
29+ // Use span to set color
30+ if (image != undefined)
31+ var fPercent = '<span style="color: ' + bColor + ';">' + percent + unescape('%') + '</span>';
32+ else
33+ var fPercent = '<span style="position: relative; bottom: 2px; color: ' + bColor + ';">' + percent + unescape('%') + '</span>';
34+ }
35+ else {
36+ var fPercent = percent + unescape('%');
37+ }
38+ return fPercent;
39+},
40+
41+
42 /*
43 * Handle power and charging notifications
44 */
45 handlePowerNotifications: function(payload) {
46+ // Replace this with a user definable setting
47+ var batteryLevelImage = 1; // 0 displays image (factory default)
48+ // 1 displays numerical percentage
49+ // 2 displays the image on left and numerical percentage on right (default)
50+
51+ var batteryLevelColor = 1; // Set to 0 for white, 1 for color
52
53 Mojo.Log.info("SystemUI Power Payload "+ Object.toJSON(payload));
54 if(!this.powerdServiceUp) {
55@@ -1453,7 +1492,15 @@ handlePowerNotifications: function(payload) {
56 // Show the battery level if not charging
57 if (!this.isCharging) {
58 Mojo.Log.info("SystemUI- Is Charging "+ this.isCharging + " Battery level "+ i);
59+ if (batteryLevelImage == 0) {
60 $('power').className = 'battery-' + i;
61+ } else if(batteryLevelImage == 1) {
62+ $('power').className = 'battery-percent';
63+ $('power').innerHTML = this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 0);
64+ } else if(batteryLevelImage == 2) {
65+ $('power').className = 'battery-percentimage';
66+ $('power').innerHTML = '<img src="images/battery-' + i + '.png" />' + this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor);
67+ }
68
69 //Show Banner Message if the Battery level is below 20%
70 var batteryalert = $L("#{percent_ui}% battery remaining").interpolate(payload);
71@@ -1482,10 +1529,23 @@ handlePowerNotifications: function(payload) {
72 }
73 else {
74 Mojo.Log.info("SystemUI- Is Charging "+ this.isCharging );
75- if(payload.percent_ui == 100)
76+ if (batteryLevelImage == 0) {
77+ if (payload.percent_ui == 100)
78 $('power').className = 'battery-charged';
79 else
80 $('power').className = 'battery-charging-' + i;
81+ } else if (batteryLevelImage == 1) {
82+ $('power').className = 'battery-percent';
83+ $('power').innerHTML = this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 1);
84+ } else if(batteryLevelImage == 2) {
85+ if (payload.percent_ui == 100) {
86+ $('power').className = 'battery-percentimage-charged';
87+ $('power').innerHTML = '<img src="images/battery-charged.png" />' + this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 1);
88+ } else {
89+ $('power').className = 'battery-percentimage';
90+ $('power').innerHTML = '<img src="images/battery-charging-' + i + '.png" />' + this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 1);
91+ }
92+ }
93
94 }
95
96@@ -1522,10 +1582,23 @@ handlePowerNotifications: function(payload) {
97
98 if (this.isCharging) {
99 Mojo.Log.info("SystemUI- Charger Notification "+ this.isCharging + " Last battery level "+ this.lastBatteryLevel);
100- if(this.batteryLevel == 100)
101+ if (batteryLevelImage == 0) {
102+ if (this.batteryLevel == 100)
103 $('power').className = 'battery-charged';
104 else
105 $('power').className = 'battery-charging-' + this.lastBatteryLevel;
106+ } else if(batteryLevelImage == 1) {
107+ $('power').className = 'battery-percent';
108+ $('power').innerHTML = this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true, 1);
109+ } else if(batteryLevelImage == 2) {
110+ if (this.batteryLevel == 100) {
111+ $('power').className = 'battery-percentimage-charged';
112+ $('power').innerHTML = '<img src="images/battery-charged.png" />' + this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true, 1);
113+ } else {
114+ $('power').className = 'battery-percentimage';
115+ $('power').innerHTML = '<img src="images/battery-charging-' + this.lastBatteryLevel + '.png" />' + this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true, 1);
116+ }
117+ }
118
119 var stageController = Mojo.Controller.getAppController().getStageProxy("LowBatteryAlert");
120 if (stageController) {
121@@ -1546,7 +1619,17 @@ handlePowerNotifications: function(payload) {
122 else {
123 this.chargingBannerShown = false;
124 Mojo.Log.info("SystemUI- Charger Notification "+ this.isCharging + " Last battery level "+ this.lastBatteryLevel);
125+ if (batteryLevelImage == 0) {
126 $('power').className = 'battery-' + this.lastBatteryLevel;
127+ }
128+ else if (batteryLevelImage == 1) {
129+ $('power').className = 'battery-percent';
130+ $('power').innerHTML = this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true);
131+ }
132+ else if(batteryLevelImage == 2) {
133+ $('power').className = 'battery-percentimage';
134+ $('power').innerHTML = '<img src="images/battery-' + this.lastBatteryLevel + '.png" />' + this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor);
135+ }
136 Mojo.Controller.getAppController().removeBanner('chargingAlert');
137 }
138 }
139diff --git a/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css b/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css
140index 58b22e8..b23eab5 100644
141--- a/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css
142+++ b/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css
143@@ -136,6 +136,22 @@ body.palm-default {
144 margin-left: 2px;
145 width: 17px;
146 }
147+
148+/* Begin: Battery Percent / Image w/ Percent */
149+#power.battery-percent {
150+ width: 38px;
151+ background-color: black;
152+}
153+#power.battery-percentimage {
154+ width: 49px;
155+ background-color: black;
156+}
157+#power.battery-percentimage-charged {
158+ width: 49px;
159+ background-color: black;
160+}
161+/* End: Battery Percent / Image w/ Percent */
162+
163 #power.error {
164 background: url(../images/battery-error.png) center center no-repeat;
165 }
  
1diff --git a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2index f343ce2..6f9bcd3 100644
3--- a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -1479,7 +1479,7 @@ handlePowerNotifications: function(payload) {
6 this.controller.showBanner({
7 messageText: batteryalert,
8 icon: "/usr/lib/luna/system/luna-systemui/images/notification-small-charging.png",
9- soundClass: soundClassName
10+ soundClass: ""
11 },null, 'chargingAlert');
12 }
13 this.chargingBannerShown = true;
  
1diff --git a/usr/palm/applications/com.palm.app.devmodeswitcher/appinfo.json b/usr/palm/applications/com.palm.app.devmodeswitcher/appinfo.json
2index 7d9da85..c0f2522 100644
3--- a/usr/palm/applications/com.palm.app.devmodeswitcher/appinfo.json
4+++ b/usr/palm/applications/com.palm.app.devmodeswitcher/appinfo.json
5@@ -5,6 +5,6 @@
6 "id": "com.palm.app.devmodeswitcher",
7 "icon": "icon.png",
8 "noWindow": false,
9- "visible": false
10+ "visible": true
11 }
12
  
1diff --git a/usr/lib/luna/system/luna-applauncher/app/controllers/global-search-assistant.js b/usr/lib/luna/system/luna-applauncher/app/controllers/global-search-assistant.js
2index 7d94506..1c90d5e 100644
3--- a/usr/lib/luna/system/luna-applauncher/app/controllers/global-search-assistant.js
4+++ b/usr/lib/luna/system/luna-applauncher/app/controllers/global-search-assistant.js
5@@ -48,6 +48,7 @@ GlobalSearchAssistant = Class.create({
6 this.offset=0;
7 this.limit=40;
8 this.URLs = {
9+ 'keytoss':$L("http://pre.keytoss.com/parse.php5?term="),
10 'google':$L("www.google.com/m/search?client=ms-palm-webOS&channel=iss&q="),
11 'wikipedia':$L("http://en.m.wikipedia.org/wiki/Special:Search?search="),
12 'twitter': $L("http://search.twitter.com/search?q=")
13@@ -1656,6 +1657,7 @@ GlobalSearchAssistant = Class.create({
14 this.expandedSearchDrawer.showExpanded = false;
15 this.controller.modelChanged(this.expandedSearchDrawer);
16 this.searchApps.clear();
17+ $('keytoss').removeClassName('selected');
18 $('google').removeClassName('selected');
19 $('map').removeClassName('selected');
20 $('wikipedia').removeClassName('selected');
21@@ -1761,6 +1763,7 @@ GlobalSearchAssistant = Class.create({
22 }
23 //clear search':
24 $('google').removeClassName('palm-focus');
25+ $('keytoss').removeClassName('palm-focus');
26 $('web').removeClassName('palm-focus');
27 },
28 highlightSelection: function() {
29@@ -1819,19 +1822,23 @@ GlobalSearchAssistant = Class.create({
30 break;
31 case 'search':
32 if (this.webDrawer.showWeb == true) {
33- $('google').removeClassName('palm-focus');
34+ //$('google').removeClassName('palm-focus');
35+ $('keytoss').removeClassName('palm-focus');
36 $('web').addClassName('palm-focus');
37 this.highlightTarget = $('web');
38 }
39 else if(this.expandedSearchDrawer.showExpanded == true){
40- $('google').addClassName('palm-focus');
41+ //$('google').addClassName('palm-focus');
42+ $('keytoss').addClassName('palm-focus');
43 $('web').removeClassName('palm-focus');
44- this.highlightTarget = $('google');
45+ //this.highlightTarget = $('google');
46+ this.highlightTarget = $('keytoss');
47 }
48 break;
49 }
50 if (this.enterKeyActionItem != "search") {
51 $('google').removeClassName('palm-focus');
52+ $('keytoss').removeClassName('palm-focus');
53 $('web').removeClassName('palm-focus');
54 }
55 },
56@@ -1923,7 +1930,8 @@ GlobalSearchAssistant = Class.create({
57 if (this.webDrawer.showWeb == true)
58 this.launchBrowser(this.currentFilter);
59 else {
60- this.launchBrowser(this.URLs['google'] + encodeURIComponent(this.currentFilter));
61+ //this.launchBrowser(this.URLs['google'] + encodeURIComponent(this.currentFilter));
62+ this.launchBrowser(this.URLs['keytoss'] + encodeURIComponent(this.currentFilter));
63 }
64 break;
65 }
66diff --git a/usr/lib/luna/system/luna-applauncher/app/views/global-search/expanded-searches-div.html b/usr/lib/luna/system/luna-applauncher/app/views/global-search/expanded-searches-div.html
67index 7bfc200..00cc1cc 100644
68--- a/usr/lib/luna/system/luna-applauncher/app/views/global-search/expanded-searches-div.html
69+++ b/usr/lib/luna/system/luna-applauncher/app/views/global-search/expanded-searches-div.html
70@@ -9,6 +9,11 @@
71 </div>
72
73 <div id='expanded_searches_drawer' x-mojo-element="Drawer">
74+ <div class="palm-row" id="keytoss" name="search-identifier" x-mojo-tap-highlight="persistent">
75+ <div class="palm-row-wrapper">
76+ <div class="search-keytoss"></div>
77+ </div>
78+ </div>
79 <div class="palm-row" id="google" name="search-identifier" x-mojo-tap-highlight="persistent">
80 <div class="palm-row-wrapper">
81 <div class="search-google"></div>
82diff --git a/usr/lib/luna/system/luna-applauncher/stylesheets/global-search.css b/usr/lib/luna/system/luna-applauncher/stylesheets/global-search.css
83index 1f10209..5887f9c 100644
84--- a/usr/lib/luna/system/luna-applauncher/stylesheets/global-search.css
85+++ b/usr/lib/luna/system/luna-applauncher/stylesheets/global-search.css
86@@ -119,6 +119,12 @@ Copyright 2009 Palm, Inc. All rights reserved.
87 background: url(../images/search-add.png) center center no-repeat;
88 }
89
90+.palm-group.search .search-keytoss {
91+ width: 100%;
92+ height: 52px;
93+ background: url(../images/search-keytoss.png) center center no-repeat;
94+}
95+
96 .palm-group.search .search-google {
97 width: 100%;
98 height: 52px;
99diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/urlsearch-controller.js b/usr/palm/applications/com.palm.app.browser/app/controllers/urlsearch-controller.js
100index 986f0bb..61d4d0c 100644
101--- a/usr/palm/applications/com.palm.app.browser/app/controllers/urlsearch-controller.js
102+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/urlsearch-controller.js
103@@ -58,6 +58,12 @@ function UrlSearchController(controller){
104
105 // Our search providers
106 UrlSearchController.SearchProviders = {
107+ keytoss: {
108+ searchTitle: $L('Search KeyToss'),
109+ searchTemplate: $L('KeyToss "#{search}"'),
110+ urlTemplate: $L('http://pre.keytoss.com/parse.php5?term=#{query}')
111+ },
112+
113 google: {
114 searchTitle: $L('Search Google'),
115 searchTemplate: $L('Google "#{search}"'),
116@@ -218,14 +224,18 @@ UrlSearchController.prototype._addStockSearchItems = function(searchText, withDi
117 this.urlSearchListModel.unshift(item);
118
119 // Google block....
120- url = UrlSearchController.SearchProviders.google.urlTemplate.interpolate({query: encodedUriComponent});
121- title = UrlSearchController.SearchProviders.google.searchTemplate.interpolate({search: escapedSearchText});
122+ //url = UrlSearchController.SearchProviders.google.urlTemplate.interpolate({query: encodedUriComponent});
123+ //title = UrlSearchController.SearchProviders.google.searchTemplate.interpolate({search: escapedSearchText});
124+ url = UrlSearchController.SearchProviders.keytoss.urlTemplate.interpolate({query: encodedUriComponent});
125+ title = UrlSearchController.SearchProviders.keytoss.searchTemplate.interpolate({search: escapedSearchText});
126
127 item = new UrlReference(url, title);
128- item.subTitle = UrlSearchController.SearchProviders.google.searchTitle;
129+ //item.subTitle = UrlSearchController.SearchProviders.google.searchTitle;
130+ item.subTitle = UrlSearchController.SearchProviders.keytoss.searchTitle;
131 item.iconclass = 'search-image';
132 item.rowclass = 'search first';
133- item.iconUrl = Mojo.appPath + 'images/list-icon-google.png';
134+ //item.iconUrl = Mojo.appPath + 'images/list-icon-google.png';
135+ item.iconUrl = Mojo.appPath + 'images/list-icon-keytoss.png';
136
137 this.urlSearchListModel.unshift(item);
138
139@@ -382,7 +392,8 @@ UrlSearchController.prototype._handleSelection = function(event) {
140
141 UrlSearchController.formatDefaultSearchUrl = function(query) {
142
143- return UrlSearchController.SearchProviders.google.urlTemplate.interpolate({query: encodeURIComponent(query)});
144+ //return UrlSearchController.SearchProviders.google.urlTemplate.interpolate({query: encodeURIComponent(query)});
145+ return UrlSearchController.SearchProviders.keytoss.urlTemplate.interpolate({query: encodeURIComponent(query)});
146 };
147
148 /**
  
1diff --git a/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js b/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
2index 4da3e85..590fab5 100644
3--- a/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
4+++ b/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
5@@ -10,7 +10,7 @@ var LauncherAssistant = Class.create({
6 */
7 kQuickLaunchHeight: 67,
8
9- kPageIndicatorSpacing: 6, /* spacing between each page indicator */
10+ kPageIndicatorSpacing: 1, /* spacing between each page indicator */
11 kPageMargin: 10, /* 10 pixel margin on each side of a page */
12 kPageWidthNoMargin: NaN,
13 kPageWidth: NaN,
14@@ -324,9 +324,9 @@ var LauncherAssistant = Class.create({
15 var newAppDiv = $(newAppInfo.launchPointId);
16 Mojo.assert(newAppDiv !== undefined, "Application (%d) was inserted into the DOM but unable to be retrieved!", newAppInfo.launchPointId);
17 if (isNaN(this.kAppWidth) || isNaN(this.kAppHeight)) {
18- this.kAppWidth = newAppDiv.getWidth();
19- this.kAppHeight = newAppDiv.getHeight();
20- this.kAppsPerRow = Math.round(this.kPageWidthNoMargin / this.kAppWidth);
21+ this.kAppWidth = 75;
22+ this.kAppHeight = 90;
23+ this.kAppsPerRow = 4;
24 }
25
26 Mojo.listen(newAppDiv, Mojo.Event.tap, this.onAppTapped.bindAsEventListener(this));
27@@ -439,7 +439,7 @@ var LauncherAssistant = Class.create({
28 /* determines the position of an app element at appIndex within a page */
29 calculateAppPosition: function(appIndex) {
30 return {
31- left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) + this.kPageMargin),
32+ left: (((appIndex % this.kAppsPerRow) * this.kAppWidth)),
33 top: (Math.floor(appIndex/this.kAppsPerRow) * this.kAppHeight)
34 };
35 },
36diff --git a/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css b/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
37index b1244af..0abf90f 100644
38--- a/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
39+++ b/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
40@@ -121,8 +121,8 @@ body.palm-default
41
42 .launcher_page .name {
43 position:absolute;
44- top: 68px;
45- width:100px;
46+ top: 48px;
47+ width:80px;
48 height: 34px;
49 max-height: 34px;
50 clear:both;
51@@ -130,7 +130,8 @@ body.palm-default
52 color:white;
53 text-align:center;
54 font-weight:bold;
55- font-size: 14px;
56+ font-size: 11px;
57+ left: 10px;
58 overflow: hidden;
59 text-overflow: ellipsis;
60 z-index:5;
61@@ -164,8 +165,8 @@ body.palm-default
62 }
63
64 .draggable {
65- width:64px;
66- height:64px;
67+ width:48px;
68+ height:48px;
69 margin: 0 auto;
70 -webkit-user-drag: any;
71 -webkit-user-select: none;
72@@ -213,8 +214,8 @@ body.palm-default
73
74 #app-icon {
75 float:left;
76- width:64px;
77- height:64px;
78+ width:32px;
79+ height:32px;
80 background: center center no-repeat;
81 }
82
  
1diff --git a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2index ee479ac..115140c 100644
3--- a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -2337,7 +2337,9 @@ updateClockEveryMinute: function() {
6 }
7 }
8 format = format.replace(/\s?a\s?/,"");
9- $('clock').innerHTML = Mojo.Format.formatDate(date, {time: format});
10+ var formatDate = Mojo.Format.formatDate(date, {date:'short'});
11+ formatDate = formatDate.substr(0, formatDate.lastIndexOf('/'));
12+ $('clock').innerHTML = formatDate+'&nbsp;&nbsp;&nbsp;'+Mojo.Format.formatDate(date, {time:format});
13 $('today').innerHTML = Mojo.Format.formatDate(date,{date:'short'});
14 },
15
  
1diff --git a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2index ee479ac..f02e1cd 100644
3--- a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -2337,7 +2337,7 @@ updateClockEveryMinute: function() {
6 }
7 }
8 format = format.replace(/\s?a\s?/,"");
9- $('clock').innerHTML = Mojo.Format.formatDate(date, {time: format});
10+ $('clock').innerHTML = Mojo.Format.formatDate(date, {date:'short',time: format});
11 $('today').innerHTML = Mojo.Format.formatDate(date,{date:'short'});
12 },
13
  
1diff --git a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2index ee479ac..c2447db 100644
3--- a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -1430,10 +1430,49 @@ closePbapAlert: function() {
6 }
7 },
8
9+/* Format battery level percent
10+ * We use this function instead of just a variable because
11+ * sometimes this.batteryLevel is used, and sometimes
12+ * payload.percent_ui is
13+ */
14+getBatteryLevelPercent: function(percent, color, image, charging) {
15+ if (color) {
16+ if (charging == 1)
17+ bColor = '#33CCFF';
18+ else if (percent >= 70)
19+ bColor = '#33FF33';
20+ else if(percent <= 69 && percent >= 45)
21+ bColor = '#FFFF33';
22+ else if(percent <= 44 && percent >= 20)
23+ bColor = '#FFCC00';
24+ else if(percent <= 19)
25+ bColor = '#FF0000';
26+ else
27+ bColor = 'white';
28+
29+ // Use span to set color
30+ if (image != undefined)
31+ var fPercent = '<span style="color: ' + bColor + ';">' + percent + unescape('%') + '</span>';
32+ else
33+ var fPercent = '<span style="position: relative; bottom: 2px; color: ' + bColor + ';">' + percent + unescape('%') + '</span>';
34+ }
35+ else {
36+ var fPercent = percent + unescape('%');
37+ }
38+ return fPercent;
39+},
40+
41+
42 /*
43 * Handle power and charging notifications
44 */
45 handlePowerNotifications: function(payload) {
46+ // Replace this with a user definable setting
47+ var batteryLevelImage = 2; // 0 displays image (factory default)
48+ // 1 displays numerical percentage
49+ // 2 displays the image on left and numerical percentage on right (default)
50+
51+ var batteryLevelColor = 1; // Set to 0 for white, 1 for color
52
53 Mojo.Log.info("SystemUI Power Payload "+ Object.toJSON(payload));
54 if(!this.powerdServiceUp) {
55@@ -1453,7 +1492,15 @@ handlePowerNotifications: function(payload) {
56 // Show the battery level if not charging
57 if (!this.isCharging) {
58 Mojo.Log.info("SystemUI- Is Charging "+ this.isCharging + " Battery level "+ i);
59+ if (batteryLevelImage == 0) {
60 $('power').className = 'battery-' + i;
61+ } else if(batteryLevelImage == 1) {
62+ $('power').className = 'battery-percent';
63+ $('power').innerHTML = this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 0);
64+ } else if(batteryLevelImage == 2) {
65+ $('power').className = 'battery-percentimage';
66+ $('power').innerHTML = '<img src="images/battery-' + i + '.png" />' + this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor);
67+ }
68
69 //Show Banner Message if the Battery level is below 20%
70 var batteryalert = $L("#{percent_ui}% battery remaining").interpolate(payload);
71@@ -1482,10 +1529,23 @@ handlePowerNotifications: function(payload) {
72 }
73 else {
74 Mojo.Log.info("SystemUI- Is Charging "+ this.isCharging );
75- if(payload.percent_ui == 100)
76+ if (batteryLevelImage == 0) {
77+ if (payload.percent_ui == 100)
78 $('power').className = 'battery-charged';
79 else
80 $('power').className = 'battery-charging-' + i;
81+ } else if (batteryLevelImage == 1) {
82+ $('power').className = 'battery-percent';
83+ $('power').innerHTML = this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 1);
84+ } else if(batteryLevelImage == 2) {
85+ if (payload.percent_ui == 100) {
86+ $('power').className = 'battery-percentimage-charged';
87+ $('power').innerHTML = '<img src="images/battery-charged.png" />' + this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 1);
88+ } else {
89+ $('power').className = 'battery-percentimage';
90+ $('power').innerHTML = '<img src="images/battery-charging-' + i + '.png" />' + this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 1);
91+ }
92+ }
93
94 }
95
96@@ -1522,10 +1582,23 @@ handlePowerNotifications: function(payload) {
97
98 if (this.isCharging) {
99 Mojo.Log.info("SystemUI- Charger Notification "+ this.isCharging + " Last battery level "+ this.lastBatteryLevel);
100- if(this.batteryLevel == 100)
101+ if (batteryLevelImage == 0) {
102+ if (this.batteryLevel == 100)
103 $('power').className = 'battery-charged';
104 else
105 $('power').className = 'battery-charging-' + this.lastBatteryLevel;
106+ } else if(batteryLevelImage == 1) {
107+ $('power').className = 'battery-percent';
108+ $('power').innerHTML = this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true, 1);
109+ } else if(batteryLevelImage == 2) {
110+ if (this.batteryLevel == 100) {
111+ $('power').className = 'battery-percentimage-charged';
112+ $('power').innerHTML = '<img src="images/battery-charged.png" />' + this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true, 1);
113+ } else {
114+ $('power').className = 'battery-percentimage';
115+ $('power').innerHTML = '<img src="images/battery-charging-' + this.lastBatteryLevel + '.png" />' + this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true, 1);
116+ }
117+ }
118
119 var stageController = Mojo.Controller.getAppController().getStageProxy("LowBatteryAlert");
120 if (stageController) {
121@@ -1546,7 +1619,17 @@ handlePowerNotifications: function(payload) {
122 else {
123 this.chargingBannerShown = false;
124 Mojo.Log.info("SystemUI- Charger Notification "+ this.isCharging + " Last battery level "+ this.lastBatteryLevel);
125+ if (batteryLevelImage == 0) {
126 $('power').className = 'battery-' + this.lastBatteryLevel;
127+ }
128+ else if (batteryLevelImage == 1) {
129+ $('power').className = 'battery-percent';
130+ $('power').innerHTML = this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true);
131+ }
132+ else if(batteryLevelImage == 2) {
133+ $('power').className = 'battery-percentimage';
134+ $('power').innerHTML = '<img src="images/battery-' + this.lastBatteryLevel + '.png" />' + this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor);
135+ }
136 Mojo.Controller.getAppController().removeBanner('chargingAlert');
137 }
138 }
139diff --git a/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css b/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css
140index 58b22e8..b23eab5 100644
141--- a/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css
142+++ b/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css
143@@ -136,6 +136,22 @@ body.palm-default {
144 margin-left: 2px;
145 width: 17px;
146 }
147+
148+/* Begin: Battery Percent / Image w/ Percent */
149+#power.battery-percent {
150+ width: 38px;
151+ background-color: black;
152+}
153+#power.battery-percentimage {
154+ width: 49px;
155+ background-color: black;
156+}
157+#power.battery-percentimage-charged {
158+ width: 49px;
159+ background-color: black;
160+}
161+/* End: Battery Percent / Image w/ Percent */
162+
163 #power.error {
164 background: url(../images/battery-error.png) center center no-repeat;
165 }
  
1diff --git a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2index ee479ac..0618d89 100644
3--- a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -1430,10 +1430,49 @@ closePbapAlert: function() {
6 }
7 },
8
9+/* Format battery level percent
10+ * We use this function instead of just a variable because
11+ * sometimes this.batteryLevel is used, and sometimes
12+ * payload.percent_ui is
13+ */
14+getBatteryLevelPercent: function(percent, color, image, charging) {
15+ if (color) {
16+ if (charging == 1)
17+ bColor = '#33CCFF';
18+ else if (percent >= 70)
19+ bColor = '#33FF33';
20+ else if(percent <= 69 && percent >= 45)
21+ bColor = '#FFFF33';
22+ else if(percent <= 44 && percent >= 20)
23+ bColor = '#FFCC00';
24+ else if(percent <= 19)
25+ bColor = '#FF0000';
26+ else
27+ bColor = 'white';
28+
29+ // Use span to set color
30+ if (image != undefined)
31+ var fPercent = '<span style="color: ' + bColor + ';">' + percent + unescape('%') + '</span>';
32+ else
33+ var fPercent = '<span style="position: relative; bottom: 2px; color: ' + bColor + ';">' + percent + unescape('%') + '</span>';
34+ }
35+ else {
36+ var fPercent = percent + unescape('%');
37+ }
38+ return fPercent;
39+},
40+
41+
42 /*
43 * Handle power and charging notifications
44 */
45 handlePowerNotifications: function(payload) {
46+ // Replace this with a user definable setting
47+ var batteryLevelImage = 1; // 0 displays image (factory default)
48+ // 1 displays numerical percentage
49+ // 2 displays the image on left and numerical percentage on right (default)
50+
51+ var batteryLevelColor = 1; // Set to 0 for white, 1 for color
52
53 Mojo.Log.info("SystemUI Power Payload "+ Object.toJSON(payload));
54 if(!this.powerdServiceUp) {
55@@ -1453,7 +1492,15 @@ handlePowerNotifications: function(payload) {
56 // Show the battery level if not charging
57 if (!this.isCharging) {
58 Mojo.Log.info("SystemUI- Is Charging "+ this.isCharging + " Battery level "+ i);
59+ if (batteryLevelImage == 0) {
60 $('power').className = 'battery-' + i;
61+ } else if(batteryLevelImage == 1) {
62+ $('power').className = 'battery-percent';
63+ $('power').innerHTML = this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 0);
64+ } else if(batteryLevelImage == 2) {
65+ $('power').className = 'battery-percentimage';
66+ $('power').innerHTML = '<img src="images/battery-' + i + '.png" />' + this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor);
67+ }
68
69 //Show Banner Message if the Battery level is below 20%
70 var batteryalert = $L("#{percent_ui}% battery remaining").interpolate(payload);
71@@ -1482,10 +1529,23 @@ handlePowerNotifications: function(payload) {
72 }
73 else {
74 Mojo.Log.info("SystemUI- Is Charging "+ this.isCharging );
75- if(payload.percent_ui == 100)
76+ if (batteryLevelImage == 0) {
77+ if (payload.percent_ui == 100)
78 $('power').className = 'battery-charged';
79 else
80 $('power').className = 'battery-charging-' + i;
81+ } else if (batteryLevelImage == 1) {
82+ $('power').className = 'battery-percent';
83+ $('power').innerHTML = this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 1);
84+ } else if(batteryLevelImage == 2) {
85+ if (payload.percent_ui == 100) {
86+ $('power').className = 'battery-percentimage-charged';
87+ $('power').innerHTML = '<img src="images/battery-charged.png" />' + this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 1);
88+ } else {
89+ $('power').className = 'battery-percentimage';
90+ $('power').innerHTML = '<img src="images/battery-charging-' + i + '.png" />' + this.getBatteryLevelPercent(payload.percent_ui, batteryLevelColor, true, 1);
91+ }
92+ }
93
94 }
95
96@@ -1522,10 +1582,23 @@ handlePowerNotifications: function(payload) {
97
98 if (this.isCharging) {
99 Mojo.Log.info("SystemUI- Charger Notification "+ this.isCharging + " Last battery level "+ this.lastBatteryLevel);
100- if(this.batteryLevel == 100)
101+ if (batteryLevelImage == 0) {
102+ if (this.batteryLevel == 100)
103 $('power').className = 'battery-charged';
104 else
105 $('power').className = 'battery-charging-' + this.lastBatteryLevel;
106+ } else if(batteryLevelImage == 1) {
107+ $('power').className = 'battery-percent';
108+ $('power').innerHTML = this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true, 1);
109+ } else if(batteryLevelImage == 2) {
110+ if (this.batteryLevel == 100) {
111+ $('power').className = 'battery-percentimage-charged';
112+ $('power').innerHTML = '<img src="images/battery-charged.png" />' + this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true, 1);
113+ } else {
114+ $('power').className = 'battery-percentimage';
115+ $('power').innerHTML = '<img src="images/battery-charging-' + this.lastBatteryLevel + '.png" />' + this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true, 1);
116+ }
117+ }
118
119 var stageController = Mojo.Controller.getAppController().getStageProxy("LowBatteryAlert");
120 if (stageController) {
121@@ -1546,7 +1619,17 @@ handlePowerNotifications: function(payload) {
122 else {
123 this.chargingBannerShown = false;
124 Mojo.Log.info("SystemUI- Charger Notification "+ this.isCharging + " Last battery level "+ this.lastBatteryLevel);
125+ if (batteryLevelImage == 0) {
126 $('power').className = 'battery-' + this.lastBatteryLevel;
127+ }
128+ else if (batteryLevelImage == 1) {
129+ $('power').className = 'battery-percent';
130+ $('power').innerHTML = this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor, true);
131+ }
132+ else if(batteryLevelImage == 2) {
133+ $('power').className = 'battery-percentimage';
134+ $('power').innerHTML = '<img src="images/battery-' + this.lastBatteryLevel + '.png" />' + this.getBatteryLevelPercent(this.batteryLevel, batteryLevelColor);
135+ }
136 Mojo.Controller.getAppController().removeBanner('chargingAlert');
137 }
138 }
139diff --git a/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css b/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css
140index 58b22e8..b23eab5 100644
141--- a/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css
142+++ b/usr/lib/luna/system/luna-systemui/stylesheets/systemui.css
143@@ -136,6 +136,22 @@ body.palm-default {
144 margin-left: 2px;
145 width: 17px;
146 }
147+
148+/* Begin: Battery Percent / Image w/ Percent */
149+#power.battery-percent {
150+ width: 38px;
151+ background-color: black;
152+}
153+#power.battery-percentimage {
154+ width: 49px;
155+ background-color: black;
156+}
157+#power.battery-percentimage-charged {
158+ width: 49px;
159+ background-color: black;
160+}
161+/* End: Battery Percent / Image w/ Percent */
162+
163 #power.error {
164 background: url(../images/battery-error.png) center center no-repeat;
165 }
  
1diff --git a/usr/lib/luna/system/luna-applauncher/app/controllers/global-search-assistant.js b/usr/lib/luna/system/luna-applauncher/app/controllers/global-search-assistant.js
2index 7d94506..1c90d5e 100644
3--- a/usr/lib/luna/system/luna-applauncher/app/controllers/global-search-assistant.js
4+++ b/usr/lib/luna/system/luna-applauncher/app/controllers/global-search-assistant.js
5@@ -48,6 +48,7 @@ GlobalSearchAssistant = Class.create({
6 this.offset=0;
7 this.limit=40;
8 this.URLs = {
9+ 'keytoss':$L("http://pre.keytoss.com/parse.php5?term="),
10 'google':$L("www.google.com/m/search?client=ms-palm-webOS&channel=iss&q="),
11 'wikipedia':$L("http://en.m.wikipedia.org/wiki/Special:Search?search="),
12 'twitter': $L("http://search.twitter.com/search?q=")
13@@ -1656,6 +1657,7 @@ GlobalSearchAssistant = Class.create({
14 this.expandedSearchDrawer.showExpanded = false;
15 this.controller.modelChanged(this.expandedSearchDrawer);
16 this.searchApps.clear();
17+ $('keytoss').removeClassName('selected');
18 $('google').removeClassName('selected');
19 $('map').removeClassName('selected');
20 $('wikipedia').removeClassName('selected');
21@@ -1761,6 +1763,7 @@ GlobalSearchAssistant = Class.create({
22 }
23 //clear search':
24 $('google').removeClassName('palm-focus');
25+ $('keytoss').removeClassName('palm-focus');
26 $('web').removeClassName('palm-focus');
27 },
28 highlightSelection: function() {
29@@ -1819,19 +1822,23 @@ GlobalSearchAssistant = Class.create({
30 break;
31 case 'search':
32 if (this.webDrawer.showWeb == true) {
33- $('google').removeClassName('palm-focus');
34+ //$('google').removeClassName('palm-focus');
35+ $('keytoss').removeClassName('palm-focus');
36 $('web').addClassName('palm-focus');
37 this.highlightTarget = $('web');
38 }
39 else if(this.expandedSearchDrawer.showExpanded == true){
40- $('google').addClassName('palm-focus');
41+ //$('google').addClassName('palm-focus');
42+ $('keytoss').addClassName('palm-focus');
43 $('web').removeClassName('palm-focus');
44- this.highlightTarget = $('google');
45+ //this.highlightTarget = $('google');
46+ this.highlightTarget = $('keytoss');
47 }
48 break;
49 }
50 if (this.enterKeyActionItem != "search") {
51 $('google').removeClassName('palm-focus');
52+ $('keytoss').removeClassName('palm-focus');
53 $('web').removeClassName('palm-focus');
54 }
55 },
56@@ -1923,7 +1930,8 @@ GlobalSearchAssistant = Class.create({
57 if (this.webDrawer.showWeb == true)
58 this.launchBrowser(this.currentFilter);
59 else {
60- this.launchBrowser(this.URLs['google'] + encodeURIComponent(this.currentFilter));
61+ //this.launchBrowser(this.URLs['google'] + encodeURIComponent(this.currentFilter));
62+ this.launchBrowser(this.URLs['keytoss'] + encodeURIComponent(this.currentFilter));
63 }
64 break;
65 }
66diff --git a/usr/lib/luna/system/luna-applauncher/app/views/global-search/expanded-searches-div.html b/usr/lib/luna/system/luna-applauncher/app/views/global-search/expanded-searches-div.html
67index 7bfc200..00cc1cc 100644
68--- a/usr/lib/luna/system/luna-applauncher/app/views/global-search/expanded-searches-div.html
69+++ b/usr/lib/luna/system/luna-applauncher/app/views/global-search/expanded-searches-div.html
70@@ -9,6 +9,11 @@
71 </div>
72
73 <div id='expanded_searches_drawer' x-mojo-element="Drawer">
74+ <div class="palm-row" id="keytoss" name="search-identifier" x-mojo-tap-highlight="persistent">
75+ <div class="palm-row-wrapper">
76+ <div class="search-keytoss"></div>
77+ </div>
78+ </div>
79 <div class="palm-row" id="google" name="search-identifier" x-mojo-tap-highlight="persistent">
80 <div class="palm-row-wrapper">
81 <div class="search-google"></div>
82diff --git a/usr/lib/luna/system/luna-applauncher/stylesheets/global-search.css b/usr/lib/luna/system/luna-applauncher/stylesheets/global-search.css
83index 1f10209..5887f9c 100644
84--- a/usr/lib/luna/system/luna-applauncher/stylesheets/global-search.css
85+++ b/usr/lib/luna/system/luna-applauncher/stylesheets/global-search.css
86@@ -119,6 +119,12 @@ Copyright 2009 Palm, Inc. All rights reserved.
87 background: url(../images/search-add.png) center center no-repeat;
88 }
89
90+.palm-group.search .search-keytoss {
91+ width: 100%;
92+ height: 52px;
93+ background: url(../images/search-keytoss.png) center center no-repeat;
94+}
95+
96 .palm-group.search .search-google {
97 width: 100%;
98 height: 52px;
99diff --git a/usr/palm/applications/com.palm.app.browser/app/controllers/urlsearch-controller.js b/usr/palm/applications/com.palm.app.browser/app/controllers/urlsearch-controller.js
100index 986f0bb..61d4d0c 100644
101--- a/usr/palm/applications/com.palm.app.browser/app/controllers/urlsearch-controller.js
102+++ b/usr/palm/applications/com.palm.app.browser/app/controllers/urlsearch-controller.js
103@@ -58,6 +58,12 @@ function UrlSearchController(controller){
104
105 // Our search providers
106 UrlSearchController.SearchProviders = {
107+ keytoss: {
108+ searchTitle: $L('Search KeyToss'),
109+ searchTemplate: $L('KeyToss "#{search}"'),
110+ urlTemplate: $L('http://pre.keytoss.com/parse.php5?term=#{query}')
111+ },
112+
113 google: {
114 searchTitle: $L('Search Google'),
115 searchTemplate: $L('Google "#{search}"'),
116@@ -218,14 +224,18 @@ UrlSearchController.prototype._addStockSearchItems = function(searchText, withDi
117 this.urlSearchListModel.unshift(item);
118
119 // Google block....
120- url = UrlSearchController.SearchProviders.google.urlTemplate.interpolate({query: encodedUriComponent});
121- title = UrlSearchController.SearchProviders.google.searchTemplate.interpolate({search: escapedSearchText});
122+ //url = UrlSearchController.SearchProviders.google.urlTemplate.interpolate({query: encodedUriComponent});
123+ //title = UrlSearchController.SearchProviders.google.searchTemplate.interpolate({search: escapedSearchText});
124+ url = UrlSearchController.SearchProviders.keytoss.urlTemplate.interpolate({query: encodedUriComponent});
125+ title = UrlSearchController.SearchProviders.keytoss.searchTemplate.interpolate({search: escapedSearchText});
126
127 item = new UrlReference(url, title);
128- item.subTitle = UrlSearchController.SearchProviders.google.searchTitle;
129+ //item.subTitle = UrlSearchController.SearchProviders.google.searchTitle;
130+ item.subTitle = UrlSearchController.SearchProviders.keytoss.searchTitle;
131 item.iconclass = 'search-image';
132 item.rowclass = 'search first';
133- item.iconUrl = Mojo.appPath + 'images/list-icon-google.png';
134+ //item.iconUrl = Mojo.appPath + 'images/list-icon-google.png';
135+ item.iconUrl = Mojo.appPath + 'images/list-icon-keytoss.png';
136
137 this.urlSearchListModel.unshift(item);
138
139@@ -382,7 +392,8 @@ UrlSearchController.prototype._handleSelection = function(event) {
140
141 UrlSearchController.formatDefaultSearchUrl = function(query) {
142
143- return UrlSearchController.SearchProviders.google.urlTemplate.interpolate({query: encodeURIComponent(query)});
144+ //return UrlSearchController.SearchProviders.google.urlTemplate.interpolate({query: encodeURIComponent(query)});
145+ return UrlSearchController.SearchProviders.keytoss.urlTemplate.interpolate({query: encodeURIComponent(query)});
146 };
147
148 /**
  
1Index: /usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2===================================================================
3--- .orig/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ /usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -817,6 +817,8 @@ handletelephonyNotifications: function(p
6 this.callForwardNotificationSession = null;
7 }
8 }
9+ var stageController = Mojo.Controller.getAppController().getStageProxy("DeviceMenu");
10+ stageController.delegateToSceneAssistant("updatePhone");
11 }
12 else if (payload.eventNetwork && this.phoneRadioState) {
13 var networkMsg = payload.eventNetwork;
14@@ -2647,6 +2649,10 @@ getCurrentWiFiState: function() {
15 return this.wifiState;
16 },
17
18+getCurrentPhoneState: function() {
19+ return this.phoneRadioState;
20+},
21+
22 setDeviceMenuAssistant: function(menuassistant) {
23 this.deviceMenuAssistant = menuassistant;
24 },
25Index: /usr/lib/luna/system/luna-systemui/app/controllers/devicemenu-assistant.js
26===================================================================
27--- .orig/usr/lib/luna/system/luna-systemui/app/controllers/devicemenu-assistant.js
28+++ /usr/lib/luna/system/luna-systemui/app/controllers/devicemenu-assistant.js
29@@ -1,6 +1,6 @@
30 /* Copyright 2009 Palm, Inc. All rights reserved. */
31
32-var RadioState = new Hash({wifi: undefined, bluetooth: undefined});
33+var RadioState = new Hash({wifi: undefined, bluetooth: undefined, phone: undefined});
34
35 var DevicemenuAssistant = Class.create({
36
37@@ -39,6 +39,8 @@ var DevicemenuAssistant = Class.create({
38 this.drawerModel = {myOpenProperty:false};
39 this.controller.setupWidget('wifidetails', {modelProperty:'myOpenProperty'}, this.drawerModel);
40 this.controller.setupWidget('btdetails', {modelProperty:'myOpenProperty'}, this.drawerModel);
41+ this.controller.setupWidget('phonedetails', {modelProperty:'myOpenProperty'}, this.drawerModel);
42+ this.phonedrawer = this.controller.get('phonedetails')
43 this.wifidrawer = this.controller.get('wifidetails');
44 this.btdrawer = this.controller.get('btdetails');
45
46@@ -95,6 +97,17 @@ var DevicemenuAssistant = Class.create({
47 else
48 this.controller.get('wifimsg').innerHTML = wifistate.escapeHTML();
49 }
50+
51+ var phonestate = this.barAssistant.getCurrentPhoneState();
52+ if(phonestate === 'Off') {
53+ this.controller.get('phonemsg').innerHTML = $L('Off');
54+ RadioState.set('phone',false);
55+ }
56+ else {
57+ this.controller.get('phonemsg').innerHTML = $L('On');
58+ RadioState.set('phone',true);
59+ }
60+
61 this.controller.listen(this.controller.document, Mojo.Event.deactivate, this.close.bindAsEventListener(this));
62 this.isVisible = true;
63
64@@ -118,6 +131,8 @@ var DevicemenuAssistant = Class.create({
65 this.controller.get('btlist').addEventListener(Mojo.Event.listTap,this.handleBTTap.bindAsEventListener(this));
66 this.controller.get('dm_wifi').addEventListener(Mojo.Event.tap, this.togglewifiList.bindAsEventListener(this));
67 this.controller.get('dm_bluetooth').addEventListener(Mojo.Event.tap, this.togglebluetoothList.bindAsEventListener(this));
68+ this.controller.get('dm_phone').addEventListener(Mojo.Event.tap, this.togglePhoneList.bindAsEventListener(this));
69+ this.controller.get('phone_radio').addEventListener(Mojo.Event.tap, this.togglePhoneRadio.bindAsEventListener(this));
70 this.controller.get('wifi_radio').addEventListener(Mojo.Event.tap, this.toggleWifiRadio.bindAsEventListener(this));
71 this.controller.get('bt_radio').addEventListener(Mojo.Event.tap, this.toggleBTRadio.bindAsEventListener(this));
72 this.controller.get('bt_pref').addEventListener(Mojo.Event.tap,this.handleBluetoothLaunch.bindAsEventListener(this));
73@@ -177,6 +192,49 @@ var DevicemenuAssistant = Class.create({
74 }
75 this.apModeInProgress = false;
76 },
77+
78+
79+ updatePhone: function() {
80+ if(this.barAssistant.getCurrentPhoneState()) {
81+ this.controller.get('phonemsg').innerHTML = $L('On');
82+ this.controller.get('phone_radio').innerHTML = $L('Turn off Phone');
83+ RadioState.set('phone', true);
84+ }
85+ else {
86+ this.controller.get('phonemsg').innerHTML = $L('Off');
87+ this.controller.get('phone_radio').innerHTML = $L('Turn on Phone');
88+ RadioState.set('phone', false);
89+ }
90+ },
91+
92+ togglePhoneRadio: function(event) {
93+ this.serviceRequest = new Mojo.Service.Request("palm://com.palm.vibrate", {
94+ method: 'vibrate', parameters: { 'period': 0,'duration': 250 }
95+ });
96+ if(RadioState.get('phone'))
97+ TelephonyService.tempPowerSet('off',false,null,null);
98+ else
99+ TelephonyService.tempPowerSet('on',false,null,null);
100+ this.toggleDeviceMenu();
101+ },
102+
103+ togglePhoneList: function(event) {
104+ if(this.apModeInProgress)
105+ return;
106+
107+ if (this.phonedrawer.mojo.getOpenState()) {
108+ this.controller.hideWidgetContainer(this.controller.get('phonedetails'));
109+ }
110+ else {
111+ if(RadioState.get('phone'))
112+ this.controller.get('phone_radio').innerHTML = $L('Turn off Phone');
113+ else
114+ this.controller.get('phone_radio').innerHTML = $L('Turn on Phone');
115+
116+ this.controller.showWidgetContainer(this.controller.get('phonedetails'));
117+ }
118+ this.phonedrawer.mojo.setOpenState(!this.phonedrawer.mojo.getOpenState());
119+ },
120
121 toggleBTRadio: function(event) {
122 if(RadioState.get('bluetooth')) {
123@@ -891,6 +949,10 @@ var DevicemenuAssistant = Class.create({
124
125 close: function() {
126
127+ if(this.phonedrawer.mojo.getOpenState()) {
128+ this.controller.hideWidgetContainer(this.controller.get('phonedetails'));
129+ this.phonedrawer.mojo.setOpenState(false);
130+ }
131 if (this.btdrawer.mojo.getOpenState()) {
132 this.clearBTList();
133 this.controller.hideWidgetContainer(this.controller.get('btdetails'));
134Index: /usr/lib/luna/system/luna-systemui/app/views/devicemenu/devicemenu-scene.html
135===================================================================
136--- .orig/usr/lib/luna/system/luna-systemui/app/views/devicemenu/devicemenu-scene.html
137+++ /usr/lib/luna/system/luna-systemui/app/views/devicemenu/devicemenu-scene.html
138@@ -94,6 +94,22 @@
139
140 <div class="palm-section-divider"></div>
141
142+ <div class="palm-row" id="dm_phone" x-mojo-tap-highlight='momentary'><div class="palm-row-wrapper">
143+ <div class="title truncating-text">
144+ <div class="label right" id="phonemsg">&nbsp;</div>
145+ <span x-mojo-loc=''>Phone</span>
146+ </div>
147+ </div></div>
148+
149+ <div id='phonedetails' x-mojo-element="Drawer">
150+ <div class="palm-row first" x-mojo-tap-highlight='momentary'><div class="palm-row-wrapper">
151+ <div id="phone_radio" class="title truncating-text">
152+ </div>
153+ </div></div>
154+ </div>
155+
156+ <div class="palm-section-divider"></div>
157+
158 <div id="dm_airplanemode" class="palm-row last menu-end" x-mojo-tap-highlight='momentary'><div class="palm-row-wrapper">
159 <div id="dm_airplanemode_status" class="title truncating-text">
160 </div>
  
1While ssh'd into a pre that's suspended, powerd spams all users with messages
2every second or so. This patch silences those.
3
4Index: /usr/sbin/suspend_action
5===================================================================
6--- .orig/usr/sbin/suspend_action
7+++ /usr/sbin/suspend_action
8@@ -1,9 +1,9 @@
9 #!/bin/sh
10
11-echo -e "powerd: System going to sleep now\n" | wall
12+# echo -e "powerd: System going to sleep now\n" | wall
13
14 # Initiate suspend
15 echo mem > /sys/power/state
16
17-echo -e "powerd: System woke up.\n" | wall
18+# echo -e "powerd: System woke up.\n" | wall
19
  
1show-actual-battery-percent
2
3Tested-On: 1.1
4
5//show actual battery percent in the system user interface.
6//note: battery @ 100% will only charge on a new charge event or if power is <94%
7Index: /usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
8===================================================================
9--- .orig/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
10+++ /usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
11@@ -1382,11 +1382,11 @@ handlePowerNotifications: function(paylo
12
13 Mojo.Log.info("SystemUI Power Payload "+ Object.toJSON(payload));
14 // Is the battery level provided?
15- if (payload.percent_ui != undefined) {
16+ if (payload.percent != undefined) {
17 //Save the Battery Percentage
18- this.batteryLevel = payload.percent_ui;
19+ this.batteryLevel = payload.percent;
20 for (var i = 0; i < this.powerIndicator.length; i++) {
21- if (payload.percent_ui > this.powerIndicator[i])
22+ if (payload.percent > this.powerIndicator[i])
23 continue;
24 this.lastBatteryLevel = i;
25 this.lastBatteryLevelPayload = payload;
26@@ -1397,7 +1397,7 @@ handlePowerNotifications: function(paylo
27 $('power').className = 'battery-' + i;
28
29 //Show Banner Message if the Battery level is below 20%
30- var batteryalert = $L("#{percent_ui}% battery remaining").interpolate(payload);
31+ var batteryalert = $L("#{percent}% battery remaining").interpolate(payload);
32 if(this.batteryLevel <= 5 && !this.batteryLevel5Shown) {
33 this.batteryLevel5Shown = true;
34 this.showLowBatteryAlert();
35@@ -1423,7 +1423,7 @@ handlePowerNotifications: function(paylo
36 }
37 else {
38 Mojo.Log.info("SystemUI- Is Charging "+ this.isCharging );
39- if(payload.percent_ui == 100)
40+ if(payload.percent == 100)
41 $('power').className = 'battery-charged';
42 else
43 $('power').className = 'battery-charging-' + i;
  
15X4 Launcher page for webOS 1.2.1
2Index: /usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
3===================================================================
4--- .orig/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
5+++ /usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
6@@ -10,7 +10,7 @@ var LauncherAssistant = Class.create({
7 */
8 kQuickLaunchHeight: 67,
9
10- kPageIndicatorSpacing: 6, /* spacing between each page indicator */
11+ kPageIndicatorSpacing: 1, /* spacing between each page indicator */
12 kPageMargin: 10, /* 10 pixel margin on each side of a page */
13 kPageWidthNoMargin: NaN,
14 kPageWidth: NaN,
15@@ -324,9 +324,9 @@ var LauncherAssistant = Class.create({
16 var newAppDiv = $(newAppInfo.launchPointId);
17 Mojo.assert(newAppDiv !== undefined, "Application (%d) was inserted into the DOM but unable to be retrieved!", newAppInfo.launchPointId);
18 if (isNaN(this.kAppWidth) || isNaN(this.kAppHeight)) {
19- this.kAppWidth = newAppDiv.getWidth();
20- this.kAppHeight = newAppDiv.getHeight();
21- this.kAppsPerRow = Math.round(this.kPageWidthNoMargin / this.kAppWidth);
22+ this.kAppWidth = 64;
23+ this.kAppHeight = 85;
24+ this.kAppsPerRow = 5;
25 }
26
27 Mojo.listen(newAppDiv, Mojo.Event.tap, this.onAppTapped.bindAsEventListener(this));
28@@ -439,7 +439,7 @@ var LauncherAssistant = Class.create({
29 /* determines the position of an app element at appIndex within a page */
30 calculateAppPosition: function(appIndex) {
31 return {
32- left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) + this.kPageMargin),
33+ left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) - 18),
34 top: (Math.floor(appIndex/this.kAppsPerRow) * this.kAppHeight)
35 };
36 },
37Index: /usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
38===================================================================
39--- .orig/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
40+++ /usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
41@@ -121,8 +121,9 @@ body.palm-default
42
43 .launcher_page .name {
44 position:absolute;
45- top: 68px;
46- width:100px;
47+ top: 48px;
48+ left:20px;
49+ width:65px;
50 height: 34px;
51 max-height: 34px;
52 clear:both;
53@@ -130,7 +131,7 @@ body.palm-default
54 color:white;
55 text-align:center;
56 font-weight:bold;
57- font-size: 14px;
58+ font-size: 12px;
59 overflow: hidden;
60 text-overflow: ellipsis;
61 z-index:5;
62@@ -164,8 +165,8 @@ body.palm-default
63 }
64
65 .draggable {
66- width:64px;
67- height:64px;
68+ width:48px;
69+ height:48px;
70 margin: 0 auto;
71 -webkit-user-drag: any;
72 -webkit-user-select: none;
73@@ -213,8 +214,8 @@ body.palm-default
74
75 #app-icon {
76 float:left;
77- width:64px;
78- height:64px;
79+ width:32px;
80+ height:32px;
81 background: center center no-repeat;
82 }
83
  
1More icons per row with reduced margins and increase space between columns
2
3Updated for 1.2
4
5Variation by StoneRyno of the original patch
6
7Index: /usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
8===================================================================
9--- .orig/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
10+++ /usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
11@@ -10,7 +10,7 @@ var LauncherAssistant = Class.create({
12 */
13 kQuickLaunchHeight: 67,
14
15- kPageIndicatorSpacing: 6, /* spacing between each page indicator */
16+ kPageIndicatorSpacing: 1, /* spacing between each page indicator */
17 kPageMargin: 10, /* 10 pixel margin on each side of a page */
18 kPageWidthNoMargin: NaN,
19 kPageWidth: NaN,
20@@ -324,9 +324,9 @@ var LauncherAssistant = Class.create({
21 var newAppDiv = $(newAppInfo.launchPointId);
22 Mojo.assert(newAppDiv !== undefined, "Application (%d) was inserted into the DOM but unable to be retrieved!", newAppInfo.launchPointId);
23 if (isNaN(this.kAppWidth) || isNaN(this.kAppHeight)) {
24- this.kAppWidth = newAppDiv.getWidth();
25- this.kAppHeight = newAppDiv.getHeight();
26- this.kAppsPerRow = Math.round(this.kPageWidthNoMargin / this.kAppWidth);
27+ this.kAppWidth = 64;
28+ this.kAppHeight = 90;
29+ this.kAppsPerRow = 5;
30 }
31
32 Mojo.listen(newAppDiv, Mojo.Event.tap, this.onAppTapped.bindAsEventListener(this));
33@@ -439,7 +439,7 @@ var LauncherAssistant = Class.create({
34 /* determines the position of an app element at appIndex within a page */
35 calculateAppPosition: function(appIndex) {
36 return {
37- left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) + this.kPageMargin),
38+ left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) - 18),
39 top: (Math.floor(appIndex/this.kAppsPerRow) * this.kAppHeight)
40 };
41 },
42Index: /usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
43===================================================================
44--- .orig/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
45+++ /usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
46@@ -121,7 +121,7 @@ body.palm-default
47
48 .launcher_page .name {
49 position:absolute;
50- top: 68px;
51+ top: 48px;
52 width:100px;
53 height: 34px;
54 max-height: 34px;
55@@ -130,7 +130,7 @@ body.palm-default
56 color:white;
57 text-align:center;
58 font-weight:bold;
59- font-size: 14px;
60+ font-size: 9px;
61 overflow: hidden;
62 text-overflow: ellipsis;
63 z-index:5;
64@@ -164,8 +164,8 @@ body.palm-default
65 }
66
67 .draggable {
68- width:64px;
69- height:64px;
70+ width:48px;
71+ height:48px;
72 margin: 0 auto;
73 -webkit-user-drag: any;
74 -webkit-user-select: none;
75@@ -213,8 +213,8 @@ body.palm-default
76
77 #app-icon {
78 float:left;
79- width:64px;
80- height:64px;
81+ width:32px;
82+ height:32px;
83 background: center center no-repeat;
84 }
85
  
14X4 Launcher page for webOS 1.2.0
2diff --git a/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js b/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
3index 4da3e85..48fc720 100644
4--- a/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
5+++ b/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
6@@ -10,7 +10,7 @@ var LauncherAssistant = Class.create({
7 */
8 kQuickLaunchHeight: 67,
9
10- kPageIndicatorSpacing: 6, /* spacing between each page indicator */
11+ kPageIndicatorSpacing: 1, /* spacing between each page indicator */
12 kPageMargin: 10, /* 10 pixel margin on each side of a page */
13 kPageWidthNoMargin: NaN,
14 kPageWidth: NaN,
15@@ -324,9 +324,9 @@ var LauncherAssistant = Class.create({
16 var newAppDiv = $(newAppInfo.launchPointId);
17 Mojo.assert(newAppDiv !== undefined, "Application (%d) was inserted into the DOM but unable to be retrieved!", newAppInfo.launchPointId);
18 if (isNaN(this.kAppWidth) || isNaN(this.kAppHeight)) {
19- this.kAppWidth = newAppDiv.getWidth();
20- this.kAppHeight = newAppDiv.getHeight();
21- this.kAppsPerRow = Math.round(this.kPageWidthNoMargin / this.kAppWidth);
22+ this.kAppWidth = 80;
23+ this.kAppHeight = 85;
24+ this.kAppsPerRow = 4;
25 }
26
27 Mojo.listen(newAppDiv, Mojo.Event.tap, this.onAppTapped.bindAsEventListener(this));
28@@ -439,7 +439,7 @@ var LauncherAssistant = Class.create({
29 /* determines the position of an app element at appIndex within a page */
30 calculateAppPosition: function(appIndex) {
31 return {
32- left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) + this.kPageMargin),
33+ left: (((appIndex % this.kAppsPerRow) * this.kAppWidth) - 10),
34 top: (Math.floor(appIndex/this.kAppsPerRow) * this.kAppHeight)
35 };
36 },
37diff --git a/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css b/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
38index b1244af..61ea830 100644
39--- a/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
40+++ b/usr/lib/luna/system/luna-applauncher/stylesheets/launcher.css
41@@ -121,8 +121,9 @@ body.palm-default
42
43 .launcher_page .name {
44 position:absolute;
45- top: 68px;
46- width:100px;
47+ top: 48px;
48+ left:9px;
49+ width:80px;
50 height: 34px;
51 max-height: 34px;
52 clear:both;
53@@ -130,7 +131,7 @@ body.palm-default
54 color:white;
55 text-align:center;
56 font-weight:bold;
57- font-size: 14px;
58+ font-size: 12px;
59 overflow: hidden;
60 text-overflow: ellipsis;
61 z-index:5;
62@@ -164,8 +165,8 @@ body.palm-default
63 }
64
65 .draggable {
66- width:64px;
67- height:64px;
68+ width:48px;
69+ height:48px;
70 margin: 0 auto;
71 -webkit-user-drag: any;
72 -webkit-user-select: none;
73@@ -213,8 +214,8 @@ body.palm-default
74
75 #app-icon {
76 float:left;
77- width:64px;
78- height:64px;
79+ width:32px;
80+ height:32px;
81 background: center center no-repeat;
82 }
  
1While ssh'd into a pre that's suspended, powerd spams all users with messages
2every second or so. This patch silences those.
3
4Index: /usr/sbin/suspend_action
5===================================================================
6--- .orig/usr/sbin/suspend_action
7+++ /usr/sbin/suspend_action
8@@ -1,9 +1,9 @@
9 #!/bin/sh
10
11-echo -e "powerd: System going to sleep now\n" | wall
12+# echo -e "powerd: System going to sleep now\n" | wall
13
14 # Initiate suspend
15 echo mem > /sys/power/state
16
17-echo -e "powerd: System woke up.\n" | wall
18+# echo -e "powerd: System woke up.\n" | wall
19
  
1diff --git a/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js b/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
2index 64244b6..e68c9d2 100644
3--- a/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
4+++ b/usr/lib/luna/system/luna-applauncher/app/controllers/launcher-assistant.js
5@@ -157,6 +157,10 @@ var LauncherAssistant = Class.create({
6
7 /* keep track of which page we are on */
8 onPageChange: function(event) {
9+ var scroller = this.getPageScroller(this.activePageIndex);
10+ if (scroller && scroller.mojo) {
11+ scroller.mojo.revealTop(0);
12+ }
13 this.activePageIndex = event.value;
14 this.updatePageIndicators();
15 },
  
1show-actual-battery-percent
2
3Tested-On: 1.1
4
5//show actual battery percent in the system user interface.
6//note: battery @ 100% will only charge on a new charge event or if power is <94%
7Index: /usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
8===================================================================
9--- .orig/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
10+++ /usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
11@@ -1382,11 +1382,11 @@ handlePowerNotifications: function(paylo
12
13 Mojo.Log.info("SystemUI Power Payload "+ Object.toJSON(payload));
14 // Is the battery level provided?
15- if (payload.percent_ui != undefined) {
16+ if (payload.percent != undefined) {
17 //Save the Battery Percentage
18- this.batteryLevel = payload.percent_ui;
19+ this.batteryLevel = payload.percent;
20 for (var i = 0; i < this.powerIndicator.length; i++) {
21- if (payload.percent_ui > this.powerIndicator[i])
22+ if (payload.percent > this.powerIndicator[i])
23 continue;
24 this.lastBatteryLevel = i;
25 this.lastBatteryLevelPayload = payload;
26@@ -1397,7 +1397,7 @@ handlePowerNotifications: function(paylo
27 $('power').className = 'battery-' + i;
28
29 //Show Banner Message if the Battery level is below 20%
30- var batteryalert = $L("#{percent_ui}% battery remaining").interpolate(payload);
31+ var batteryalert = $L("#{percent}% battery remaining").interpolate(payload);
32 if(this.batteryLevel <= 5 && !this.batteryLevel5Shown) {
33 this.batteryLevel5Shown = true;
34 this.showLowBatteryAlert();
35@@ -1423,7 +1423,7 @@ handlePowerNotifications: function(paylo
36 }
37 else {
38 Mojo.Log.info("SystemUI- Is Charging "+ this.isCharging );
39- if(payload.percent_ui == 100)
40+ if(payload.percent == 100)
41 $('power').className = 'battery-charged';
42 else
43 $('power').className = 'battery-charging-' + i;
  
1diff --git a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2index f343ce2..c7f389b 100644
3--- a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -1479,7 +1479,7 @@ handlePowerNotifications: function(payload) {
6 this.controller.showBanner({
7 messageText: batteryalert,
8 icon: "/usr/lib/luna/system/luna-systemui/images/notification-small-charging.png",
9- soundClass: soundClassName
10+ soundClass: "vibrate"
11 },null, 'chargingAlert');
12 }
13 this.chargingBannerShown = true;
  
1Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -2013,7 +2013,7 @@ var ChatviewAssistant = Class.create({
6 attachFilePicker: function(event){
7 var params = {
8 actionType: 'attach',
9- kinds: ['image'], // TODO: integrate other media types
10+ kinds: ['image','audio','video'], // TODO: integrate other media types
11 defaultKind: 'image',
12 onSelect: this.handleFilePickerSelect.bind(this)
13 };
14Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
15===================================================================
16--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
17+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
18@@ -324,7 +324,7 @@ var ComposeAssistant = Class.create({
19 attachFilePicker: function(event) {
20 var params = {
21 actionType: 'attach',
22- kinds: ['image'], // TODO: integrate other media types
23+ kinds: ['image','audio','video'], // TODO: integrate other media types
24 defaultKind: 'image',
25 onSelect: this.handleFilePickerSelect.bind(this)
26 };
  
1diff -ur /usr/palm/app-original/com.palm.app.messaging/app/controllers/chatview-assistant.js /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2--- /usr/palm/app-original/com.palm.app.messaging/app/controllers/chatview-assistant.js 2009-09-13 23:09:56.000000000 -0500
3+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js 2009-09-28 15:29:40.000000000 -0500
4@@ -187,6 +187,11 @@
5 segmentCountContainer: this.controller.get('segmentCounterContainer'),
6 segmentCountElement: this.controller.get('segmentCounter'),
7 setTextFieldValueFn: this.setTextFieldValue.bind(this)
8+ },
9+ charCounter: {
10+ charCountContainer: this.controller.get('charCounterContainer'),
11+ charCountElement: this.controller.get('charCounter'),
12+ setTextFieldValueFn: this.setTextFieldValue.bind(this)
13 }
14 };
15
16diff -ur /usr/palm/app-original/com.palm.app.messaging/app/controllers/compose-assistant.js /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
17--- /usr/palm/app-original/com.palm.app.messaging/app/controllers/compose-assistant.js 2009-09-13 23:09:56.000000000 -0500
18+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js 2009-09-28 15:30:36.000000000 -0500
19@@ -140,6 +140,11 @@
20 segmentCountContainer: this.controller.get('segmentCounterContainer'),
21 segmentCountElement: this.controller.get('segmentCounter'),
22 setTextFieldValueFn: this.setTextFieldValue.bind(this)
23+ },
24+ charCounter: {
25+ charCountContainer: this.controller.get('charCounterContainer'),
26+ charCountElement: this.controller.get('charCounter'),
27+ setTextFieldValueFn: this.setTextFieldValue.bind(this)
28 }
29 };
30
31diff -ur /usr/palm/app-original/com.palm.app.messaging/app/utilities/CharacterCounter.js /usr/palm/applications/com.palm.app.messaging/app/utilities/CharacterCounter.js
32--- /usr/palm/app-original/com.palm.app.messaging/app/utilities/CharacterCounter.js 2009-09-13 23:09:56.000000000 -0500
33+++ /usr/palm/applications/com.palm.app.messaging/app/utilities/CharacterCounter.js 2009-09-28 15:34:44.000000000 -0500
34@@ -58,6 +58,10 @@
35 containerElement: null,
36 valueElement: null
37 };
38+ var charCounterUI = {
39+ containerElement: null,
40+ valueElement: null
41+ };
42
43
44 // TODO: eventually we might want to implement some cleverness that counts
45@@ -291,6 +295,20 @@
46 }
47 };
48
49+ var setCurrentCharCount = function(newCharCount) {
50+ if(charCounterUI.valueElement)
51+ charCounterUI.valueElement.update(newCharCount);
52+ if(charCounterUI.containerElement) {
53+ if (newCharCount == 0) {
54+ if (charCounterUI.containerElement.visible())
55+ charCounterUI.containerElement.hide();
56+ } else {
57+ if (!charCounterUI.containerElement.visible())
58+ charCounterUI.containerElement.show();
59+ }
60+ }
61+ };
62+
63 return {
64
65 init: function(controller,platform,textElement,params) {
66@@ -451,7 +469,13 @@
67 setTextFieldValueFn = params.segmentCounter.setTextFieldValueFn;
68 }
69 }
70-
71+ if(params.charCounter) {
72+ charCounterUI.containerElement = params.charCounter.charCountContainer;
73+ charCounterUI.valueElement = params.charCounter.charCountElement;
74+ if(params.charCounter.setTextFieldValueFn) {
75+ setTextFieldValueFn = params.charCounter.setTextFieldValueFn;
76+ }
77+ }
78 }
79 },
80
81@@ -517,6 +541,7 @@
82
83 var messageData = parseMessage(rawCharacterData.message,rawCharacterData.count,true);
84 adjustedCharacterCount = messageData.adjustedCharacterCount;
85+ setCurrentCharCount(rawCharacterData.count);
86 if (adjustedMaxLen > 0)
87 setOverLimit(messageData.isOverLimit);
88 setCurrentSegmentCount(messageData.segmentCount);
89diff -ur /usr/palm/app-original/com.palm.app.messaging/app/views/chatview/chatview-scene.html /usr/palm/applications/com.palm.app.messaging/app/views/chatview/chatview-scene.html
90--- /usr/palm/app-original/com.palm.app.messaging/app/views/chatview/chatview-scene.html 2009-09-13 23:09:57.000000000 -0500
91+++ /usr/palm/applications/com.palm.app.messaging/app/views/chatview/chatview-scene.html 2009-09-28 15:35:16.000000000 -0500
92@@ -22,6 +22,10 @@
93 <div id="messageContainer" class='palm-row'>
94 <div class="palm-row-wrapper textfield-group focused">
95 <div class="title">
96+ <div id="charCounterContainer" style="display: none;">
97+ <div id="charCounter">
98+ </div>
99+ </div>
100 <div id="attachmentContainer" style="display: none;">
101 <div id="cancelAttachment">
102 </div>
103diff -ur /usr/palm/app-original/com.palm.app.messaging/app/views/compose/compose-scene.html /usr/palm/applications/com.palm.app.messaging/app/views/compose/compose-scene.html
104--- /usr/palm/app-original/com.palm.app.messaging/app/views/compose/compose-scene.html 2009-09-13 23:09:57.000000000 -0500
105+++ /usr/palm/applications/com.palm.app.messaging/app/views/compose/compose-scene.html 2009-09-28 15:36:15.000000000 -0500
106@@ -6,6 +6,10 @@
107 <div id="messageContainer" class='palm-row'>
108 <div class="palm-row-wrapper textfield-group focused">
109 <div class="title">
110+ <div id="charCounterContainer" style="display: none;">
111+ <div id="charCounter">
112+ </div>
113+ </div>
114 <div id="attachmentContainer" style="display: none;">
115 <div id="cancelAttachment">
116 </div>
117diff -ur /usr/palm/app-original/com.palm.app.messaging/stylesheets/messaging.css /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
118--- /usr/palm/app-original/com.palm.app.messaging/stylesheets/messaging.css 2009-09-13 23:10:04.000000000 -0500
119+++ /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css 2009-09-28 15:37:25.000000000 -0500
120@@ -837,6 +837,23 @@
121 #messageContainer.palm-row .icon.right {
122 height: 61px;
123 }
124+#messageContainer #charCounterContainer {
125+ line-height: 20px;
126+ display:block;
127+ height: 20px;
128+ border-width: 0px 10px 0px 9px;
129+ -webkit-border-image: url(../images/message-segment-badge.png) 0 10 0 9 stretch stretch;
130+ position: absolute;
131+ z-index: 3;
132+ top: 2px;
133+ left: 2px;
134+}
135+#messageContainer #charCounterContainer #charCounter {
136+ font-size: 12px;
137+ font-weight: bold;
138+ color: #679BC2;
139+ margin: 0px -4px 3px -3px;
140+}
141 #messageContainer #attachmentContainer {
142 position: relative;
143 margin-top:10px;
  
1Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -1245,6 +1245,11 @@ var ChatviewAssistant = Class.create({
6 var d = new Date();
7 d.setTime(msg.deviceTimeStamp);
8 msg.niceDate = BucketDateFormatter.getDateBucket(d,true,true); // this used to use msg.timeStamp - changed 2008-11-05
9+
10+ // timestamp hack - enables timestamps on all messages
11+ var ts = new Date();
12+ ts.setTime(msg.deviceTimeStamp);
13+ msg.timeStampText = Mojo.Format.formatDate(ts,'short');
14
15 // divider hack - round to the nearest 5 minutes
16 // we have to do this because the list divider implementation does not allow a divider
17@@ -1252,11 +1257,11 @@ var ChatviewAssistant = Class.create({
18 var deviceTimeStampMinutes = d.getMinutes();
19 d.setMinutes((deviceTimeStampMinutes - (deviceTimeStampMinutes % 5)));
20 d.setSeconds(0);
21- msg.dividerText = msg.transportClass + BucketDateFormatter.getDateBucket(d,true,true);
22+ msg.dividerText = msg.transportClass; // + BucketDateFormatter.getDateBucket(d,true,true);
23
24 // if the INCOMING message was sent longer than 10 minutes before it arrived on device,
25 // add sent date to indicate that this delay happened
26- if(!ChatFlags.isOutgoing(msg.flags) && msg.deviceTimeStamp && msg.timeStamp && (msg.deviceTimeStamp-msg.timeStamp) > (1000*60*10)) {
27+ // if(!ChatFlags.isOutgoing(msg.flags) && msg.deviceTimeStamp && msg.timeStamp && (msg.deviceTimeStamp-msg.timeStamp) > (1000*60*10)) { // timestamp fix var d = new Date();
28 var d = new Date();
29 var today = d.getTime();
30 d.setTime(msg.timeStamp);
31@@ -1264,10 +1269,10 @@ var ChatviewAssistant = Class.create({
32
33 // Only show the message sent time if it is less than two days old
34 // from when it arrived on device
35- if(today-msg.timeStamp <= (1000*60*60*24*2)) {
36- msg.timeStampDeltaMsg = new Template($L("Message Sent: #{dateTime}")).evaluate({dateTime:Mojo.Format.formatDate(sentTimeStamp,'short')});
37- }
38- }
39+ // if(today-msg.timeStamp <= (1000*60*60*24*2)) { // timestamp fix
40+ msg.timeStampDeltaMsg = new Template($L("#{dateTime}")).evaluate({dateTime:Mojo.Format.formatDate(sentTimeStamp,'short')});
41+ // } // timestamp fix
42+ // } // timestamp fix
43
44 if (msg.callbackNumber) {
45 msg.callbackNumber = PalmSystem.runTextIndexer(msg.callbackNumber);
46Index: /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
47===================================================================
48--- .orig/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
49+++ /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
50@@ -681,7 +681,12 @@ img.avatar-overlay {
51 width: 40px;
52 height: 40px;
53 }
54-
55+/* timestamp formatting */
56+.timeStamp {
57+ font-size: 12px;
58+ font-style: italic;
59+ color: #1111ff;
60+ }
61 .message.status-success {
62 color: #000000;
63 }
  
1diff --git a/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js b/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
2index e4be132..688c678 100644
3--- a/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
4+++ b/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
5@@ -76,7 +76,7 @@ var ComposeAssistant = Class.create({
6
7 this.searchList = {
8 "property": "to$A",
9- "includeEmails": false,
10+ "includeEmails": true,
11 "includePhones": true,
12 "includeIMs": true,
13 "includeShortCode": true,
  
1Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
4+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
5@@ -434,7 +434,8 @@ var ListviewAssistant = Class.create(App
6 // if we are in the history view and the screen is on, do not display a banner + dashboard, just play a notification sound
7 if (this.isScreenOn) {
8 if (data.notificationType == this.Messaging.notificationTypes.newMessage && this.currentListView == this.Messaging.Views.HISTORY) {
9- data = {playSoundOnly:true};
10+ data = $H(data);
11+ data = data.merge({playSoundOnly:true});
12 }
13 }
14 return data;
15Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
16===================================================================
17--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
18+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
19@@ -346,7 +346,8 @@ var ChatviewAssistant = Class.create({
20 if(this.isScreenOn && data.chatThreadId == this.chatThreadId) {
21 Mojo.Log.info("[CV] ****** chatview considerForNotification --- screen is on!");
22 if(data.notificationType == this.Messaging.notificationTypes.newMessage) {
23- data = {playSoundOnly:true};
24+ data = $H(data);
25+ data = data.merge({playSoundOnly:true});
26 } else if( data.notificationType == this.Messaging.notificationTypes.sendFailure) {
27 data = {}; // wipe out the notification because we are in the chat
28 }
29Index: /usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
30===================================================================
31--- .orig/usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
32+++ /usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
33@@ -993,5 +993,168 @@ var MessagingMojoService = {
34 method: 'setSMSCAddressAndEmailGateway',
35 parameters: {smscAddr:address, emailGateway: gateway}
36 });
37+ },
38+
39+ isNumberValid: function(number) {
40+ return !(number === undefined
41+ || number == null
42+ || number == ""
43+ || number == "unknown"
44+ || number == "unknown caller"
45+ || number == "blocked caller")
46+ },
47+
48+ // use contacts service and carrier book to perform reverse lookup on number. stores results in passed contact object.
49+ // runs callback when done.
50+ // if the number isn't valid, marks contact lookup complete
51+ // if there's already one happening, or one already completed, just fires callback
52+ // if there's a lateCallback provided, calls that if the result comes much later
53+ rLookup: function(number, contact, callback, lateCallback){
54+
55+ //Reset contact to always get the tone
56+ contact = {};
57+ Mojo.Log.error("Current contact value: %j",contact);
58+ Mojo.Log.error("SMS ID: %j",number);
59+
60+ // bail if the number is invalid
61+ if (!(this.isNumberValid(number))) {
62+ this.finishLookup(contact, callback);
63+ return;
64+ }
65+
66+ if (contact.lookupComplete) {
67+ callback(contact);
68+ return;
69+ }
70+
71+ if (contact.lookupPending) {
72+ callback(contact);
73+ return;
74+ }
75+
76+
77+ // use contacts service to perform lookup.
78+ // if contact already has an id in it, use person lookup
79+ // instead of doing reverse lookup on number
80+ contact.lookupPending = true;
81+ var method, params;
82+ if (contact.initialId) {
83+ method = 'basicDetails'
84+ params = {'id' : contact.initialId}
85+ delete contact.initialId;
86+ } else {
87+ method = 'reverseLookup'
88+ params = {
89+ 'value': number,
90+ 'type': "phone"
91+ }
92+ }
93+ this.lastRequest = new Mojo.Service.Request('palm://com.palm.contacts', {
94+ 'method': method,
95+ parameters: params,
96+ onSuccess: this.onLookup.bind(this, number, contact, callback, lateCallback),
97+ onFailure: function() {
98+ // cancel previous lookup, so this doesn't fire on a service crash
99+ if (this.lastRequest) {
100+ this.lastRequest.cancel();
101+ this.lastRequest = undefined;
102+ }
103+
104+ this.carrierBookLookup(number,contact);
105+ this.finishLookup(contact, callback);
106+ }.bind(this)
107+ });
108+
109+ // timeout if lookup hasn't completed in 4 seconds
110+ this.lookupTimeout = setTimeout(this.onLookupTimeout.bind(this, contact, callback, lateCallback), 4000);
111+ },
112+
113+ // when contact lookup returns, check for valid result
114+ // if valid result, grab name, ringtone; if there's a picture, start loading and set callback to measure it
115+ // if no valid result, look in carrier book
116+ // fire callback when done
117+ onLookup: function(number, contact, callback, lateCallback, result){
118+ Mojo.Log.info( "PhoneApp: Contact::onLookup CALLER ID LOOKUP %s RETURNED %j" , number , result);
119+ var statusChange = "";
120+
121+ // cancel previous lookup, so this doesn't fire on a service crash
122+ if (this.lastRequest) {
123+ this.lastRequest.cancel();
124+ this.lastRequest = undefined;
125+ }
126+
127+ if (result.record) {
128+ /*
129+ // don't match if the number we get back is different than the number
130+ // we passed in (provided the lengths are the same)
131+ if (!(result.record.number)
132+ || ( (result.record.number) && ( (result.record.number.length !== number.length)
133+ || (result.record.number.length === number.length
134+ && result.record.number === number)))) {
135+ */
136+ contact.id = result.record.id;
137+
138+
139+ contact.ringtoneLoc = result.record.messagingRingtoneLoc;
140+ Mojo.Log.error("MSGTone: %j",contact.ringtoneLoc);
141+
142+ }
143+
144+ this.finishLookup(contact, callback, lateCallback);
145+ },
146+
147+
148+
149+ // mark complete; cancel timeout; fire callback if it hasn't fired yet
150+ finishLookup: function(contact, callback, lateCallback) {
151+ contact.lookupPending = false;
152+
153+ // cancel lookup timeout
154+ clearTimeout(this.lookupTimeout);
155+ this.lookupTimeout = undefined;
156+
157+ if (!(contact.lookupComplete)) {
158+ contact.lookupComplete = true;
159+ callback(contact);
160+ // if we have a late return, and we got a contact result, call
161+ // the late return update
162+ } else if (lateCallback && contact.doLateCallback && contact.id) {
163+ contact.doLateCallback = false;
164+ lateCallback.delay(5, contact);
165+ } else {
166+ }
167+
168+ },
169+
170+ // flag lookup as done; proceed with callback
171+ onLookupTimeout: function(contact, callback, lateCallback) {
172+
173+ if (lateCallback) {
174+ contact.doLateCallback = true;
175+ } else if (this.lastRequest && !lateCallback) {
176+ // cancel previous lookup, so this doesn't fire on a service crash
177+ this.lastRequest.cancel();
178+ this.lastRequest = undefined;
179+ }
180+
181+ // clear timeout
182+ this.lookupTimeout = undefined;
183+
184+ // flag done; fire callback if it hasn't yet
185+ contact.lookupComplete = true;
186+ var lookupWasPending = contact.lookupPending;
187+ contact.lookupPending = false;
188+ if (lookupWasPending)
189+ callback(contact);
190+ },
191+
192+ getMessagetone: function(callback) {
193+ var request = new Mojo.Service.Request('palm://com.palm.systemservice', {
194+ method: 'getPreferences',
195+ parameters: {"keys":["messagetone"]},
196+ onSuccess: callback,
197+ onFailure: callback
198+ });
199+ return request;
200 }
201 };
202\ No newline at end of file
203Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/notification-assistant.js
204===================================================================
205--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/notification-assistant.js
206+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/notification-assistant.js
207@@ -27,6 +27,8 @@ function NotificationAssistant(controlle
208 };
209 }
210
211+var contact = {};
212+
213 NotificationAssistant.prototype.subscribeToNotifications = function(){
214 this.messageNotificationRequest = MessagingMojoService.registerForIncomingMessages({onSuccess: this.sendNotification.bind(this, this.Messaging.notificationTypes.newMessage)});
215 this.sendErrorNotificationRequest = MessagingMojoService.registerForSendFailures(this.sendNotification.bind(this, this.Messaging.notificationTypes.sendFailure));
216@@ -35,6 +37,37 @@ NotificationAssistant.prototype.subscrib
217 this.airplaneModeNotificationRequest = MessagingMojoService.registerForAirplaneModeNotifications(this.sendAirplaneModeNotification.bind(this));
218 };
219
220+NotificationAssistant.prototype.doBanner = function(bannerParams,bannerLaunchParams,bannerType,payload) {
221+ if (payload.messagetone.fullPath)
222+ bannerParams.soundFile = payload.messagetone.fullPath;
223+ this.controller.showBanner(bannerParams,bannerLaunchParams,bannerType);
224+};
225+
226+NotificationAssistant.prototype.playMessagetone = function(payload){
227+ if (payload.messagetone.fullPath)
228+ this.controller.playSoundNotification('alerts',payload.messagetone.fullPath);
229+ else
230+ this.controller.playSoundNotification('alerts','');
231+};
232+
233+NotificationAssistant.prototype.doB = function(bannerParams,bannerLaunchParams,bannerType,contact) {
234+ Mojo.Log.error("Banner Ringtone: %j",contact.ringtoneLoc);
235+ if (contact.ringtoneLoc) {
236+ bannerParams.soundFile = contact.ringtoneLoc;
237+ this.controller.showBanner(bannerParams,bannerLaunchParams,bannerType);
238+ } else {
239+ MessagingMojoService.getMessagetone(this.doBanner.bind(this,bannerParams,bannerLaunchParams,'chat'));
240+ }
241+};
242+
243+NotificationAssistant.prototype.playmsgtone = function(contact){
244+ Mojo.Log.error("Playmsgtone Ringtone: %j",contact.ringtoneLoc);
245+ if (contact.ringtoneLoc)
246+ this.controller.playSoundNotification('alerts',contact.ringtoneLoc);
247+ else
248+ MessagingMojoService.getMessagetone(this.playMessagetone.bind(this));
249+};
250+
251 NotificationAssistant.prototype.sendNotification = function(notificationType, resp){
252 if (window.PalmSystem && !resp.returnValue) {
253 try {
254@@ -140,7 +173,8 @@ NotificationAssistant.prototype.consider
255
256 // check if we should only play a sound (when you are already in a chat & a new message comes in)
257 if(notificationData.get('playSoundOnly') && this.Messaging.messagingPrefs.enableNotificationSound) {
258- this.controller.playSoundNotification('alerts','');
259+ var smsid = notificationData.get('address');
260+ MessagingMojoService.rLookup(smsid,contact,this.playmsgtone.bind(this),this.playmsgtone.bind(this));
261 return; // don't display any visual notification
262 }
263
264@@ -176,10 +210,11 @@ NotificationAssistant.prototype.sendClas
265
266 notificationData.set('alertTitle',alertTitle);
267 this.class0AlertData.list.push(notificationData);
268- this.renderClass0PopupAlert(true);
269+ var smsid = notificationData.get('address');
270+ MessagingMojoService.getMessagetone(this.renderClass0PopupAlert.bind(this,true));
271 };
272
273-NotificationAssistant.prototype.renderClass0PopupAlert = function(playSound) {
274+NotificationAssistant.prototype.renderClass0PopupAlert = function(playSound,messageTone) {
275 var class0Stage = this.controller.getStageController(Class0AlertStageName);
276
277 if(class0Stage) {
278@@ -188,6 +223,8 @@ NotificationAssistant.prototype.renderCl
279 var soundClass = 'none';
280 if(playSound) {
281 soundClass = 'alerts';
282+ if(messageTone)
283+ soundFile = messageTone;
284 }
285
286 var pushClass0AlertScene = function(stageController) {
287@@ -198,7 +235,8 @@ NotificationAssistant.prototype.renderCl
288 name: Class0AlertStageName,
289 lightweight: true,
290 height: 300,
291- soundclass: soundClass
292+ soundclass: soundClass,
293+ soundfile: soundFile
294 }, pushClass0AlertScene, 'popupalert');
295 }
296
297@@ -253,8 +291,6 @@ NotificationAssistant.prototype.sendNewM
298 var bannerParams = {
299 messageText: notificationText
300 };
301- if (this.Messaging.messagingPrefs.enableNotificationSound)
302- bannerParams.soundClass = "alerts";
303 var bannerLaunchParams = {
304 chatThreadId: chatThreadId,
305 clearBanner: true
306@@ -262,10 +298,17 @@ NotificationAssistant.prototype.sendNewM
307
308 if (this.Messaging.DisplayState.isDisplayOn()) {
309 Mojo.Log.info("notificationAssistant - executing full banner notification");
310- this.controller.showBanner(bannerParams, bannerLaunchParams, 'chat');
311+ if (this.Messaging.messagingPrefs.enableNotificationSound) {
312+ var smsid = notificationData.get('address');
313+ bannerParams.soundClass = "alerts";
314+ MessagingMojoService.rLookup(smsid,contact,this.doB.bind(this,bannerParams,bannerLaunchParams,'chat'),this.doB.bind(this,bannerParams,bannerLaunchParams,'chat'));
315+ } else {
316+ Mojo.Log.error("Setting banner params");
317+ this.controller.showBanner(bannerParams, bannerLaunchParams, 'chat');
318+ }
319 } else if (this.Messaging.messagingPrefs.enableNotificationSound) {
320- Mojo.Log.info("notificationAssistant - playing sound notification only");
321- this.controller.playSoundNotification('alerts','');
322+ var smsid = notificationData.get('address');
323+ MessagingMojoService.rLookup(smsid,contact,this.playmsgtone.bind(this),this.playmsgtone.bind(this));
324 }
325
326 // Store the data so it can be used in the dashboard
327@@ -324,13 +367,9 @@ NotificationAssistant.prototype.sendNewM
328 // delay creating the dashboard window for the case where the banner is clicked on
329 // to take you to the chat view. This will likely result in the dashboard data
330 // being cleared. If the dashboard data is empty, we do not need to create the dashboard.
331- if (this.Messaging.DisplayState.isDisplayOn()) {
332- if (!this.isNewMessageDashboardPending) {
333- this.isNewMessageDashboardPending = true;
334- createDashboard.delay(5);
335- }
336- } else {
337- createDashboard(); // if the screen is off, create the dashboard right away
338+ if (!this.isNewMessageDashboardPending) {
339+ this.isNewMessageDashboardPending = true;
340+ createDashboard.delay(5);
341 }
342 }
343 };
  
1Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -1837,7 +1837,7 @@ var ChatviewAssistant = Class.create({
6 // This will sometimes be an object because we pass this method directly when we observe
7 // Mojo.Event.tap on the send button
8 if(forceSendIfOffline && forceSendIfOffline != true)
9- forceSendIfOffline = false;
10+ forceSendIfOffline = true;
11
12 // prevent blank messages from going through
13 var message = this.messageTextElement.value.strip();
  
1Index: /usr/palm/applications/com.palm.app.messaging/app/views/listview/buddyList-row.html
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.messaging/app/views/listview/buddyList-row.html
4+++ /usr/palm/applications/com.palm.app.messaging/app/views/listview/buddyList-row.html
5@@ -8,7 +8,7 @@
6 <div class="unread-count-container">
7 <div class="unread-count-wrapper">#{unreadCount}</div>
8 </div>
9- <div class="truncating-text custom-message">#{-customMessage}</div>
10+ <div class="custom-message">#{-customMessage}</div>
11 </div>
12 </div>
13 </div>
14\ No newline at end of file
15Index: /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
16===================================================================
17--- .orig/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
18+++ /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
19@@ -164,7 +164,7 @@ img.avatar-overlay {
20 }
21
22 .buddy-list .palm-row {
23- height: 60px;
24+ height: auto;
25 }
26
27 .buddy-list .title {
  
1diff --git a/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js b/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2index 0c816ba..39d4e6c 100644
3--- a/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ b/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -1750,6 +1750,32 @@ var ChatviewAssistant = Class.create({
6 },
7
8 handleTextAreaKeyUp: function(event) {
9+ if (event && event.ctrlKey && event.keyCode==Mojo.Char.f) {
10+ currentText=this.messageTextElement.value;
11+ oldPos = this.messageTextElement.selectionStart;
12+ newPos = currentText.lastIndexOf(' ',oldPos-1);
13+ if (newPos>-1) {
14+ this.messageTextElement.setSelectionRange(newPos,newPos);
15+ }
16+ else {
17+ this.messageTextElement.setSelectionRange(0,0);
18+ }
19+ Event.stop(event);
20+ }
21+
22+ if (event && event.ctrlKey && event.keyCode==Mojo.Char.g ) {
23+ currentText=this.messageTextElement.value;
24+ oldPos = this.messageTextElement.selectionStart;
25+ newPos = currentText.indexOf(' ',oldPos);
26+ if (newPos>-1) {
27+ this.messageTextElement.setSelectionRange(newPos+1,newPos+1);
28+ }
29+ else {
30+ this.messageTextElement.setSelectionRange(currentText.length,currentText.length);
31+ }
32+ Event.stop(event);
33+ }
34+
35 if (event && Mojo.Char.isEnterKey(event.keyCode)) {
36 this.considerForSend();
37 Event.stop(event);
  
1Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -1541,59 +1541,104 @@ var ChatviewAssistant = Class.create({
6 MessagingMojoService.deleteMessage(this.controller, event.item.messageId);
7 },
8
9- handleMessageTap: function(event){
10- var eventTarget = this.controller.get(event.originalEvent.target);
11-
12- var mmsImageTarget = MessagingUtils.getClassUpChain(eventTarget,'MMSImageObject');
13- if(mmsImageTarget) {
14- this.controller.stageController.pushScene('imageview', mmsImageTarget.getAttribute('originalSrc'));
15- return;
16- }
17+ handleMessageTap: function(event){
18+ var eventTarget = this.controller.get(event.originalEvent.target);
19
20- var mmsVideoTarget = MessagingUtils.getClassUpChain(eventTarget,'mms-video');
21- if(mmsVideoTarget) {
22- var videoPath = mmsVideoTarget.getAttribute('filePath');
23- var videoName = mmsVideoTarget.getAttribute('fileInfo');
24-
25- var args = {
26- appId: "com.palm.app.videoplayer",
27- name: "nowplaying"
28- };
29- var params = {
30- target: videoPath,
31- title: videoName
32- };
33- this.controller.stageController.pushScene(args, params);
34- return;
35- }
36-
37- var mmsVcardTarget = MessagingUtils.getClassUpChain(eventTarget,'mms-vcard');
38- if(mmsVcardTarget) {
39- var filePath = mmsVcardTarget.getAttribute('filePath');
40- MessagingMojoService.launchFile(this.controller, 'text/x-vcard', 'file://'+filePath);
41- return;
42- }
43-
44- var mmsVcalTarget = MessagingUtils.getClassUpChain(eventTarget,'mms-vcal');
45- if(mmsVcalTarget) {
46- var filePath = mmsVcalTarget.getAttribute('filePath');
47- MessagingMojoService.launchFile(this.controller, 'text/x-vcalendar', 'file://'+filePath);
48- return;
49- }
50-
51- MessagingUtils.simpleListClick(this.controller.get(event.originalEvent.target), "chatRow", function(targetRow){
52- var messageData = {
53- errorCode: targetRow.getAttribute("errorCode"),
54- status: targetRow.getAttribute("status"),
55- messageId: targetRow.getAttribute("messageId"),
56- flags: targetRow.getAttribute("flags"),
57- messageType: targetRow.getAttribute("messageType")
58- };
59-
60- MessagingMojoService.getMessageErrorInfo(this.controller, messageData.messageId, messageData.flags, this.handleMessageErrorPopup.bind(this,messageData));
61+ var mmsImageTarget = MessagingUtils.getClassUpChain(eventTarget,'MMSImageObject');
62+ if(mmsImageTarget) {
63+ var imagePath = mmsImageTarget.getAttribute('originalSrc');
64+ this.controller.showAlertDialog({
65+ onChoose: function(value) {if(value == "forward"){MessagingMojoService.forwardMessage(this.controller, event.item.messageText, imagePath);} else {this.controller.stageController.pushScene('imageview', imagePath);}},
66+ title: $L("Forward Message"),
67+ message: $L("Do you want to forward this message?"),
68+ choices:[
69+ {label:$L("Yes"), value:"forward", type:"affirmative"},
70+ {label:$L("No"), value:"", type:"negative"}
71+ ]
72+ });
73+ return;
74+ }
75
76- }.bind(this), false);
77- },
78+ var mmsVideoTarget = MessagingUtils.getClassUpChain(eventTarget,'mms-video');
79+ if(mmsVideoTarget) {
80+ var videoPath = mmsVideoTarget.getAttribute('filePath');
81+ var videoName = mmsVideoTarget.getAttribute('fileInfo');
82+
83+ var args = {
84+ appId: "com.palm.app.videoplayer",
85+ name: "nowplaying"
86+ };
87+ var params = {
88+ target: videoPath,
89+ title: videoName
90+ };
91+ this.controller.showAlertDialog({
92+ onChoose: function(value) {if(value == "forward"){MessagingMojoService.forwardMessage(this.controller, event.item.messageText, videoPath);} else {this.controller.stageController.pushScene(args, params);}},
93+ title: $L("Forward Message"),
94+ message: $L("Do you want to forward this message?"),
95+ choices:[
96+ {label:$L("Yes"), value:"forward", type:"affirmative"},
97+ {label:$L("No"), value:"", type:"negative"}
98+ ]
99+ });
100+ return;
101+ }
102+
103+ var mmsVcardTarget = MessagingUtils.getClassUpChain(eventTarget,'mms-vcard');
104+ if(mmsVcardTarget) {
105+ var filePath = mmsVcardTarget.getAttribute('filePath');
106+ this.controller.showAlertDialog({
107+ onChoose: function(value) {if(value == "forward"){MessagingMojoService.forwardMessage(this.controller, event.item.messageText, filePath);} else {this.controller.stageController.pushScene('mmsTextAttachment', filePath);}},
108+ title: $L("Forward Message"),
109+ message: $L("Do you want to forward this message?"),
110+ choices:[
111+ {label:$L("Yes"), value:"forward", type:"affirmative"},
112+ {label:$L("No"), value:"", type:"negative"}
113+ ]
114+ });
115+ return;
116+ }
117+
118+ var mmsVcalTarget = MessagingUtils.getClassUpChain(eventTarget,'mms-vcal');
119+ if(mmsVcalTarget) {
120+ var filePath = mmsVcalTarget.getAttribute('filePath');
121+ this.controller.showAlertDialog({
122+ onChoose: function(value) {if(value == "forward"){MessagingMojoService.forwardMessage(this.controller, event.item.messageText, filePath);} else {this.controller.stageController.pushScene('mmsTextAttachment', filePath);}},
123+ title: $L("Forward Message"),
124+ message: $L("Do you want to forward this message?"),
125+ choices:[
126+ {label:$L("Yes"), value:"forward", type:"affirmative"},
127+ {label:$L("No"), value:"", type:"negative"}
128+ ]
129+ });
130+ return;
131+ }
132+
133+ if (!mmsImageTarget && !mmsVideoTarget && !mmsVcardTarget && !mmsVcalTarget) {
134+ this.controller.showAlertDialog({
135+ onChoose: function(value) {if(value == "forward"){MessagingMojoService.forwardMessage(this.controller, event.item.messageText, '');}},
136+ title: $L("Forward Message"),
137+ message: $L("Do you want to forward this message?"),
138+ choices:[
139+ {label:$L("Yes"), value:"forward", type:"affirmative"},
140+ {label:$L("No"), value:"", type:"negative"}
141+ ]
142+ });
143+ }
144+
145+ MessagingUtils.simpleListClick(this.controller.get(event.originalEvent.target), "chatRow", function(targetRow){
146+ var messageData = {
147+ errorCode: targetRow.getAttribute("errorCode"),
148+ status: targetRow.getAttribute("status"),
149+ messageId: targetRow.getAttribute("messageId"),
150+ flags: targetRow.getAttribute("flags"),
151+ messageType: targetRow.getAttribute("messageType")
152+ };
153+
154+ MessagingMojoService.getMessageErrorInfo(this.controller, messageData.messageId, messageData.flags, this.handleMessageErrorPopup.bind(this,messageData));
155+
156+ }.bind(this), false);
157+ },
158
159
160 handleMessageErrorPopup: function(messageData,messageErrorData) {
161Index: /usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
162===================================================================
163--- .orig/usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
164+++ /usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
165@@ -8,7 +8,25 @@ var MessagingMojoService = {
166 displayIdentifier: 'palm://com.palm.display/control',
167 telephonyIdentifier: 'palm://com.palm.telephony',
168 systemManagerIdentifier: 'palm://com.palm.systemmanager',
169+ forwardIdentifier: 'palm://com.palm.applicationManager',
170
171+ forwardMessage: function(sceneController,messageText,attachment) {
172+ var opts = {
173+ method: 'launch',
174+ parameters: {
175+ id: 'com.palm.app.messaging',
176+ params: {
177+ }
178+ }
179+ };
180+ if (messageText)
181+ opts.parameters.params.messageText = 'FWD: '+messageText;
182+ if (attachment)
183+ opts.parameters.params.attachment = attachment;
184+ return sceneController.serviceRequest(MessagingMojoService.forwardIdentifier,opts);
185+ },
186+
187+
188 launchMessaging: function(sceneController,params) {
189 return sceneController.serviceRequest("palm://com.palm.applicationManager", {
190 method:'launch',
  
1Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -97,7 +97,9 @@ var ChatviewAssistant = Class.create({
6
7 setup: function(){
8 this.controller.setupWidget(Mojo.Menu.appMenu, this.appMenuAttrs, this.appMenuModel);
9-
10+
11+ // enable free orientation
12+ this.controller.window.PalmSystem.setWindowOrientation("free");
13 var messageTextWidgetAttributes = {
14 modelProperty: 'value',
15 hintText: $L('Enter message here...'),
16@@ -196,6 +198,14 @@ var ChatviewAssistant = Class.create({
17 this.handleFocus();
18 }
19 },
20+
21+ orientationChanged: function(orientation) {
22+ if (orientation === "left" || orientation === "right") {
23+ this.controller.sceneElement.addClassName('landscape');
24+ } else {
25+ this.controller.sceneElement.removeClassName('landscape');
26+ }
27+ },
28
29 cleanup: function(){
30 this.chatViewHeaderClickTarget.stopObserving(Mojo.Event.tap, this.handleHeaderTap);
31Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
32===================================================================
33--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
34+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
35@@ -73,7 +73,9 @@ var ComposeAssistant = Class.create({
36
37 setup: function() {
38 this.controller.setupWidget(Mojo.Menu.appMenu, this.appMenuAttrs, this.appMenuModel);
39-
40+
41+ // enable free orientation
42+ this.controller.window.PalmSystem.setWindowOrientation("free");
43 this.searchList = {
44 "property": "to$A",
45 "includeEmails": false,
46@@ -386,6 +388,14 @@ var ComposeAssistant = Class.create({
47 }
48 this.setCharacterCounterMaxLength();
49 },
50+
51+ orientationChanged: function(orientation) {
52+ if (orientation === "left" || orientation === "right") {
53+ this.controller.sceneElement.addClassName('landscape');
54+ } else {
55+ this.controller.sceneElement.removeClassName('landscape');
56+ }
57+ },
58
59 cleanup: function() {
60 var that = this;
61Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
62===================================================================
63--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
64+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
65@@ -212,8 +212,10 @@ var ListviewAssistant = Class.create(App
66 items:this.commandMenuModel
67 };
68
69- this.controller.setupWidget(Mojo.Menu.commandMenu, {}, this.cmdMenuModel);
70-
71+ this.controller.setupWidget(Mojo.Menu.commandMenu, undefined, this.cmdMenuModel);
72+
73+ // enable free orientation
74+ this.controller.window.PalmSystem.setWindowOrientation("free");
75 this.filterField = this.controller.get('filterField');
76 this.buddyListHeader = this.controller.get('buddyListHeader');
77 this.controller.setupWidget('filterField',{filterFieldName:'filterFieldElement'},this.filterField);
78@@ -1086,7 +1088,15 @@ var ListviewAssistant = Class.create(App
79 loadDebugView: function() {
80 this.controller.stageController.pushScene('debug');
81 },
82-
83+
84+ orientationChanged: function(orientation) {
85+ if (orientation === "left" || orientation === "right") {
86+ this.controller.sceneElement.addClassName('landscape');
87+ } else {
88+ this.controller.sceneElement.removeClassName('landscape');
89+ }
90+ },
91+
92 cleanup: function() {
93 // save the listview state
94 MessagingMojoService.setIsHistoryViewSelected(this.controller,(this.currentListView == this.Messaging.Views.HISTORY));
95Index: /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
96===================================================================
97--- .orig/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
98+++ /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
99@@ -642,10 +642,10 @@ img.avatar-overlay {
100 }
101
102 .their-chat .message-container {
103- width: 255px;
104+ width: 85%;
105 }
106 .my-chat .message-container {
107- width: 280px;
108+ width: 95%;
109 }
110 .chat-entry .chat-balloon {
111 min-height: 26px;
112@@ -823,7 +823,7 @@ img.avatar-overlay {
113 position: fixed;
114 bottom:0px;
115 left:0px;
116- width: 320px;
117+ width: 100%;
118 }
119
120 #messageContainer #messageTextWidget {
  
1Formats the messages to landscape when phone is rotated.
2Index: /usr/palm/applications/com.palm.app.email/app/controllers/accounts-assistant.js
3===================================================================
4--- .orig/usr/palm/applications/com.palm.app.email/app/controllers/accounts-assistant.js
5+++ /usr/palm/applications/com.palm.app.email/app/controllers/accounts-assistant.js
6@@ -53,6 +53,7 @@ var AccountsAssistant = Class.create(App
7 EmailAppDepot.depot.isShowFavorites(AccountsAssistant.kFavoriteFoldersAccountID, this.depotGetFavExpanded.bind(this));
8
9 this.controller.listen(this.controller.sceneElement, Mojo.Event.keypress, this.keypressHandler.bind(this));
10+ this.controller.window.PalmSystem.setWindowOrientation("free");
11 },
12
13 cleanup: function() {
14Index: /usr/palm/applications/com.palm.app.email/app/controllers/compose-assistant.js
15===================================================================
16--- .orig/usr/palm/applications/com.palm.app.email/app/controllers/compose-assistant.js
17+++ /usr/palm/applications/com.palm.app.email/app/controllers/compose-assistant.js
18@@ -186,6 +186,7 @@ var ComposeAssistant = Class.create({
19
20 // Delayed a little, since we want the header part of render as quickly as possible
21 ComposeAssistant.onLoad.defer(this.controller, this.email);
22+ this.controller.window.PalmSystem.setWindowOrientation("free");
23 },
24
25 cleanup: function() {
26@@ -641,7 +642,8 @@ ComposeAssistant.onLoad = function(contr
27 var bodyText = email.text;
28 var originalText = email.originalText;
29 // Reduce bad scripts, styles, and margin settings by removing the html up to (and including) the body tag.
30- var splitIndex = originalText.indexOf("<body");
31+ /* -START- REPLACE BY D2GLOBALINC MODIFICATION TO FIX REPLY-FORWARD FORMATTING
32+ var splitIndex = originalText.indexOf("<body");
33 if (splitIndex > 0) {
34 splitIndex = originalText.indexOf('>', splitIndex);
35 if (splitIndex > 0) {
36@@ -651,7 +653,23 @@ ComposeAssistant.onLoad = function(contr
37 }
38 }
39
40- // Truncate to 100K if the message is too long.
41+ */
42+ // -END- REPLACE BY D2GLOBALINC MODIFICATION TO FIX REPLY-FORWARD FORMATTING
43+
44+ // FIX BROKEN FORMATTING IN REPLAY-FORWARD
45+ var splitIndex = originalText.indexOf("<body");
46+ if (splitIndex > 0) {
47+ splitIndex = originalText.indexOf('>', splitIndex);
48+ if (splitIndex > 0) {
49+ splitIndex++;
50+ Mojo.Log.info("Slicing header starting at", splitIndex);
51+ originalText = originalText.slice(splitIndex);
52+ }
53+ } else {
54+ originalText = originalText.gsub("\n","<br/>");
55+ }
56+
57+ // Truncate to 100K if the message is too long.
58 // cutting it off conservatively).
59 var maxBodyLength = 100000;
60 if (originalText.length > maxBodyLength) {
61Index: /usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
62===================================================================
63--- .orig/usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
64+++ /usr/palm/applications/com.palm.app.email/app/controllers/list-assistant.js
65@@ -37,6 +37,7 @@ var ListAssistant = Class.create(App.Sce
66 {label:$L('Update'), icon:'sync', command:'sync'}
67 ]};
68 this.controller.setupWidget(Mojo.Menu.commandMenu, undefined, this.cmdMenuModel);
69+ this.controller.window.PalmSystem.setWindowOrientation("free");
70 },
71
72 // NOTE: this is called by app_scene's _setup function
  
1Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -2013,7 +2013,7 @@ var ChatviewAssistant = Class.create({
6 attachFilePicker: function(event){
7 var params = {
8 actionType: 'attach',
9- kinds: ['image'], // TODO: integrate other media types
10+ kinds: ['image','audio','video'], // TODO: integrate other media types
11 defaultKind: 'image',
12 onSelect: this.handleFilePickerSelect.bind(this)
13 };
14Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
15===================================================================
16--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
17+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
18@@ -324,7 +324,7 @@ var ComposeAssistant = Class.create({
19 attachFilePicker: function(event) {
20 var params = {
21 actionType: 'attach',
22- kinds: ['image'], // TODO: integrate other media types
23+ kinds: ['image','audio','video'], // TODO: integrate other media types
24 defaultKind: 'image',
25 onSelect: this.handleFilePickerSelect.bind(this)
26 };
  
1diff -ur /usr/palm/app-original/com.palm.app.messaging/app/controllers/chatview-assistant.js /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2--- /usr/palm/app-original/com.palm.app.messaging/app/controllers/chatview-assistant.js 2009-09-13 23:09:56.000000000 -0500
3+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js 2009-09-28 15:29:40.000000000 -0500
4@@ -187,6 +187,11 @@
5 segmentCountContainer: this.controller.get('segmentCounterContainer'),
6 segmentCountElement: this.controller.get('segmentCounter'),
7 setTextFieldValueFn: this.setTextFieldValue.bind(this)
8+ },
9+ charCounter: {
10+ charCountContainer: this.controller.get('charCounterContainer'),
11+ charCountElement: this.controller.get('charCounter'),
12+ setTextFieldValueFn: this.setTextFieldValue.bind(this)
13 }
14 };
15
16diff -ur /usr/palm/app-original/com.palm.app.messaging/app/controllers/compose-assistant.js /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
17--- /usr/palm/app-original/com.palm.app.messaging/app/controllers/compose-assistant.js 2009-09-13 23:09:56.000000000 -0500
18+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js 2009-09-28 15:30:36.000000000 -0500
19@@ -140,6 +140,11 @@
20 segmentCountContainer: this.controller.get('segmentCounterContainer'),
21 segmentCountElement: this.controller.get('segmentCounter'),
22 setTextFieldValueFn: this.setTextFieldValue.bind(this)
23+ },
24+ charCounter: {
25+ charCountContainer: this.controller.get('charCounterContainer'),
26+ charCountElement: this.controller.get('charCounter'),
27+ setTextFieldValueFn: this.setTextFieldValue.bind(this)
28 }
29 };
30
31diff -ur /usr/palm/app-original/com.palm.app.messaging/app/utilities/CharacterCounter.js /usr/palm/applications/com.palm.app.messaging/app/utilities/CharacterCounter.js
32--- /usr/palm/app-original/com.palm.app.messaging/app/utilities/CharacterCounter.js 2009-09-13 23:09:56.000000000 -0500
33+++ /usr/palm/applications/com.palm.app.messaging/app/utilities/CharacterCounter.js 2009-09-28 15:34:44.000000000 -0500
34@@ -58,6 +58,10 @@
35 containerElement: null,
36 valueElement: null
37 };
38+ var charCounterUI = {
39+ containerElement: null,
40+ valueElement: null
41+ };
42
43
44 // TODO: eventually we might want to implement some cleverness that counts
45@@ -291,6 +295,20 @@
46 }
47 };
48
49+ var setCurrentCharCount = function(newCharCount) {
50+ if(charCounterUI.valueElement)
51+ charCounterUI.valueElement.update(newCharCount);
52+ if(charCounterUI.containerElement) {
53+ if (newCharCount == 0) {
54+ if (charCounterUI.containerElement.visible())
55+ charCounterUI.containerElement.hide();
56+ } else {
57+ if (!charCounterUI.containerElement.visible())
58+ charCounterUI.containerElement.show();
59+ }
60+ }
61+ };
62+
63 return {
64
65 init: function(controller,platform,textElement,params) {
66@@ -451,7 +469,13 @@
67 setTextFieldValueFn = params.segmentCounter.setTextFieldValueFn;
68 }
69 }
70-
71+ if(params.charCounter) {
72+ charCounterUI.containerElement = params.charCounter.charCountContainer;
73+ charCounterUI.valueElement = params.charCounter.charCountElement;
74+ if(params.charCounter.setTextFieldValueFn) {
75+ setTextFieldValueFn = params.charCounter.setTextFieldValueFn;
76+ }
77+ }
78 }
79 },
80
81@@ -517,6 +541,7 @@
82
83 var messageData = parseMessage(rawCharacterData.message,rawCharacterData.count,true);
84 adjustedCharacterCount = messageData.adjustedCharacterCount;
85+ setCurrentCharCount(rawCharacterData.count);
86 if (adjustedMaxLen > 0)
87 setOverLimit(messageData.isOverLimit);
88 setCurrentSegmentCount(messageData.segmentCount);
89diff -ur /usr/palm/app-original/com.palm.app.messaging/app/views/chatview/chatview-scene.html /usr/palm/applications/com.palm.app.messaging/app/views/chatview/chatview-scene.html
90--- /usr/palm/app-original/com.palm.app.messaging/app/views/chatview/chatview-scene.html 2009-09-13 23:09:57.000000000 -0500
91+++ /usr/palm/applications/com.palm.app.messaging/app/views/chatview/chatview-scene.html 2009-09-28 15:35:16.000000000 -0500
92@@ -22,6 +22,10 @@
93 <div id="messageContainer" class='palm-row'>
94 <div class="palm-row-wrapper textfield-group focused">
95 <div class="title">
96+ <div id="charCounterContainer" style="display: none;">
97+ <div id="charCounter">
98+ </div>
99+ </div>
100 <div id="attachmentContainer" style="display: none;">
101 <div id="cancelAttachment">
102 </div>
103diff -ur /usr/palm/app-original/com.palm.app.messaging/app/views/compose/compose-scene.html /usr/palm/applications/com.palm.app.messaging/app/views/compose/compose-scene.html
104--- /usr/palm/app-original/com.palm.app.messaging/app/views/compose/compose-scene.html 2009-09-13 23:09:57.000000000 -0500
105+++ /usr/palm/applications/com.palm.app.messaging/app/views/compose/compose-scene.html 2009-09-28 15:36:15.000000000 -0500
106@@ -6,6 +6,10 @@
107 <div id="messageContainer" class='palm-row'>
108 <div class="palm-row-wrapper textfield-group focused">
109 <div class="title">
110+ <div id="charCounterContainer" style="display: none;">
111+ <div id="charCounter">
112+ </div>
113+ </div>
114 <div id="attachmentContainer" style="display: none;">
115 <div id="cancelAttachment">
116 </div>
117diff -ur /usr/palm/app-original/com.palm.app.messaging/stylesheets/messaging.css /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
118--- /usr/palm/app-original/com.palm.app.messaging/stylesheets/messaging.css 2009-09-13 23:10:04.000000000 -0500
119+++ /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css 2009-09-28 15:37:25.000000000 -0500
120@@ -837,6 +837,23 @@
121 #messageContainer.palm-row .icon.right {
122 height: 61px;
123 }
124+#messageContainer #charCounterContainer {
125+ line-height: 20px;
126+ display:block;
127+ height: 20px;
128+ border-width: 0px 10px 0px 9px;
129+ -webkit-border-image: url(../images/message-segment-badge.png) 0 10 0 9 stretch stretch;
130+ position: absolute;
131+ z-index: 3;
132+ top: 2px;
133+ left: 2px;
134+}
135+#messageContainer #charCounterContainer #charCounter {
136+ font-size: 12px;
137+ font-weight: bold;
138+ color: #679BC2;
139+ margin: 0px -4px 3px -3px;
140+}
141 #messageContainer #attachmentContainer {
142 position: relative;
143 margin-top:10px;
  
1diff --git a/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js b/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
2index e4be132..688c678 100644
3--- a/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
4+++ b/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
5@@ -76,7 +76,7 @@ var ComposeAssistant = Class.create({
6
7 this.searchList = {
8 "property": "to$A",
9- "includeEmails": false,
10+ "includeEmails": true,
11 "includePhones": true,
12 "includeIMs": true,
13 "includeShortCode": true,
  
1Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -1541,59 +1541,104 @@ var ChatviewAssistant = Class.create({
6 MessagingMojoService.deleteMessage(this.controller, event.item.messageId);
7 },
8
9- handleMessageTap: function(event){
10- var eventTarget = this.controller.get(event.originalEvent.target);
11-
12- var mmsImageTarget = MessagingUtils.getClassUpChain(eventTarget,'MMSImageObject');
13- if(mmsImageTarget) {
14- this.controller.stageController.pushScene('imageview', mmsImageTarget.getAttribute('originalSrc'));
15- return;
16- }
17+ handleMessageTap: function(event){
18+ var eventTarget = this.controller.get(event.originalEvent.target);
19
20- var mmsVideoTarget = MessagingUtils.getClassUpChain(eventTarget,'mms-video');
21- if(mmsVideoTarget) {
22- var videoPath = mmsVideoTarget.getAttribute('filePath');
23- var videoName = mmsVideoTarget.getAttribute('fileInfo');
24-
25- var args = {
26- appId: "com.palm.app.videoplayer",
27- name: "nowplaying"
28- };
29- var params = {
30- target: videoPath,
31- title: videoName
32- };
33- this.controller.stageController.pushScene(args, params);
34- return;
35- }
36-
37- var mmsVcardTarget = MessagingUtils.getClassUpChain(eventTarget,'mms-vcard');
38- if(mmsVcardTarget) {
39- var filePath = mmsVcardTarget.getAttribute('filePath');
40- MessagingMojoService.launchFile(this.controller, 'text/x-vcard', 'file://'+filePath);
41- return;
42- }
43-
44- var mmsVcalTarget = MessagingUtils.getClassUpChain(eventTarget,'mms-vcal');
45- if(mmsVcalTarget) {
46- var filePath = mmsVcalTarget.getAttribute('filePath');
47- MessagingMojoService.launchFile(this.controller, 'text/x-vcalendar', 'file://'+filePath);
48- return;
49- }
50-
51- MessagingUtils.simpleListClick(this.controller.get(event.originalEvent.target), "chatRow", function(targetRow){
52- var messageData = {
53- errorCode: targetRow.getAttribute("errorCode"),
54- status: targetRow.getAttribute("status"),
55- messageId: targetRow.getAttribute("messageId"),
56- flags: targetRow.getAttribute("flags"),
57- messageType: targetRow.getAttribute("messageType")
58- };
59-
60- MessagingMojoService.getMessageErrorInfo(this.controller, messageData.messageId, messageData.flags, this.handleMessageErrorPopup.bind(this,messageData));
61+ var mmsImageTarget = MessagingUtils.getClassUpChain(eventTarget,'MMSImageObject');
62+ if(mmsImageTarget) {
63+ var imagePath = mmsImageTarget.getAttribute('originalSrc');
64+ this.controller.showAlertDialog({
65+ onChoose: function(value) {if(value == "forward"){MessagingMojoService.forwardMessage(this.controller, event.item.messageText, imagePath);} else {this.controller.stageController.pushScene('imageview', imagePath);}},
66+ title: $L("Forward Message"),
67+ message: $L("Do you want to forward this message?"),
68+ choices:[
69+ {label:$L("Yes"), value:"forward", type:"affirmative"},
70+ {label:$L("No"), value:"", type:"negative"}
71+ ]
72+ });
73+ return;
74+ }
75
76- }.bind(this), false);
77- },
78+ var mmsVideoTarget = MessagingUtils.getClassUpChain(eventTarget,'mms-video');
79+ if(mmsVideoTarget) {
80+ var videoPath = mmsVideoTarget.getAttribute('filePath');
81+ var videoName = mmsVideoTarget.getAttribute('fileInfo');
82+
83+ var args = {
84+ appId: "com.palm.app.videoplayer",
85+ name: "nowplaying"
86+ };
87+ var params = {
88+ target: videoPath,
89+ title: videoName
90+ };
91+ this.controller.showAlertDialog({
92+ onChoose: function(value) {if(value == "forward"){MessagingMojoService.forwardMessage(this.controller, event.item.messageText, videoPath);} else {this.controller.stageController.pushScene(args, params);}},
93+ title: $L("Forward Message"),
94+ message: $L("Do you want to forward this message?"),
95+ choices:[
96+ {label:$L("Yes"), value:"forward", type:"affirmative"},
97+ {label:$L("No"), value:"", type:"negative"}
98+ ]
99+ });
100+ return;
101+ }
102+
103+ var mmsVcardTarget = MessagingUtils.getClassUpChain(eventTarget,'mms-vcard');
104+ if(mmsVcardTarget) {
105+ var filePath = mmsVcardTarget.getAttribute('filePath');
106+ this.controller.showAlertDialog({
107+ onChoose: function(value) {if(value == "forward"){MessagingMojoService.forwardMessage(this.controller, event.item.messageText, filePath);} else {this.controller.stageController.pushScene('mmsTextAttachment', filePath);}},
108+ title: $L("Forward Message"),
109+ message: $L("Do you want to forward this message?"),
110+ choices:[
111+ {label:$L("Yes"), value:"forward", type:"affirmative"},
112+ {label:$L("No"), value:"", type:"negative"}
113+ ]
114+ });
115+ return;
116+ }
117+
118+ var mmsVcalTarget = MessagingUtils.getClassUpChain(eventTarget,'mms-vcal');
119+ if(mmsVcalTarget) {
120+ var filePath = mmsVcalTarget.getAttribute('filePath');
121+ this.controller.showAlertDialog({
122+ onChoose: function(value) {if(value == "forward"){MessagingMojoService.forwardMessage(this.controller, event.item.messageText, filePath);} else {this.controller.stageController.pushScene('mmsTextAttachment', filePath);}},
123+ title: $L("Forward Message"),
124+ message: $L("Do you want to forward this message?"),
125+ choices:[
126+ {label:$L("Yes"), value:"forward", type:"affirmative"},
127+ {label:$L("No"), value:"", type:"negative"}
128+ ]
129+ });
130+ return;
131+ }
132+
133+ if (!mmsImageTarget && !mmsVideoTarget && !mmsVcardTarget && !mmsVcalTarget) {
134+ this.controller.showAlertDialog({
135+ onChoose: function(value) {if(value == "forward"){MessagingMojoService.forwardMessage(this.controller, event.item.messageText, '');}},
136+ title: $L("Forward Message"),
137+ message: $L("Do you want to forward this message?"),
138+ choices:[
139+ {label:$L("Yes"), value:"forward", type:"affirmative"},
140+ {label:$L("No"), value:"", type:"negative"}
141+ ]
142+ });
143+ }
144+
145+ MessagingUtils.simpleListClick(this.controller.get(event.originalEvent.target), "chatRow", function(targetRow){
146+ var messageData = {
147+ errorCode: targetRow.getAttribute("errorCode"),
148+ status: targetRow.getAttribute("status"),
149+ messageId: targetRow.getAttribute("messageId"),
150+ flags: targetRow.getAttribute("flags"),
151+ messageType: targetRow.getAttribute("messageType")
152+ };
153+
154+ MessagingMojoService.getMessageErrorInfo(this.controller, messageData.messageId, messageData.flags, this.handleMessageErrorPopup.bind(this,messageData));
155+
156+ }.bind(this), false);
157+ },
158
159
160 handleMessageErrorPopup: function(messageData,messageErrorData) {
161Index: /usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
162===================================================================
163--- .orig/usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
164+++ /usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
165@@ -8,7 +8,25 @@ var MessagingMojoService = {
166 displayIdentifier: 'palm://com.palm.display/control',
167 telephonyIdentifier: 'palm://com.palm.telephony',
168 systemManagerIdentifier: 'palm://com.palm.systemmanager',
169+ forwardIdentifier: 'palm://com.palm.applicationManager',
170
171+ forwardMessage: function(sceneController,messageText,attachment) {
172+ var opts = {
173+ method: 'launch',
174+ parameters: {
175+ id: 'com.palm.app.messaging',
176+ params: {
177+ }
178+ }
179+ };
180+ if (messageText)
181+ opts.parameters.params.messageText = 'FWD: '+messageText;
182+ if (attachment)
183+ opts.parameters.params.attachment = attachment;
184+ return sceneController.serviceRequest(MessagingMojoService.forwardIdentifier,opts);
185+ },
186+
187+
188 launchMessaging: function(sceneController,params) {
189 return sceneController.serviceRequest("palm://com.palm.applicationManager", {
190 method:'launch',
  
1Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -97,7 +97,9 @@ var ChatviewAssistant = Class.create({
6
7 setup: function(){
8 this.controller.setupWidget(Mojo.Menu.appMenu, this.appMenuAttrs, this.appMenuModel);
9-
10+
11+ // enable free orientation
12+ this.controller.window.PalmSystem.setWindowOrientation("free");
13 var messageTextWidgetAttributes = {
14 modelProperty: 'value',
15 hintText: $L('Enter message here...'),
16@@ -196,6 +198,14 @@ var ChatviewAssistant = Class.create({
17 this.handleFocus();
18 }
19 },
20+
21+ orientationChanged: function(orientation) {
22+ if (orientation === "left" || orientation === "right") {
23+ this.controller.sceneElement.addClassName('landscape');
24+ } else {
25+ this.controller.sceneElement.removeClassName('landscape');
26+ }
27+ },
28
29 cleanup: function(){
30 this.chatViewHeaderClickTarget.stopObserving(Mojo.Event.tap, this.handleHeaderTap);
31Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
32===================================================================
33--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
34+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
35@@ -73,7 +73,9 @@ var ComposeAssistant = Class.create({
36
37 setup: function() {
38 this.controller.setupWidget(Mojo.Menu.appMenu, this.appMenuAttrs, this.appMenuModel);
39-
40+
41+ // enable free orientation
42+ this.controller.window.PalmSystem.setWindowOrientation("free");
43 this.searchList = {
44 "property": "to$A",
45 "includeEmails": false,
46@@ -386,6 +388,14 @@ var ComposeAssistant = Class.create({
47 }
48 this.setCharacterCounterMaxLength();
49 },
50+
51+ orientationChanged: function(orientation) {
52+ if (orientation === "left" || orientation === "right") {
53+ this.controller.sceneElement.addClassName('landscape');
54+ } else {
55+ this.controller.sceneElement.removeClassName('landscape');
56+ }
57+ },
58
59 cleanup: function() {
60 var that = this;
61Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
62===================================================================
63--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
64+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
65@@ -212,8 +212,10 @@ var ListviewAssistant = Class.create(App
66 items:this.commandMenuModel
67 };
68
69- this.controller.setupWidget(Mojo.Menu.commandMenu, {}, this.cmdMenuModel);
70-
71+ this.controller.setupWidget(Mojo.Menu.commandMenu, undefined, this.cmdMenuModel);
72+
73+ // enable free orientation
74+ this.controller.window.PalmSystem.setWindowOrientation("free");
75 this.filterField = this.controller.get('filterField');
76 this.buddyListHeader = this.controller.get('buddyListHeader');
77 this.controller.setupWidget('filterField',{filterFieldName:'filterFieldElement'},this.filterField);
78@@ -1086,7 +1088,15 @@ var ListviewAssistant = Class.create(App
79 loadDebugView: function() {
80 this.controller.stageController.pushScene('debug');
81 },
82-
83+
84+ orientationChanged: function(orientation) {
85+ if (orientation === "left" || orientation === "right") {
86+ this.controller.sceneElement.addClassName('landscape');
87+ } else {
88+ this.controller.sceneElement.removeClassName('landscape');
89+ }
90+ },
91+
92 cleanup: function() {
93 // save the listview state
94 MessagingMojoService.setIsHistoryViewSelected(this.controller,(this.currentListView == this.Messaging.Views.HISTORY));
95Index: /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
96===================================================================
97--- .orig/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
98+++ /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
99@@ -642,10 +642,10 @@ img.avatar-overlay {
100 }
101
102 .their-chat .message-container {
103- width: 255px;
104+ width: 85%;
105 }
106 .my-chat .message-container {
107- width: 280px;
108+ width: 95%;
109 }
110 .chat-entry .chat-balloon {
111 min-height: 26px;
112@@ -823,7 +823,7 @@ img.avatar-overlay {
113 position: fixed;
114 bottom:0px;
115 left:0px;
116- width: 320px;
117+ width: 100%;
118 }
119
120 #messageContainer #messageTextWidget {
  
1diff --git a/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js b/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2index 4c7cdbe..52563c8 100644
3--- a/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ b/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -1347,7 +1347,7 @@ var ChatviewAssistant = Class.create({
6 if (ChatFlags.isOutgoing(msg.flags)) {
7 tmpClass.push("my-chat");
8 // Disabling MY avatar because we are not doing this for 1.0 2008-11-05
9- //msg.avatar = this.myAvatar || 'images/my-avatar.png';
10+ msg.avatar = this.myAvatar || 'images/my-avatar.png';
11 } else {
12 tmpClass.push("their-chat");
13 msg.avatar = this.avatarHash[msg.fromAddress] || this.contactAvatar || "images/list-view-default-avatar.png";
14diff --git a/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css b/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
15index 13251fe..b624a0f 100644
16--- a/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
17+++ b/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
18@@ -137,16 +137,11 @@ img.avatar-overlay {
19 }
20
21 .chatRow img.avatar-location {
22- margin-top: -18px;
23+ margin-top: -39px;
24 }
25
26 .chatRow img.avatar-overlay {
27- margin-top: -21px;
28-}
29-
30-.chatRow .avatar-container {
31- vertical-align: middle;
32- display: inline-block;
33+ margin-top: -42.5px;
34 }
35
36 .login-animation-available,
37@@ -664,9 +659,7 @@ img.avatar-overlay {
38 padding: 1px 0;
39 font-size: 18px;
40 word-wrap: break-word !important;
41-}
42-.their-chat .chat-balloon-wrapper {
43- padding-right: 8px;
44+ padding-right: 40px;
45 }
46 .their-chat .avatar {
47 width: 40px;
48@@ -675,8 +668,6 @@ img.avatar-overlay {
49
50 /* Disabling MY avatar because we are not doing this for 1.0 2008-11-05*/
51 .my-chat .avatar-location,
52-.my-chat .avatar-overlay,
53-.my-chat .avatar-container {
54 display: none;
55 width: 40px;
56 height: 40px;
  
1Patch to messaging to make the enter key insert a new-line character rather than sending the message.
2Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
3===================================================================
4--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
6@@ -87,7 +87,7 @@ var ChatviewAssistant = Class.create({
7 this.attachFilePicker = this.attachFilePicker.bind(this);
8 this.handleCancelAttachment = this.resetTextBox.bind(this, false);
9 this.handleTextAreaChange = this.handleTextAreaChange.bind(this);
10- this.handleTextAreaKeyUp = this.handleTextAreaKeyUp.bind(this);
11+ // this.handleTextAreaKeyUp = this.handleTextAreaKeyUp.bind(this);
12 this.handleScreenStateChange = this.handleScreenStateChange.bind(this);
13 this.handleFocus = this.handleFocus.bind(this);
14 this.handleLoseFocus = this.handleLoseFocus.bind(this);
15@@ -103,7 +103,7 @@ var ChatviewAssistant = Class.create({
16 hintText: $L('Enter message here...'),
17 multiline: true,
18 focus: false,
19- enterSubmits: true,
20+ enterSubmits: false,
21 textFieldName: "messageTextElement",
22 className: " ",
23 changeOnKeyPress: true
24@@ -146,7 +146,7 @@ var ChatviewAssistant = Class.create({
25
26 this.cancelAttachment.observe(Mojo.Event.tap, this.handleCancelAttachment);
27
28- this.messageTextElement.observe('keyup', this.handleTextAreaKeyUp);
29+ // this.messageTextElement.observe('keyup', this.handleTextAreaKeyUp);
30 this.messageTextWidget.observe(Mojo.Event.propertyChange, this.handleTextAreaChange);
31
32 // observe keydown/keyup on the text field WIDGET to handle height changes due to text forcing it to resize
33@@ -207,7 +207,7 @@ var ChatviewAssistant = Class.create({
34 this.messageTextWidget.stopObserving('keydown', this.handleTextFieldResize);
35 this.messageTextWidget.stopObserving('keyup', this.handleTextFieldResize);
36 this.messageTextWidget.stopObserving(Mojo.Event.propertyChange, this.handleTextAreaChange);
37- this.messageTextElement.stopObserving('keyup', this.handleTextAreaKeyUp);
38+ // this.messageTextElement.stopObserving('keyup', this.handleTextAreaKeyUp);
39 this.Messaging.DisplayState.stopObserving(this.handleScreenStateChange);
40 this.controller.document.removeEventListener(Mojo.Event.stageActivate, this.handleFocus, false);
41 this.controller.document.removeEventListener(Mojo.Event.stageDeactivate, this.handleLoseFocus, false);
42@@ -1749,12 +1749,12 @@ var ChatviewAssistant = Class.create({
43 }
44 },
45
46- handleTextAreaKeyUp: function(event) {
47+ /* handleTextAreaKeyUp: function(event) {
48 if (event && Mojo.Char.isEnterKey(event.keyCode)) {
49 this.considerForSend();
50 Event.stop(event);
51 }
52- },
53+ }, */
54
55 handleTextAreaChange: function() {
56 if (this.messageTextElement && this.messageTextElement.value == '') {
57Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
58===================================================================
59--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
60+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
61@@ -66,7 +66,7 @@ var ComposeAssistant = Class.create({
62 this.considerForSend = this.considerForSend.bind(this);
63 this.attachFilePicker = this.attachFilePicker.bind(this);
64 this.handleTextAreaChange = this.handleTextAreaChange.bind(this);
65- this.handleTextAreaKeyUp = this.handleTextAreaKeyUp.bind(this);
66+ // this.handleTextAreaKeyUp = this.handleTextAreaKeyUp.bind(this);
67 this.handleCancelAttachment = this.resetTextBox.bind(this,false);
68 this.handleRecipientsChanged = this.handleRecipientsChanged.bind(this);
69 },
70@@ -99,7 +99,7 @@ var ComposeAssistant = Class.create({
71 hintText: $L('Enter message here...'),
72 multiline: true,
73 focus: false,
74- enterSubmits: true,
75+ enterSubmits: false,
76 requiresEnterKey: true,
77 modelProperty: "value",
78 changeOnKeyPress: true
79@@ -126,7 +126,7 @@ var ComposeAssistant = Class.create({
80 });
81
82
83- this.messageTextElement.observe('keyup', this.handleTextAreaKeyUp);
84+ // this.messageTextElement.observe('keyup', this.handleTextAreaKeyUp);
85 this.messageTextWidget.observe(Mojo.Event.propertyChange, this.handleTextAreaChange);
86
87 // Observe add/delete to the addressing widget
88@@ -302,12 +302,12 @@ var ComposeAssistant = Class.create({
89 }
90 },
91
92- handleTextAreaKeyUp: function(event) {
93+ /* handleTextAreaKeyUp: function(event) {
94 if (event && Mojo.Char.isEnterKey(event.keyCode)) {
95 this.considerForSend();
96 Event.stop(event);
97 }
98- },
99+ }, */
100
101 handleTextAreaChange: function() {
102 if (this.messageTextElement && this.messageTextElement.value == '') {
103@@ -398,7 +398,7 @@ var ComposeAssistant = Class.create({
104 that.controller.stopListening('searchList',event,that.handleRecipientsChanged);
105 });
106
107- this.messageTextElement.stopObserving('keyup', this.handleTextAreaKeyUp);
108+ // this.messageTextElement.stopObserving('keyup', this.handleTextAreaKeyUp);
109 this.messageTextWidget.stopObserving(Mojo.Event.propertyChange, this.handleTextAreaChange);
110
111 this.characterCounter.destroy();
  
1Patch to messaging to make the enter key insert a new-line character rather than sending the message.
2Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
3===================================================================
4--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
6@@ -87,7 +87,7 @@ var ChatviewAssistant = Class.create({
7 this.attachFilePicker = this.attachFilePicker.bind(this);
8 this.handleCancelAttachment = this.resetTextBox.bind(this, false);
9 this.handleTextAreaChange = this.handleTextAreaChange.bind(this);
10- this.handleTextAreaKeyUp = this.handleTextAreaKeyUp.bind(this);
11+ // this.handleTextAreaKeyUp = this.handleTextAreaKeyUp.bind(this);
12 this.handleScreenStateChange = this.handleScreenStateChange.bind(this);
13 this.handleFocus = this.handleFocus.bind(this);
14 this.handleLoseFocus = this.handleLoseFocus.bind(this);
15@@ -103,7 +103,7 @@ var ChatviewAssistant = Class.create({
16 hintText: $L('Enter message here...'),
17 multiline: true,
18 focus: false,
19- enterSubmits: true,
20+ enterSubmits: false,
21 textFieldName: "messageTextElement",
22 className: " ",
23 changeOnKeyPress: true
24@@ -146,7 +146,7 @@ var ChatviewAssistant = Class.create({
25
26 this.cancelAttachment.observe(Mojo.Event.tap, this.handleCancelAttachment);
27
28- this.messageTextElement.observe('keyup', this.handleTextAreaKeyUp);
29+ // this.messageTextElement.observe('keyup', this.handleTextAreaKeyUp);
30 this.messageTextWidget.observe(Mojo.Event.propertyChange, this.handleTextAreaChange);
31
32 // observe keydown/keyup on the text field WIDGET to handle height changes due to text forcing it to resize
33@@ -207,7 +207,7 @@ var ChatviewAssistant = Class.create({
34 this.messageTextWidget.stopObserving('keydown', this.handleTextFieldResize);
35 this.messageTextWidget.stopObserving('keyup', this.handleTextFieldResize);
36 this.messageTextWidget.stopObserving(Mojo.Event.propertyChange, this.handleTextAreaChange);
37- this.messageTextElement.stopObserving('keyup', this.handleTextAreaKeyUp);
38+ // this.messageTextElement.stopObserving('keyup', this.handleTextAreaKeyUp);
39 this.Messaging.DisplayState.stopObserving(this.handleScreenStateChange);
40 this.controller.document.removeEventListener(Mojo.Event.stageActivate, this.handleFocus, false);
41 this.controller.document.removeEventListener(Mojo.Event.stageDeactivate, this.handleLoseFocus, false);
42@@ -1749,12 +1749,12 @@ var ChatviewAssistant = Class.create({
43 }
44 },
45
46- handleTextAreaKeyUp: function(event) {
47+ /* handleTextAreaKeyUp: function(event) {
48 if (event && Mojo.Char.isEnterKey(event.keyCode)) {
49 this.considerForSend();
50 Event.stop(event);
51 }
52- },
53+ }, */
54
55 handleTextAreaChange: function() {
56 if (this.messageTextElement && this.messageTextElement.value == '') {
57Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
58===================================================================
59--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
60+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/compose-assistant.js
61@@ -66,7 +66,7 @@ var ComposeAssistant = Class.create({
62 this.considerForSend = this.considerForSend.bind(this);
63 this.attachFilePicker = this.attachFilePicker.bind(this);
64 this.handleTextAreaChange = this.handleTextAreaChange.bind(this);
65- this.handleTextAreaKeyUp = this.handleTextAreaKeyUp.bind(this);
66+ // this.handleTextAreaKeyUp = this.handleTextAreaKeyUp.bind(this);
67 this.handleCancelAttachment = this.resetTextBox.bind(this,false);
68 this.handleRecipientsChanged = this.handleRecipientsChanged.bind(this);
69 },
70@@ -99,7 +99,7 @@ var ComposeAssistant = Class.create({
71 hintText: $L('Enter message here...'),
72 multiline: true,
73 focus: false,
74- enterSubmits: true,
75+ enterSubmits: false,
76 requiresEnterKey: true,
77 modelProperty: "value",
78 changeOnKeyPress: true
79@@ -126,7 +126,7 @@ var ComposeAssistant = Class.create({
80 });
81
82
83- this.messageTextElement.observe('keyup', this.handleTextAreaKeyUp);
84+ // this.messageTextElement.observe('keyup', this.handleTextAreaKeyUp);
85 this.messageTextWidget.observe(Mojo.Event.propertyChange, this.handleTextAreaChange);
86
87 // Observe add/delete to the addressing widget
88@@ -302,12 +302,12 @@ var ComposeAssistant = Class.create({
89 }
90 },
91
92- handleTextAreaKeyUp: function(event) {
93+ /* handleTextAreaKeyUp: function(event) {
94 if (event && Mojo.Char.isEnterKey(event.keyCode)) {
95 this.considerForSend();
96 Event.stop(event);
97 }
98- },
99+ }, */
100
101 handleTextAreaChange: function() {
102 if (this.messageTextElement && this.messageTextElement.value == '') {
103@@ -398,7 +398,7 @@ var ComposeAssistant = Class.create({
104 that.controller.stopListening('searchList',event,that.handleRecipientsChanged);
105 });
106
107- this.messageTextElement.stopObserving('keyup', this.handleTextAreaKeyUp);
108+ // this.messageTextElement.stopObserving('keyup', this.handleTextAreaKeyUp);
109 this.messageTextWidget.stopObserving(Mojo.Event.propertyChange, this.handleTextAreaChange);
110
111 this.characterCounter.destroy();
  
1Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -1837,7 +1837,7 @@ var ChatviewAssistant = Class.create({
6 // This will sometimes be an object because we pass this method directly when we observe
7 // Mojo.Event.tap on the send button
8 if(forceSendIfOffline && forceSendIfOffline != true)
9- forceSendIfOffline = false;
10+ forceSendIfOffline = true;
11
12 // prevent blank messages from going through
13 var message = this.messageTextElement.value.strip();
  
1Index: /usr/palm/applications/com.palm.app.messaging/app/views/listview/buddyList-row.html
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.messaging/app/views/listview/buddyList-row.html
4+++ /usr/palm/applications/com.palm.app.messaging/app/views/listview/buddyList-row.html
5@@ -8,7 +8,7 @@
6 <div class="unread-count-container">
7 <div class="unread-count-wrapper">#{unreadCount}</div>
8 </div>
9- <div class="truncating-text custom-message">#{-customMessage}</div>
10+ <div class="custom-message">#{-customMessage}</div>
11 </div>
12 </div>
13 </div>
14\ No newline at end of file
15Index: /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
16===================================================================
17--- .orig/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
18+++ /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
19@@ -164,7 +164,7 @@ img.avatar-overlay {
20 }
21
22 .buddy-list .palm-row {
23- height: 60px;
24+ height: auto;
25 }
26
27 .buddy-list .title {
  
1diff --git a/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js b/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2index 0c816ba..39d4e6c 100644
3--- a/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ b/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -1750,6 +1750,32 @@ var ChatviewAssistant = Class.create({
6 },
7
8 handleTextAreaKeyUp: function(event) {
9+ if (event && event.ctrlKey && event.keyCode==Mojo.Char.f) {
10+ currentText=this.messageTextElement.value;
11+ oldPos = this.messageTextElement.selectionStart;
12+ newPos = currentText.lastIndexOf(' ',oldPos-1);
13+ if (newPos>-1) {
14+ this.messageTextElement.setSelectionRange(newPos,newPos);
15+ }
16+ else {
17+ this.messageTextElement.setSelectionRange(0,0);
18+ }
19+ Event.stop(event);
20+ }
21+
22+ if (event && event.ctrlKey && event.keyCode==Mojo.Char.g ) {
23+ currentText=this.messageTextElement.value;
24+ oldPos = this.messageTextElement.selectionStart;
25+ newPos = currentText.indexOf(' ',oldPos);
26+ if (newPos>-1) {
27+ this.messageTextElement.setSelectionRange(newPos+1,newPos+1);
28+ }
29+ else {
30+ this.messageTextElement.setSelectionRange(currentText.length,currentText.length);
31+ }
32+ Event.stop(event);
33+ }
34+
35 if (event && Mojo.Char.isEnterKey(event.keyCode)) {
36 this.considerForSend();
37 Event.stop(event);
  
1Updated for 1.2
2Index: /usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html
3===================================================================
4--- .orig/usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html
5+++ /usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html
6@@ -52,9 +52,27 @@
7 </div>
8 </div>
9 </div>
10+ <div id='currentalertrow' class="palm-row" x-mojo-tap-highlight="momentary">
11+ <div class="palm-row-wrapper">
12+ <div class="label" x-mojo-loc=''>Alert</div>
13+ <div id='currentalert' class="title"></div>
14+ </div>
15+ </div>
16+ <div id='currentnotificationrow' class="palm-row" x-mojo-tap-highlight="momentary">
17+ <div class="palm-row-wrapper">
18+ <div class="label" x-mojo-loc=''>Notification</div>
19+ <div id='currentnotification' class="title"></div>
20+ </div>
21+ </div>
22+ <div id='currentmessagerow' class="palm-row" x-mojo-tap-highlight="momentary">
23+ <div class="palm-row-wrapper">
24+ <div class="label" x-mojo-loc=''>Messages</div>
25+ <div id='currentmessage' class="title"></div>
26+ </div>
27+ </div>
28 <div class="palm-row last">
29 <div class="palm-row-wrapper">
30- <div class="title" x-mojo-loc=''>Volume</div>
31+ <div class="title" x-mojo-loc=''>System Volume</div>
32 <div x-mojo-element="Slider" id='systemvolume' class="palm-slider"></div>
33 </div>
34 </div>
35Index: /usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js
36===================================================================
37--- .orig/usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js
38+++ /usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js
39@@ -28,6 +28,60 @@ SystemService.getRingtone = function(cal
40 return request;
41 }
42
43+SystemService.getAlerts = function(callback) {
44+ var request = new Mojo.Service.Request(SystemService.identifier, {
45+ method: 'getPreferences',
46+ parameters: {"keys":["alerttone"]},
47+ onSuccess: callback,
48+ onFailure: callback
49+ });
50+ return request;
51+}
52+
53+SystemService.setAlerts = function(value){
54+ var request = new Mojo.Service.Request(SystemService.identifier, {
55+ method: 'setPreferences',
56+ parameters: {"alerttone":value},
57+ });
58+ return request;
59+}
60+
61+SystemService.getNotifications = function(callback) {
62+ var request = new Mojo.Service.Request(SystemService.identifier, {
63+ method: 'getPreferences',
64+ parameters: {"keys":["notificationtone"]},
65+ onSuccess: callback,
66+ onFailure: callback
67+ });
68+ return request;
69+}
70+
71+SystemService.setNotifications = function(value){
72+ var request = new Mojo.Service.Request(SystemService.identifier, {
73+ method: 'setPreferences',
74+ parameters: {"notificationtone":value},
75+ });
76+ return request;
77+}
78+
79+SystemService.getMessages = function(callback) {
80+ var request = new Mojo.Service.Request(SystemService.identifier, {
81+ method: 'getPreferences',
82+ parameters: {"keys":["messagetone"]},
83+ onSuccess: callback,
84+ onFailure: callback
85+ });
86+ return request;
87+}
88+
89+SystemService.setMessages = function(value){
90+ var request = new Mojo.Service.Request(SystemService.identifier, {
91+ method: 'setPreferences',
92+ parameters: {"messagetone":value},
93+ });
94+ return request;
95+}
96+
97 SystemService.getSystemUISounds = function(callback) {
98 var request = new Mojo.Service.Request(SystemService.identifier, {
99 method: 'getPreferences',
100Index: /usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js
101===================================================================
102--- .orig/usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js
103+++ /usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js
104@@ -94,9 +94,15 @@ var SoundsalertsconfigAssistant = Class.
105 $('system_ui_sounds').observe('mojo-property-change', this.toggleSystemUISounds.bindAsEventListener(this));
106
107 $('currentringtonerow').observe(Mojo.Event.tap, this.showAudioFilePicker.bindAsEventListener(this));
108+ $('currentalertrow').observe(Mojo.Event.tap, this.showAlertFilePicker.bindAsEventListener(this));
109+ $('currentnotificationrow').observe(Mojo.Event.tap, this.showNotificationFilePicker.bindAsEventListener(this));
110+ $('currentmessagerow').observe(Mojo.Event.tap, this.showMessageFilePicker.bindAsEventListener(this));
111
112 this.getCurrentVolumes();
113 this.getCurrentRingtone();
114+ this.getCurrentAlert();
115+ this.getCurrentNotification();
116+ this.getCurrentMessage();
117 this.getVibrateSettings();
118 this.getOtherSettings();
119
120@@ -260,6 +266,84 @@ var SoundsalertsconfigAssistant = Class.
121 $('currentringtone').innerHTML = file.name;
122 },
123
124+ // Alert Picking
125+ getCurrentAlert: function() {
126+ this.getCurrentAlertReq = SystemService.getAlerts(this.getCurrentAlertQuery.bind(this));
127+ },
128+
129+ getCurrentAlertQuery: function(payload) {
130+ if (payload.alerttone) {
131+ $('currentalert').innerHTML = payload.alerttone.name;
132+ this.currAlertPath = payload.alerttone.fullPath;
133+ }
134+ else
135+ $('currentalert').innerHTML = $L("Pick an alert");
136+
137+ },
138+
139+ showAlertFilePicker: function(event) {
140+ var params = {"kinds": ["ringtone"],"filePath":this.currAlertPath,"onSelect":this.selectedAlertFile.bind(this),actionType:"attach",actionName: $L("Done")};
141+ Mojo.FilePicker.pickFile(params,Mojo.Controller.stageController);
142+ },
143+
144+ selectedAlertFile: function(file) {
145+ //var params = {"fullPath": encodeURIComponent(file.fullPath), "name":file.name};
146+ this.setAlertReq = SystemService.setAlerts(file);
147+ $('currentalert').innerHTML = file.name;
148+ },
149+
150+ // Notification Picking
151+ getCurrentNotification: function() {
152+ this.getCurrentNotificationReq = SystemService.getNotifications(this.getCurrentNotificationQuery.bind(this));
153+ },
154+
155+ getCurrentNotificationQuery: function(payload) {
156+ if (payload.notificationtone) {
157+ $('currentnotification').innerHTML = payload.notificationtone.name;
158+ this.currNotificationPath = payload.notificationtone.fullPath;
159+ }
160+ else
161+ $('currentnotification').innerHTML = $L("Pick a notification");
162+
163+ },
164+
165+ showNotificationFilePicker: function(event) {
166+ var params = {"kinds": ["ringtone"],"filePath":this.currNotificationPath,"onSelect":this.selectedNotificationFile.bind(this),actionType:"attach",actionName: $L("Done")};
167+ Mojo.FilePicker.pickFile(params,Mojo.Controller.stageController);
168+ },
169+
170+ selectedNotificationFile: function(file) {
171+ //var params = {"fullPath": encodeURIComponent(file.fullPath), "name":file.name};
172+ this.setNotificationReq = SystemService.setNotifications(file);
173+ $('currentnotification').innerHTML = file.name;
174+ },
175+
176+ // Message Picking
177+ getCurrentMessage: function() {
178+ this.getCurrentMessageReq = SystemService.getMessages(this.getCurrentMessageQuery.bind(this));
179+ },
180+
181+ getCurrentMessageQuery: function(payload) {
182+ if (payload.messagetone) {
183+ $('currentmessage').innerHTML = payload.messagetone.name;
184+ this.currMessagePath = payload.messagetone.fullPath;
185+ }
186+ else
187+ $('currentmessage').innerHTML = $L("Pick an message");
188+
189+ },
190+
191+ showMessageFilePicker: function(event) {
192+ var params = {"kinds": ["ringtone"],"filePath":this.currMessagePath,"onSelect":this.selectedMessageFile.bind(this),actionType:"attach",actionName: $L("Done")};
193+ Mojo.FilePicker.pickFile(params,Mojo.Controller.stageController);
194+ },
195+
196+ selectedMessageFile: function(file) {
197+ //var params = {"fullPath": encodeURIComponent(file.fullPath), "name":file.name};
198+ this.setMessageReq = SystemService.setMessages(file);
199+ $('currentmessage').innerHTML = file.name;
200+ },
201+
202 getVibrateSettings: function() {
203 this.getVibrateSettingsReq = AudioService.getVibrateSettings(this.vibrateSettingsCB.bind(this),this);
204 },
205Index: /usr/palm/applications/com.palm.app.contacts/app/controllers/edit-assistant.js
206===================================================================
207--- .orig/usr/palm/applications/com.palm.app.contacts/app/controllers/edit-assistant.js
208+++ /usr/palm/applications/com.palm.app.contacts/app/controllers/edit-assistant.js
209@@ -63,6 +63,17 @@ EditAssistant = Class.create({
210 template: "edit/ringtones"
211 }));
212
213+ if(this.person.messagingRingtoneName){
214+ this.person.MsgtoneDisplay = this.person.messagingRingtoneName;
215+ this.person.MsgtoneSet = "msgtone-set";
216+ } else {
217+ this.person.MsgtoneDisplay = $L("Set a message tone");
218+ this.person.MsgtoneSet = "";
219+ }
220+ this.controller.get("MsgtoneBox").update(Mojo.View.render({
221+ object: this.person,
222+ template: "edit/msgtones"
223+ }));
224
225 var that = this;
226
227@@ -264,6 +275,11 @@ EditAssistant = Class.create({
228 object: {ringtoneDisplay:ringtoneName},
229 template: "edit/ringtones"
230 }));
231+ var messagingRingtoneName = this.person.messagingRingtoneName || $L("Set a message tone");
232+ this.controller.get("MsgtoneBox").update(Mojo.View.render({
233+ object: {MsgtoneDisplay:messagingRingtoneName},
234+ template: "edit/msgtones"
235+ }));
236
237 }
238 }
239@@ -521,6 +537,7 @@ EditAssistant = Class.create({
240 this.controller.listen("NameSyncPickerWrapper", Mojo.Event.tap, this.popupContactChooser.bind(this));
241 this.controller.get("edit-photo").observe(Mojo.Event.tap, this.attachFilePicker.bind(this));
242 this.controller.get("RingtoneBox").observe(Mojo.Event.tap, this.attachRingtonePicker.bind(this));
243+ this.controller.get("MsgtoneBox").observe(Mojo.Event.tap, this.attachMsgtonePicker.bind(this));
244 this.renderLabels();
245 this.setupContact();
246 if (this.contact.readOnly) {
247Index: /usr/palm/applications/com.palm.app.contacts/app/controllers/filepicker-behaviors.js
248===================================================================
249--- .orig/usr/palm/applications/com.palm.app.contacts/app/controllers/filepicker-behaviors.js
250+++ /usr/palm/applications/com.palm.app.contacts/app/controllers/filepicker-behaviors.js
251@@ -56,6 +56,55 @@ var FilepickerBehaviors = {
252 Mojo.FilePicker.pickFile(params, this.controller.stageController);
253
254 },
255+
256+ attachMsgtonePicker: function(event){
257+ if(this.person.messagingRingtoneLoc){
258+ this.controller.popupSubmenu( {
259+ onChoose:function(c){
260+ if(c == "CHANGE"){
261+ this.pushMsgtonePicker();
262+ } else if(c == "DELETE"){
263+ this.clearMsgtone();
264+ }
265+ }.bind(this),
266+ placeNear:event.target,
267+ items:[
268+ {label:$L("Change Msgtone"), command:'CHANGE'},
269+ {label:$L("Delete Msgtone"), command:'DELETE'}
270+ ]
271+ })
272+ } else {
273+ this.pushMsgtonePicker();
274+ }
275+
276+ },
277+
278+ clearMsgtone:function(){
279+ this.person.messagingRingtoneLoc = "";
280+ this.person.messagingRingtoneName = "";
281+ this.person.MsgtoneDisplay = $L("Set a message tone");
282+ this.person.MsgtoneSet = "";
283+ this.person.dirty = true;
284+ this.controller.get("MsgtoneBox").update(Mojo.View.render({
285+ object:this.person,
286+ template:"edit/msgtones"
287+ }));
288+ },
289+
290+ pushMsgtonePicker:function(){
291+ var params = {
292+ actionType: 'attach',
293+ kinds: ['ringtone'],
294+ defaultKind: 'ringtone',
295+ filePath:this.person.messagingRingtoneLoc,
296+ onSelect: function(file){
297+ this.attachMsgtone(this.sanitizeSystemPath(file.fullPath), file.name);
298+ }.bind(this)
299+ };
300+ //Mojo.Log.info("ContactMulti Picking a msgtone for " + this.contact.firstName + " " + this.contact.lastName);
301+ Mojo.FilePicker.pickFile(params, this.controller.stageController);
302+
303+ },
304
305 attachFilePicker: function(event){
306 if(this.contact.readOnly){
307@@ -150,6 +199,20 @@ var FilepickerBehaviors = {
308 template:"edit/ringtones"
309 }));
310 }
311+ },
312+
313+ attachMsgtone: function(msgtonePath, name){
314+ if (msgtonePath) {
315+ this.person.dirty = true;
316+ this.person.messagingRingtoneName = name;
317+ this.person.MsgtoneDisplay = name;
318+ this.person.MsgtoneSet = "msgtone-set";
319+ this.person.messagingRingtoneLoc = msgtonePath;
320+ this.controller.get("MsgtoneBox").update(Mojo.View.render({
321+ object:this.person,
322+ template:"edit/msgtones"
323+ }));
324+ }
325 }
326 }
327
328Index: /usr/palm/applications/com.palm.app.contacts/app/views/edit/lists-fake.html
329===================================================================
330--- .orig/usr/palm/applications/com.palm.app.contacts/app/views/edit/lists-fake.html
331+++ /usr/palm/applications/com.palm.app.contacts/app/views/edit/lists-fake.html
332@@ -32,6 +32,20 @@
333 </div>
334 </div>
335 </div>
336+<div>
337+<div id="MsgtoneBox" class="">
338+ <div class="palm-group unlabeled">
339+ <div class="palm-list">
340+ <div class="palm-row single" id="MsgtoneButton" x-mojo-tap-highlight="momentary">
341+ <div class="palm-row-wrapper">
342+ <div class="title" x-mojo-loc="">
343+ Set a message tone
344+ </div>
345+ </div>
346+ </div>
347+ </div>
348+ </div>
349+</div>
350 </div>
351 <div>
352 <div id="emailList" name="emailList" class="contactPointList" >
353Index: /usr/palm/applications/com.palm.app.contacts/app/views/edit/msgtones.html
354===================================================================
355--- /dev/null
356+++ /usr/palm/applications/com.palm.app.contacts/app/views/edit/msgtones.html
357@@ -0,0 +1,16 @@
358+<div class="palm-group unlabeled">
359+ <div class="palm-list">
360+ <div class="palm-row single #{MsgtoneSet} msgtone-button" id="MsgtoneButton" x-mojo-tap-highlight="momentary">
361+ <div class="palm-row-wrapper">
362+ <div class="label right truncating-text" x-mojo-loc=''>
363+ Msgtone
364+ </div>
365+ <div class="title">
366+ <div class="truncating-text">
367+ #{MsgtoneDisplay}
368+ </div>
369+ </div>
370+ </div>
371+ </div>
372+ </div>
373+</div>
374Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
375===================================================================
376--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
377+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
378@@ -434,7 +434,8 @@ var ListviewAssistant = Class.create(App
379 // if we are in the history view and the screen is on, do not display a banner + dashboard, just play a notification sound
380 if (this.isScreenOn) {
381 if (data.notificationType == this.Messaging.notificationTypes.newMessage && this.currentListView == this.Messaging.Views.HISTORY) {
382- data = {playSoundOnly:true};
383+ data = $H(data);
384+ data = data.merge({playSoundOnly:true});
385 }
386 }
387 return data;
388Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
389===================================================================
390--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
391+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
392@@ -346,7 +346,8 @@ var ChatviewAssistant = Class.create({
393 if(this.isScreenOn && data.chatThreadId == this.chatThreadId) {
394 Mojo.Log.info("[CV] ****** chatview considerForNotification --- screen is on!");
395 if(data.notificationType == this.Messaging.notificationTypes.newMessage) {
396- data = {playSoundOnly:true};
397+ data = $H(data);
398+ data = data.merge({playSoundOnly:true});
399 } else if( data.notificationType == this.Messaging.notificationTypes.sendFailure) {
400 data = {}; // wipe out the notification because we are in the chat
401 }
402Index: /usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
403===================================================================
404--- .orig/usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
405+++ /usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
406@@ -993,5 +993,168 @@ var MessagingMojoService = {
407 method: 'setSMSCAddressAndEmailGateway',
408 parameters: {smscAddr:address, emailGateway: gateway}
409 });
410+ },
411+
412+ isNumberValid: function(number) {
413+ return !(number === undefined
414+ || number == null
415+ || number == ""
416+ || number == "unknown"
417+ || number == "unknown caller"
418+ || number == "blocked caller")
419+ },
420+
421+ // use contacts service and carrier book to perform reverse lookup on number. stores results in passed contact object.
422+ // runs callback when done.
423+ // if the number isn't valid, marks contact lookup complete
424+ // if there's already one happening, or one already completed, just fires callback
425+ // if there's a lateCallback provided, calls that if the result comes much later
426+ rLookup: function(number, contact, callback, lateCallback){
427+
428+ //Reset contact to always get the tone
429+ contact = {};
430+ Mojo.Log.error("Current contact value: %j",contact);
431+ Mojo.Log.error("SMS ID: %j",number);
432+
433+ // bail if the number is invalid
434+ if (!(this.isNumberValid(number))) {
435+ this.finishLookup(contact, callback);
436+ return;
437+ }
438+
439+ if (contact.lookupComplete) {
440+ callback(contact);
441+ return;
442+ }
443+
444+ if (contact.lookupPending) {
445+ callback(contact);
446+ return;
447+ }
448+
449+
450+ // use contacts service to perform lookup.
451+ // if contact already has an id in it, use person lookup
452+ // instead of doing reverse lookup on number
453+ contact.lookupPending = true;
454+ var method, params;
455+ if (contact.initialId) {
456+ method = 'basicDetails'
457+ params = {'id' : contact.initialId}
458+ delete contact.initialId;
459+ } else {
460+ method = 'reverseLookup'
461+ params = {
462+ 'value': number,
463+ 'type': "phone"
464+ }
465+ }
466+ this.lastRequest = new Mojo.Service.Request('palm://com.palm.contacts', {
467+ 'method': method,
468+ parameters: params,
469+ onSuccess: this.onLookup.bind(this, number, contact, callback, lateCallback),
470+ onFailure: function() {
471+ // cancel previous lookup, so this doesn't fire on a service crash
472+ if (this.lastRequest) {
473+ this.lastRequest.cancel();
474+ this.lastRequest = undefined;
475+ }
476+
477+ this.carrierBookLookup(number,contact);
478+ this.finishLookup(contact, callback);
479+ }.bind(this)
480+ });
481+
482+ // timeout if lookup hasn't completed in 4 seconds
483+ this.lookupTimeout = setTimeout(this.onLookupTimeout.bind(this, contact, callback, lateCallback), 4000);
484+ },
485+
486+ // when contact lookup returns, check for valid result
487+ // if valid result, grab name, ringtone; if there's a picture, start loading and set callback to measure it
488+ // if no valid result, look in carrier book
489+ // fire callback when done
490+ onLookup: function(number, contact, callback, lateCallback, result){
491+ Mojo.Log.info( "PhoneApp: Contact::onLookup CALLER ID LOOKUP %s RETURNED %j" , number , result);
492+ var statusChange = "";
493+
494+ // cancel previous lookup, so this doesn't fire on a service crash
495+ if (this.lastRequest) {
496+ this.lastRequest.cancel();
497+ this.lastRequest = undefined;
498+ }
499+
500+ if (result.record) {
501+ /*
502+ // don't match if the number we get back is different than the number
503+ // we passed in (provided the lengths are the same)
504+ if (!(result.record.number)
505+ || ( (result.record.number) && ( (result.record.number.length !== number.length)
506+ || (result.record.number.length === number.length
507+ && result.record.number === number)))) {
508+ */
509+ contact.id = result.record.id;
510+
511+
512+ contact.ringtoneLoc = result.record.messagingRingtoneLoc;
513+ Mojo.Log.error("MSGTone: %j",contact.ringtoneLoc);
514+
515+ }
516+
517+ this.finishLookup(contact, callback, lateCallback);
518+ },
519+
520+
521+
522+ // mark complete; cancel timeout; fire callback if it hasn't fired yet
523+ finishLookup: function(contact, callback, lateCallback) {
524+ contact.lookupPending = false;
525+
526+ // cancel lookup timeout
527+ clearTimeout(this.lookupTimeout);
528+ this.lookupTimeout = undefined;
529+
530+ if (!(contact.lookupComplete)) {
531+ contact.lookupComplete = true;
532+ callback(contact);
533+ // if we have a late return, and we got a contact result, call
534+ // the late return update
535+ } else if (lateCallback && contact.doLateCallback && contact.id) {
536+ contact.doLateCallback = false;
537+ lateCallback.delay(5, contact);
538+ } else {
539+ }
540+
541+ },
542+
543+ // flag lookup as done; proceed with callback
544+ onLookupTimeout: function(contact, callback, lateCallback) {
545+
546+ if (lateCallback) {
547+ contact.doLateCallback = true;
548+ } else if (this.lastRequest && !lateCallback) {
549+ // cancel previous lookup, so this doesn't fire on a service crash
550+ this.lastRequest.cancel();
551+ this.lastRequest = undefined;
552+ }
553+
554+ // clear timeout
555+ this.lookupTimeout = undefined;
556+
557+ // flag done; fire callback if it hasn't yet
558+ contact.lookupComplete = true;
559+ var lookupWasPending = contact.lookupPending;
560+ contact.lookupPending = false;
561+ if (lookupWasPending)
562+ callback(contact);
563+ },
564+
565+ getMessagetone: function(callback) {
566+ var request = new Mojo.Service.Request('palm://com.palm.systemservice', {
567+ method: 'getPreferences',
568+ parameters: {"keys":["messagetone"]},
569+ onSuccess: callback,
570+ onFailure: callback
571+ });
572+ return request;
573 }
574 };
575\ No newline at end of file
576Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/notification-assistant.js
577===================================================================
578--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/notification-assistant.js
579+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/notification-assistant.js
580@@ -27,6 +27,8 @@ function NotificationAssistant(controlle
581 };
582 }
583
584+var contact = {};
585+
586 NotificationAssistant.prototype.subscribeToNotifications = function(){
587 this.messageNotificationRequest = MessagingMojoService.registerForIncomingMessages({onSuccess: this.sendNotification.bind(this, this.Messaging.notificationTypes.newMessage)});
588 this.sendErrorNotificationRequest = MessagingMojoService.registerForSendFailures(this.sendNotification.bind(this, this.Messaging.notificationTypes.sendFailure));
589@@ -35,6 +37,37 @@ NotificationAssistant.prototype.subscrib
590 this.airplaneModeNotificationRequest = MessagingMojoService.registerForAirplaneModeNotifications(this.sendAirplaneModeNotification.bind(this));
591 };
592
593+NotificationAssistant.prototype.doBanner = function(bannerParams,bannerLaunchParams,bannerType,payload) {
594+ if (payload.messagetone.fullPath)
595+ bannerParams.soundFile = payload.messagetone.fullPath;
596+ this.controller.showBanner(bannerParams,bannerLaunchParams,bannerType);
597+};
598+
599+NotificationAssistant.prototype.playMessagetone = function(payload){
600+ if (payload.messagetone.fullPath)
601+ this.controller.playSoundNotification('alerts',payload.messagetone.fullPath);
602+ else
603+ this.controller.playSoundNotification('alerts','');
604+};
605+
606+NotificationAssistant.prototype.doB = function(bannerParams,bannerLaunchParams,bannerType,contact) {
607+ Mojo.Log.error("Banner Ringtone: %j",contact.ringtoneLoc);
608+ if (contact.ringtoneLoc) {
609+ bannerParams.soundFile = contact.ringtoneLoc;
610+ this.controller.showBanner(bannerParams,bannerLaunchParams,bannerType);
611+ } else {
612+ MessagingMojoService.getMessagetone(this.doBanner.bind(this,bannerParams,bannerLaunchParams,'chat'));
613+ }
614+};
615+
616+NotificationAssistant.prototype.playmsgtone = function(contact){
617+ Mojo.Log.error("Playmsgtone Ringtone: %j",contact.ringtoneLoc);
618+ if (contact.ringtoneLoc)
619+ this.controller.playSoundNotification('alerts',contact.ringtoneLoc);
620+ else
621+ MessagingMojoService.getMessagetone(this.playMessagetone.bind(this));
622+};
623+
624 NotificationAssistant.prototype.sendNotification = function(notificationType, resp){
625 if (window.PalmSystem && !resp.returnValue) {
626 try {
627@@ -140,7 +173,8 @@ NotificationAssistant.prototype.consider
628
629 // check if we should only play a sound (when you are already in a chat & a new message comes in)
630 if(notificationData.get('playSoundOnly') && this.Messaging.messagingPrefs.enableNotificationSound) {
631- this.controller.playSoundNotification('alerts','');
632+ var smsid = notificationData.get('address');
633+ MessagingMojoService.rLookup(smsid,contact,this.playmsgtone.bind(this),this.playmsgtone.bind(this));
634 return; // don't display any visual notification
635 }
636
637@@ -176,10 +210,11 @@ NotificationAssistant.prototype.sendClas
638
639 notificationData.set('alertTitle',alertTitle);
640 this.class0AlertData.list.push(notificationData);
641- this.renderClass0PopupAlert(true);
642+ var smsid = notificationData.get('address');
643+ MessagingMojoService.getMessagetone(this.renderClass0PopupAlert.bind(this,true));
644 };
645
646-NotificationAssistant.prototype.renderClass0PopupAlert = function(playSound) {
647+NotificationAssistant.prototype.renderClass0PopupAlert = function(playSound,messageTone) {
648 var class0Stage = this.controller.getStageController(Class0AlertStageName);
649
650 if(class0Stage) {
651@@ -188,6 +223,8 @@ NotificationAssistant.prototype.renderCl
652 var soundClass = 'none';
653 if(playSound) {
654 soundClass = 'alerts';
655+ if(messageTone)
656+ soundFile = messageTone;
657 }
658
659 var pushClass0AlertScene = function(stageController) {
660@@ -198,7 +235,8 @@ NotificationAssistant.prototype.renderCl
661 name: Class0AlertStageName,
662 lightweight: true,
663 height: 300,
664- soundclass: soundClass
665+ soundclass: soundClass,
666+ soundfile: soundFile
667 }, pushClass0AlertScene, 'popupalert');
668 }
669
670@@ -253,8 +291,6 @@ NotificationAssistant.prototype.sendNewM
671 var bannerParams = {
672 messageText: notificationText
673 };
674- if (this.Messaging.messagingPrefs.enableNotificationSound)
675- bannerParams.soundClass = "alerts";
676 var bannerLaunchParams = {
677 chatThreadId: chatThreadId,
678 clearBanner: true
679@@ -262,10 +298,17 @@ NotificationAssistant.prototype.sendNewM
680
681 if (this.Messaging.DisplayState.isDisplayOn()) {
682 Mojo.Log.info("notificationAssistant - executing full banner notification");
683- this.controller.showBanner(bannerParams, bannerLaunchParams, 'chat');
684+ if (this.Messaging.messagingPrefs.enableNotificationSound) {
685+ var smsid = notificationData.get('address');
686+ bannerParams.soundClass = "alerts";
687+ MessagingMojoService.rLookup(smsid,contact,this.doB.bind(this,bannerParams,bannerLaunchParams,'chat'),this.doB.bind(this,bannerParams,bannerLaunchParams,'chat'));
688+ } else {
689+ Mojo.Log.error("Setting banner params");
690+ this.controller.showBanner(bannerParams, bannerLaunchParams, 'chat');
691+ }
692 } else if (this.Messaging.messagingPrefs.enableNotificationSound) {
693- Mojo.Log.info("notificationAssistant - playing sound notification only");
694- this.controller.playSoundNotification('alerts','');
695+ var smsid = notificationData.get('address');
696+ MessagingMojoService.rLookup(smsid,contact,this.playmsgtone.bind(this),this.playmsgtone.bind(this));
697 }
698
699 // Store the data so it can be used in the dashboard
700@@ -324,13 +367,9 @@ NotificationAssistant.prototype.sendNewM
701 // delay creating the dashboard window for the case where the banner is clicked on
702 // to take you to the chat view. This will likely result in the dashboard data
703 // being cleared. If the dashboard data is empty, we do not need to create the dashboard.
704- if (this.Messaging.DisplayState.isDisplayOn()) {
705- if (!this.isNewMessageDashboardPending) {
706- this.isNewMessageDashboardPending = true;
707- createDashboard.delay(5);
708- }
709- } else {
710- createDashboard(); // if the screen is off, create the dashboard right away
711+ if (!this.isNewMessageDashboardPending) {
712+ this.isNewMessageDashboardPending = true;
713+ createDashboard.delay(5);
714 }
715 }
716 };
  
1Timestamps all messages with the method used to timestamp messages that show up late
2
3Modified for 1.2 by StoneRyno
4
5Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
6===================================================================
7--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
8+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
9@@ -1303,7 +1303,7 @@ var ChatviewAssistant = Class.create({
10
11 // if the INCOMING message was sent longer than 10 minutes before it arrived on device,
12 // add sent date to indicate that this delay happened
13- if(!ChatFlags.isOutgoing(msg.flags) && msg.deviceTimeStamp && msg.timeStamp && (msg.deviceTimeStamp-msg.timeStamp) > (1000*60*10)) {
14+// if(!ChatFlags.isOutgoing(msg.flags) && msg.deviceTimeStamp && msg.timeStamp && (msg.deviceTimeStamp-msg.timeStamp) > (1000*60*10)) {
15 var d = new Date();
16 var today = d.getTime();
17 d.setTime(msg.timeStamp);
18@@ -1311,10 +1311,10 @@ var ChatviewAssistant = Class.create({
19
20 // Only show the message sent time if it is less than two days old
21 // from when it arrived on device
22- if(today-msg.timeStamp <= (1000*60*60*24*2)) {
23+// if(today-msg.timeStamp <= (1000*60*60*24*2)) {
24 msg.timeStampDeltaMsg = new Template($L("Message Sent: #{dateTime}")).evaluate({dateTime:Mojo.Format.formatDate(sentTimeStamp,'short')});
25- }
26- }
27+// }
28+// }
29
30 if (msg.callbackNumber) {
31 msg.callbackNumber = PalmSystem.runTextIndexer(msg.callbackNumber);
  
1Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -1245,6 +1245,11 @@ var ChatviewAssistant = Class.create({
6 var d = new Date();
7 d.setTime(msg.deviceTimeStamp);
8 msg.niceDate = BucketDateFormatter.getDateBucket(d,true,true); // this used to use msg.timeStamp - changed 2008-11-05
9+
10+ // timestamp hack - enables timestamps on all messages
11+ var ts = new Date();
12+ ts.setTime(msg.deviceTimeStamp);
13+ msg.timeStampText = Mojo.Format.formatDate(ts,'short');
14
15 // divider hack - round to the nearest 5 minutes
16 // we have to do this because the list divider implementation does not allow a divider
17@@ -1252,11 +1257,11 @@ var ChatviewAssistant = Class.create({
18 var deviceTimeStampMinutes = d.getMinutes();
19 d.setMinutes((deviceTimeStampMinutes - (deviceTimeStampMinutes % 5)));
20 d.setSeconds(0);
21- msg.dividerText = msg.transportClass + BucketDateFormatter.getDateBucket(d,true,true);
22+ msg.dividerText = msg.transportClass; // + BucketDateFormatter.getDateBucket(d,true,true);
23
24 // if the INCOMING message was sent longer than 10 minutes before it arrived on device,
25 // add sent date to indicate that this delay happened
26- if(!ChatFlags.isOutgoing(msg.flags) && msg.deviceTimeStamp && msg.timeStamp && (msg.deviceTimeStamp-msg.timeStamp) > (1000*60*10)) {
27+ // if(!ChatFlags.isOutgoing(msg.flags) && msg.deviceTimeStamp && msg.timeStamp && (msg.deviceTimeStamp-msg.timeStamp) > (1000*60*10)) { // timestamp fix var d = new Date();
28 var d = new Date();
29 var today = d.getTime();
30 d.setTime(msg.timeStamp);
31@@ -1264,10 +1269,10 @@ var ChatviewAssistant = Class.create({
32
33 // Only show the message sent time if it is less than two days old
34 // from when it arrived on device
35- if(today-msg.timeStamp <= (1000*60*60*24*2)) {
36- msg.timeStampDeltaMsg = new Template($L("Message Sent: #{dateTime}")).evaluate({dateTime:Mojo.Format.formatDate(sentTimeStamp,'short')});
37- }
38- }
39+ // if(today-msg.timeStamp <= (1000*60*60*24*2)) { // timestamp fix
40+ msg.timeStampDeltaMsg = new Template($L("#{dateTime}")).evaluate({dateTime:Mojo.Format.formatDate(sentTimeStamp,'short')});
41+ // } // timestamp fix
42+ // } // timestamp fix
43
44 if (msg.callbackNumber) {
45 msg.callbackNumber = PalmSystem.runTextIndexer(msg.callbackNumber);
46Index: /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
47===================================================================
48--- .orig/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
49+++ /usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
50@@ -681,7 +681,12 @@ img.avatar-overlay {
51 width: 40px;
52 height: 40px;
53 }
54-
55+/* timestamp formatting */
56+.timeStamp {
57+ font-size: 12px;
58+ font-style: italic;
59+ color: #1111ff;
60+ }
61 .message.status-success {
62 color: #000000;
63 }
  
1diff --git a/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js b/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2index 0c816ba..37f0501 100644
3--- a/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ b/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -1212,6 +1212,9 @@ var ChatviewAssistant = Class.create({
6 preFormatChatList: function(stuff){
7 for(var i=0; i<stuff.list.length; i++) {
8 var msg = stuff.list[i];
9+ var ts = new Date();
10+ ts.setTime(msg.timeStamp);
11+ msg.timeStampText = Mojo.Format.formatDate(ts,'short');
12 if(msg.summary && !ChatFlags.isTransient(msg.flags)) {
13 msg.summary = msg.summary.escapeHTML();
14 msg.summary = PalmSystem.runTextIndexer(msg.summary);
15@@ -1235,7 +1238,7 @@ var ChatviewAssistant = Class.create({
16 var deviceTimeStampMinutes = d.getMinutes();
17 d.setMinutes((deviceTimeStampMinutes - (deviceTimeStampMinutes % 5)));
18 d.setSeconds(0);
19- msg.dividerText = msg.transportClass + BucketDateFormatter.getDateBucket(d,true,true);
20+ msg.dividerText = msg.transportClass; // + BucketDateFormatter.getDateBucket(d,true,true);
21
22 // if the INCOMING message was sent longer than 10 minutes before it arrived on device,
23 // add sent date to indicate that this delay happened
24diff --git a/usr/palm/applications/com.palm.app.messaging/app/views/chatview/message/message-text.html b/usr/palm/applications/com.palm.app.messaging/app/views/chatview/message/message-text.html
25index 97ff521..95b2ba6 100644
26--- a/usr/palm/applications/com.palm.app.messaging/app/views/chatview/message/message-text.html
27+++ b/usr/palm/applications/com.palm.app.messaging/app/views/chatview/message/message-text.html
28@@ -1 +1 @@
29-<div class="messageText">#{-messageText} #{-errorContent}</div>
30\ No newline at end of file
31+<div class="messageText"><span class="timeStamp">#{-timeStampText}</span><pre>#{-messageText}</pre> #{-errorContent}</div>
32diff --git a/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css b/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
33index fe6127a..5eceb3d 100644
34--- a/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
35+++ b/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
36@@ -659,6 +659,18 @@ img.avatar-overlay {
37 font-size:14px;
38 }
39
40+.messageText pre {
41+ font-family: inherit;
42+ font-size: inherit;
43+ color: inherit;
44+}
45+.timeStamp {
46+ font-size: 12px;
47+font-st yle: italic;
48+ color: #1111ff;
49+}
50+
51+
52 .my-chat .chat-balloon-wrapper,
53 .their-chat .chat-balloon-wrapper {
54 padding: 1px 0;
  
1diff --git a/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js b/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2index 0c816ba..37f0501 100644
3--- a/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ b/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -1212,6 +1212,9 @@ var ChatviewAssistant = Class.create({
6 preFormatChatList: function(stuff){
7 for(var i=0; i<stuff.list.length; i++) {
8 var msg = stuff.list[i];
9+ var ts = new Date();
10+ ts.setTime(msg.timeStamp);
11+ msg.timeStampText = Mojo.Format.formatDate(ts,'short');
12 if(msg.summary && !ChatFlags.isTransient(msg.flags)) {
13 msg.summary = msg.summary.escapeHTML();
14 msg.summary = PalmSystem.runTextIndexer(msg.summary);
15@@ -1235,7 +1238,7 @@ var ChatviewAssistant = Class.create({
16 var deviceTimeStampMinutes = d.getMinutes();
17 d.setMinutes((deviceTimeStampMinutes - (deviceTimeStampMinutes % 5)));
18 d.setSeconds(0);
19- msg.dividerText = msg.transportClass + BucketDateFormatter.getDateBucket(d,true,true);
20+ msg.dividerText = msg.transportClass; // + BucketDateFormatter.getDateBucket(d,true,true);
21
22 // if the INCOMING message was sent longer than 10 minutes before it arrived on device,
23 // add sent date to indicate that this delay happened
24diff --git a/usr/palm/applications/com.palm.app.messaging/app/views/chatview/message/message-text.html b/usr/palm/applications/com.palm.app.messaging/app/views/chatview/message/message-text.html
25index 97ff521..95b2ba6 100644
26--- a/usr/palm/applications/com.palm.app.messaging/app/views/chatview/message/message-text.html
27+++ b/usr/palm/applications/com.palm.app.messaging/app/views/chatview/message/message-text.html
28@@ -1 +1 @@
29-<div class="messageText">#{-messageText} #{-errorContent}</div>
30\ No newline at end of file
31+<div class="messageText"><span class="timeStamp">#{-timeStampText}</span><pre>#{-messageText}</pre> #{-errorContent}</div>
32diff --git a/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css b/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
33index fe6127a..5eceb3d 100644
34--- a/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
35+++ b/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
36@@ -659,6 +659,18 @@ img.avatar-overlay {
37 font-size:14px;
38 }
39
40+.messageText pre {
41+ font-family: inherit;
42+ font-size: inherit;
43+ color: inherit;
44+}
45+.timeStamp {
46+ font-size: 12px;
47+font-st yle: italic;
48+ color: #1111ff;
49+}
50+
51+
52 .my-chat .chat-balloon-wrapper,
53 .their-chat .chat-balloon-wrapper {
54 padding: 1px 0;
  
1diff --git a/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js b/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
2index 4c7cdbe..52563c8 100644
3--- a/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
4+++ b/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
5@@ -1347,7 +1347,7 @@ var ChatviewAssistant = Class.create({
6 if (ChatFlags.isOutgoing(msg.flags)) {
7 tmpClass.push("my-chat");
8 // Disabling MY avatar because we are not doing this for 1.0 2008-11-05
9- //msg.avatar = this.myAvatar || 'images/my-avatar.png';
10+ msg.avatar = this.myAvatar || 'images/my-avatar.png';
11 } else {
12 tmpClass.push("their-chat");
13 msg.avatar = this.avatarHash[msg.fromAddress] || this.contactAvatar || "images/list-view-default-avatar.png";
14diff --git a/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css b/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
15index 13251fe..b624a0f 100644
16--- a/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
17+++ b/usr/palm/applications/com.palm.app.messaging/stylesheets/messaging.css
18@@ -137,16 +137,11 @@ img.avatar-overlay {
19 }
20
21 .chatRow img.avatar-location {
22- margin-top: -18px;
23+ margin-top: -39px;
24 }
25
26 .chatRow img.avatar-overlay {
27- margin-top: -21px;
28-}
29-
30-.chatRow .avatar-container {
31- vertical-align: middle;
32- display: inline-block;
33+ margin-top: -42.5px;
34 }
35
36 .login-animation-available,
37@@ -664,9 +659,7 @@ img.avatar-overlay {
38 padding: 1px 0;
39 font-size: 18px;
40 word-wrap: break-word !important;
41-}
42-.their-chat .chat-balloon-wrapper {
43- padding-right: 8px;
44+ padding-right: 40px;
45 }
46 .their-chat .avatar {
47 width: 40px;
48@@ -675,8 +668,6 @@ img.avatar-overlay {
49
50 /* Disabling MY avatar because we are not doing this for 1.0 2008-11-05*/
51 .my-chat .avatar-location,
52-.my-chat .avatar-overlay,
53-.my-chat .avatar-container {
54 display: none;
55 width: 40px;
56 height: 40px;
  
1Updated for 1.2
2Index: /usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html
3===================================================================
4--- .orig/usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html
5+++ /usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html
6@@ -52,9 +52,27 @@
7 </div>
8 </div>
9 </div>
10+ <div id='currentalertrow' class="palm-row" x-mojo-tap-highlight="momentary">
11+ <div class="palm-row-wrapper">
12+ <div class="label" x-mojo-loc=''>Alert</div>
13+ <div id='currentalert' class="title"></div>
14+ </div>
15+ </div>
16+ <div id='currentnotificationrow' class="palm-row" x-mojo-tap-highlight="momentary">
17+ <div class="palm-row-wrapper">
18+ <div class="label" x-mojo-loc=''>Notification</div>
19+ <div id='currentnotification' class="title"></div>
20+ </div>
21+ </div>
22+ <div id='currentmessagerow' class="palm-row" x-mojo-tap-highlight="momentary">
23+ <div class="palm-row-wrapper">
24+ <div class="label" x-mojo-loc=''>Messages</div>
25+ <div id='currentmessage' class="title"></div>
26+ </div>
27+ </div>
28 <div class="palm-row last">
29 <div class="palm-row-wrapper">
30- <div class="title" x-mojo-loc=''>Volume</div>
31+ <div class="title" x-mojo-loc=''>System Volume</div>
32 <div x-mojo-element="Slider" id='systemvolume' class="palm-slider"></div>
33 </div>
34 </div>
35Index: /usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js
36===================================================================
37--- .orig/usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js
38+++ /usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js
39@@ -28,6 +28,60 @@ SystemService.getRingtone = function(cal
40 return request;
41 }
42
43+SystemService.getAlerts = function(callback) {
44+ var request = new Mojo.Service.Request(SystemService.identifier, {
45+ method: 'getPreferences',
46+ parameters: {"keys":["alerttone"]},
47+ onSuccess: callback,
48+ onFailure: callback
49+ });
50+ return request;
51+}
52+
53+SystemService.setAlerts = function(value){
54+ var request = new Mojo.Service.Request(SystemService.identifier, {
55+ method: 'setPreferences',
56+ parameters: {"alerttone":value},
57+ });
58+ return request;
59+}
60+
61+SystemService.getNotifications = function(callback) {
62+ var request = new Mojo.Service.Request(SystemService.identifier, {
63+ method: 'getPreferences',
64+ parameters: {"keys":["notificationtone"]},
65+ onSuccess: callback,
66+ onFailure: callback
67+ });
68+ return request;
69+}
70+
71+SystemService.setNotifications = function(value){
72+ var request = new Mojo.Service.Request(SystemService.identifier, {
73+ method: 'setPreferences',
74+ parameters: {"notificationtone":value},
75+ });
76+ return request;
77+}
78+
79+SystemService.getMessages = function(callback) {
80+ var request = new Mojo.Service.Request(SystemService.identifier, {
81+ method: 'getPreferences',
82+ parameters: {"keys":["messagetone"]},
83+ onSuccess: callback,
84+ onFailure: callback
85+ });
86+ return request;
87+}
88+
89+SystemService.setMessages = function(value){
90+ var request = new Mojo.Service.Request(SystemService.identifier, {
91+ method: 'setPreferences',
92+ parameters: {"messagetone":value},
93+ });
94+ return request;
95+}
96+
97 SystemService.getSystemUISounds = function(callback) {
98 var request = new Mojo.Service.Request(SystemService.identifier, {
99 method: 'getPreferences',
100Index: /usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js
101===================================================================
102--- .orig/usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js
103+++ /usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js
104@@ -94,9 +94,15 @@ var SoundsalertsconfigAssistant = Class.
105 $('system_ui_sounds').observe('mojo-property-change', this.toggleSystemUISounds.bindAsEventListener(this));
106
107 $('currentringtonerow').observe(Mojo.Event.tap, this.showAudioFilePicker.bindAsEventListener(this));
108+ $('currentalertrow').observe(Mojo.Event.tap, this.showAlertFilePicker.bindAsEventListener(this));
109+ $('currentnotificationrow').observe(Mojo.Event.tap, this.showNotificationFilePicker.bindAsEventListener(this));
110+ $('currentmessagerow').observe(Mojo.Event.tap, this.showMessageFilePicker.bindAsEventListener(this));
111
112 this.getCurrentVolumes();
113 this.getCurrentRingtone();
114+ this.getCurrentAlert();
115+ this.getCurrentNotification();
116+ this.getCurrentMessage();
117 this.getVibrateSettings();
118 this.getOtherSettings();
119
120@@ -260,6 +266,84 @@ var SoundsalertsconfigAssistant = Class.
121 $('currentringtone').innerHTML = file.name;
122 },
123
124+ // Alert Picking
125+ getCurrentAlert: function() {
126+ this.getCurrentAlertReq = SystemService.getAlerts(this.getCurrentAlertQuery.bind(this));
127+ },
128+
129+ getCurrentAlertQuery: function(payload) {
130+ if (payload.alerttone) {
131+ $('currentalert').innerHTML = payload.alerttone.name;
132+ this.currAlertPath = payload.alerttone.fullPath;
133+ }
134+ else
135+ $('currentalert').innerHTML = $L("Pick an alert");
136+
137+ },
138+
139+ showAlertFilePicker: function(event) {
140+ var params = {"kinds": ["ringtone"],"filePath":this.currAlertPath,"onSelect":this.selectedAlertFile.bind(this),actionType:"attach",actionName: $L("Done")};
141+ Mojo.FilePicker.pickFile(params,Mojo.Controller.stageController);
142+ },
143+
144+ selectedAlertFile: function(file) {
145+ //var params = {"fullPath": encodeURIComponent(file.fullPath), "name":file.name};
146+ this.setAlertReq = SystemService.setAlerts(file);
147+ $('currentalert').innerHTML = file.name;
148+ },
149+
150+ // Notification Picking
151+ getCurrentNotification: function() {
152+ this.getCurrentNotificationReq = SystemService.getNotifications(this.getCurrentNotificationQuery.bind(this));
153+ },
154+
155+ getCurrentNotificationQuery: function(payload) {
156+ if (payload.notificationtone) {
157+ $('currentnotification').innerHTML = payload.notificationtone.name;
158+ this.currNotificationPath = payload.notificationtone.fullPath;
159+ }
160+ else
161+ $('currentnotification').innerHTML = $L("Pick a notification");
162+
163+ },
164+
165+ showNotificationFilePicker: function(event) {
166+ var params = {"kinds": ["ringtone"],"filePath":this.currNotificationPath,"onSelect":this.selectedNotificationFile.bind(this),actionType:"attach",actionName: $L("Done")};
167+ Mojo.FilePicker.pickFile(params,Mojo.Controller.stageController);
168+ },
169+
170+ selectedNotificationFile: function(file) {
171+ //var params = {"fullPath": encodeURIComponent(file.fullPath), "name":file.name};
172+ this.setNotificationReq = SystemService.setNotifications(file);
173+ $('currentnotification').innerHTML = file.name;
174+ },
175+
176+ // Message Picking
177+ getCurrentMessage: function() {
178+ this.getCurrentMessageReq = SystemService.getMessages(this.getCurrentMessageQuery.bind(this));
179+ },
180+
181+ getCurrentMessageQuery: function(payload) {
182+ if (payload.messagetone) {
183+ $('currentmessage').innerHTML = payload.messagetone.name;
184+ this.currMessagePath = payload.messagetone.fullPath;
185+ }
186+ else
187+ $('currentmessage').innerHTML = $L("Pick an message");
188+
189+ },
190+
191+ showMessageFilePicker: function(event) {
192+ var params = {"kinds": ["ringtone"],"filePath":this.currMessagePath,"onSelect":this.selectedMessageFile.bind(this),actionType:"attach",actionName: $L("Done")};
193+ Mojo.FilePicker.pickFile(params,Mojo.Controller.stageController);
194+ },
195+
196+ selectedMessageFile: function(file) {
197+ //var params = {"fullPath": encodeURIComponent(file.fullPath), "name":file.name};
198+ this.setMessageReq = SystemService.setMessages(file);
199+ $('currentmessage').innerHTML = file.name;
200+ },
201+
202 getVibrateSettings: function() {
203 this.getVibrateSettingsReq = AudioService.getVibrateSettings(this.vibrateSettingsCB.bind(this),this);
204 },
205Index: /usr/palm/applications/com.palm.app.contacts/app/controllers/edit-assistant.js
206===================================================================
207--- .orig/usr/palm/applications/com.palm.app.contacts/app/controllers/edit-assistant.js
208+++ /usr/palm/applications/com.palm.app.contacts/app/controllers/edit-assistant.js
209@@ -63,6 +63,17 @@ EditAssistant = Class.create({
210 template: "edit/ringtones"
211 }));
212
213+ if(this.person.messagingRingtoneName){
214+ this.person.MsgtoneDisplay = this.person.messagingRingtoneName;
215+ this.person.MsgtoneSet = "msgtone-set";
216+ } else {
217+ this.person.MsgtoneDisplay = $L("Set a message tone");
218+ this.person.MsgtoneSet = "";
219+ }
220+ this.controller.get("MsgtoneBox").update(Mojo.View.render({
221+ object: this.person,
222+ template: "edit/msgtones"
223+ }));
224
225 var that = this;
226
227@@ -264,6 +275,11 @@ EditAssistant = Class.create({
228 object: {ringtoneDisplay:ringtoneName},
229 template: "edit/ringtones"
230 }));
231+ var messagingRingtoneName = this.person.messagingRingtoneName || $L("Set a message tone");
232+ this.controller.get("MsgtoneBox").update(Mojo.View.render({
233+ object: {MsgtoneDisplay:messagingRingtoneName},
234+ template: "edit/msgtones"
235+ }));
236
237 }
238 }
239@@ -521,6 +537,7 @@ EditAssistant = Class.create({
240 this.controller.listen("NameSyncPickerWrapper", Mojo.Event.tap, this.popupContactChooser.bind(this));
241 this.controller.get("edit-photo").observe(Mojo.Event.tap, this.attachFilePicker.bind(this));
242 this.controller.get("RingtoneBox").observe(Mojo.Event.tap, this.attachRingtonePicker.bind(this));
243+ this.controller.get("MsgtoneBox").observe(Mojo.Event.tap, this.attachMsgtonePicker.bind(this));
244 this.renderLabels();
245 this.setupContact();
246 if (this.contact.readOnly) {
247Index: /usr/palm/applications/com.palm.app.contacts/app/controllers/filepicker-behaviors.js
248===================================================================
249--- .orig/usr/palm/applications/com.palm.app.contacts/app/controllers/filepicker-behaviors.js
250+++ /usr/palm/applications/com.palm.app.contacts/app/controllers/filepicker-behaviors.js
251@@ -56,6 +56,55 @@ var FilepickerBehaviors = {
252 Mojo.FilePicker.pickFile(params, this.controller.stageController);
253
254 },
255+
256+ attachMsgtonePicker: function(event){
257+ if(this.person.messagingRingtoneLoc){
258+ this.controller.popupSubmenu( {
259+ onChoose:function(c){
260+ if(c == "CHANGE"){
261+ this.pushMsgtonePicker();
262+ } else if(c == "DELETE"){
263+ this.clearMsgtone();
264+ }
265+ }.bind(this),
266+ placeNear:event.target,
267+ items:[
268+ {label:$L("Change Msgtone"), command:'CHANGE'},
269+ {label:$L("Delete Msgtone"), command:'DELETE'}
270+ ]
271+ })
272+ } else {
273+ this.pushMsgtonePicker();
274+ }
275+
276+ },
277+
278+ clearMsgtone:function(){
279+ this.person.messagingRingtoneLoc = "";
280+ this.person.messagingRingtoneName = "";
281+ this.person.MsgtoneDisplay = $L("Set a message tone");
282+ this.person.MsgtoneSet = "";
283+ this.person.dirty = true;
284+ this.controller.get("MsgtoneBox").update(Mojo.View.render({
285+ object:this.person,
286+ template:"edit/msgtones"
287+ }));
288+ },
289+
290+ pushMsgtonePicker:function(){
291+ var params = {
292+ actionType: 'attach',
293+ kinds: ['ringtone'],
294+ defaultKind: 'ringtone',
295+ filePath:this.person.messagingRingtoneLoc,
296+ onSelect: function(file){
297+ this.attachMsgtone(this.sanitizeSystemPath(file.fullPath), file.name);
298+ }.bind(this)
299+ };
300+ //Mojo.Log.info("ContactMulti Picking a msgtone for " + this.contact.firstName + " " + this.contact.lastName);
301+ Mojo.FilePicker.pickFile(params, this.controller.stageController);
302+
303+ },
304
305 attachFilePicker: function(event){
306 if(this.contact.readOnly){
307@@ -150,6 +199,20 @@ var FilepickerBehaviors = {
308 template:"edit/ringtones"
309 }));
310 }
311+ },
312+
313+ attachMsgtone: function(msgtonePath, name){
314+ if (msgtonePath) {
315+ this.person.dirty = true;
316+ this.person.messagingRingtoneName = name;
317+ this.person.MsgtoneDisplay = name;
318+ this.person.MsgtoneSet = "msgtone-set";
319+ this.person.messagingRingtoneLoc = msgtonePath;
320+ this.controller.get("MsgtoneBox").update(Mojo.View.render({
321+ object:this.person,
322+ template:"edit/msgtones"
323+ }));
324+ }
325 }
326 }
327
328Index: /usr/palm/applications/com.palm.app.contacts/app/views/edit/lists-fake.html
329===================================================================
330--- .orig/usr/palm/applications/com.palm.app.contacts/app/views/edit/lists-fake.html
331+++ /usr/palm/applications/com.palm.app.contacts/app/views/edit/lists-fake.html
332@@ -32,6 +32,20 @@
333 </div>
334 </div>
335 </div>
336+<div>
337+<div id="MsgtoneBox" class="">
338+ <div class="palm-group unlabeled">
339+ <div class="palm-list">
340+ <div class="palm-row single" id="MsgtoneButton" x-mojo-tap-highlight="momentary">
341+ <div class="palm-row-wrapper">
342+ <div class="title" x-mojo-loc="">
343+ Set a message tone
344+ </div>
345+ </div>
346+ </div>
347+ </div>
348+ </div>
349+</div>
350 </div>
351 <div>
352 <div id="emailList" name="emailList" class="contactPointList" >
353Index: /usr/palm/applications/com.palm.app.contacts/app/views/edit/msgtones.html
354===================================================================
355--- /dev/null
356+++ /usr/palm/applications/com.palm.app.contacts/app/views/edit/msgtones.html
357@@ -0,0 +1,16 @@
358+<div class="palm-group unlabeled">
359+ <div class="palm-list">
360+ <div class="palm-row single #{MsgtoneSet} msgtone-button" id="MsgtoneButton" x-mojo-tap-highlight="momentary">
361+ <div class="palm-row-wrapper">
362+ <div class="label right truncating-text" x-mojo-loc=''>
363+ Msgtone
364+ </div>
365+ <div class="title">
366+ <div class="truncating-text">
367+ #{MsgtoneDisplay}
368+ </div>
369+ </div>
370+ </div>
371+ </div>
372+ </div>
373+</div>
374Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
375===================================================================
376--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
377+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/listview-assistant.js
378@@ -434,7 +434,8 @@ var ListviewAssistant = Class.create(App
379 // if we are in the history view and the screen is on, do not display a banner + dashboard, just play a notification sound
380 if (this.isScreenOn) {
381 if (data.notificationType == this.Messaging.notificationTypes.newMessage && this.currentListView == this.Messaging.Views.HISTORY) {
382- data = {playSoundOnly:true};
383+ data = $H(data);
384+ data = data.merge({playSoundOnly:true});
385 }
386 }
387 return data;
388Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
389===================================================================
390--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
391+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
392@@ -346,7 +346,8 @@ var ChatviewAssistant = Class.create({
393 if(this.isScreenOn && data.chatThreadId == this.chatThreadId) {
394 Mojo.Log.info("[CV] ****** chatview considerForNotification --- screen is on!");
395 if(data.notificationType == this.Messaging.notificationTypes.newMessage) {
396- data = {playSoundOnly:true};
397+ data = $H(data);
398+ data = data.merge({playSoundOnly:true});
399 } else if( data.notificationType == this.Messaging.notificationTypes.sendFailure) {
400 data = {}; // wipe out the notification because we are in the chat
401 }
402Index: /usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
403===================================================================
404--- .orig/usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
405+++ /usr/palm/applications/com.palm.app.messaging/app/models/messaging-luna-service.js
406@@ -993,5 +993,168 @@ var MessagingMojoService = {
407 method: 'setSMSCAddressAndEmailGateway',
408 parameters: {smscAddr:address, emailGateway: gateway}
409 });
410+ },
411+
412+ isNumberValid: function(number) {
413+ return !(number === undefined
414+ || number == null
415+ || number == ""
416+ || number == "unknown"
417+ || number == "unknown caller"
418+ || number == "blocked caller")
419+ },
420+
421+ // use contacts service and carrier book to perform reverse lookup on number. stores results in passed contact object.
422+ // runs callback when done.
423+ // if the number isn't valid, marks contact lookup complete
424+ // if there's already one happening, or one already completed, just fires callback
425+ // if there's a lateCallback provided, calls that if the result comes much later
426+ rLookup: function(number, contact, callback, lateCallback){
427+
428+ //Reset contact to always get the tone
429+ contact = {};
430+ Mojo.Log.error("Current contact value: %j",contact);
431+ Mojo.Log.error("SMS ID: %j",number);
432+
433+ // bail if the number is invalid
434+ if (!(this.isNumberValid(number))) {
435+ this.finishLookup(contact, callback);
436+ return;
437+ }
438+
439+ if (contact.lookupComplete) {
440+ callback(contact);
441+ return;
442+ }
443+
444+ if (contact.lookupPending) {
445+ callback(contact);
446+ return;
447+ }
448+
449+
450+ // use contacts service to perform lookup.
451+ // if contact already has an id in it, use person lookup
452+ // instead of doing reverse lookup on number
453+ contact.lookupPending = true;
454+ var method, params;
455+ if (contact.initialId) {
456+ method = 'basicDetails'
457+ params = {'id' : contact.initialId}
458+ delete contact.initialId;
459+ } else {
460+ method = 'reverseLookup'
461+ params = {
462+ 'value': number,
463+ 'type': "phone"
464+ }
465+ }
466+ this.lastRequest = new Mojo.Service.Request('palm://com.palm.contacts', {
467+ 'method': method,
468+ parameters: params,
469+ onSuccess: this.onLookup.bind(this, number, contact, callback, lateCallback),
470+ onFailure: function() {
471+ // cancel previous lookup, so this doesn't fire on a service crash
472+ if (this.lastRequest) {
473+ this.lastRequest.cancel();
474+ this.lastRequest = undefined;
475+ }
476+
477+ this.carrierBookLookup(number,contact);
478+ this.finishLookup(contact, callback);
479+ }.bind(this)
480+ });
481+
482+ // timeout if lookup hasn't completed in 4 seconds
483+ this.lookupTimeout = setTimeout(this.onLookupTimeout.bind(this, contact, callback, lateCallback), 4000);
484+ },
485+
486+ // when contact lookup returns, check for valid result
487+ // if valid result, grab name, ringtone; if there's a picture, start loading and set callback to measure it
488+ // if no valid result, look in carrier book
489+ // fire callback when done
490+ onLookup: function(number, contact, callback, lateCallback, result){
491+ Mojo.Log.info( "PhoneApp: Contact::onLookup CALLER ID LOOKUP %s RETURNED %j" , number , result);
492+ var statusChange = "";
493+
494+ // cancel previous lookup, so this doesn't fire on a service crash
495+ if (this.lastRequest) {
496+ this.lastRequest.cancel();
497+ this.lastRequest = undefined;
498+ }
499+
500+ if (result.record) {
501+ /*
502+ // don't match if the number we get back is different than the number
503+ // we passed in (provided the lengths are the same)
504+ if (!(result.record.number)
505+ || ( (result.record.number) && ( (result.record.number.length !== number.length)
506+ || (result.record.number.length === number.length
507+ && result.record.number === number)))) {
508+ */
509+ contact.id = result.record.id;
510+
511+
512+ contact.ringtoneLoc = result.record.messagingRingtoneLoc;
513+ Mojo.Log.error("MSGTone: %j",contact.ringtoneLoc);
514+
515+ }
516+
517+ this.finishLookup(contact, callback, lateCallback);
518+ },
519+
520+
521+
522+ // mark complete; cancel timeout; fire callback if it hasn't fired yet
523+ finishLookup: function(contact, callback, lateCallback) {
524+ contact.lookupPending = false;
525+
526+ // cancel lookup timeout
527+ clearTimeout(this.lookupTimeout);
528+ this.lookupTimeout = undefined;
529+
530+ if (!(contact.lookupComplete)) {
531+ contact.lookupComplete = true;
532+ callback(contact);
533+ // if we have a late return, and we got a contact result, call
534+ // the late return update
535+ } else if (lateCallback && contact.doLateCallback && contact.id) {
536+ contact.doLateCallback = false;
537+ lateCallback.delay(5, contact);
538+ } else {
539+ }
540+
541+ },
542+
543+ // flag lookup as done; proceed with callback
544+ onLookupTimeout: function(contact, callback, lateCallback) {
545+
546+ if (lateCallback) {
547+ contact.doLateCallback = true;
548+ } else if (this.lastRequest && !lateCallback) {
549+ // cancel previous lookup, so this doesn't fire on a service crash
550+ this.lastRequest.cancel();
551+ this.lastRequest = undefined;
552+ }
553+
554+ // clear timeout
555+ this.lookupTimeout = undefined;
556+
557+ // flag done; fire callback if it hasn't yet
558+ contact.lookupComplete = true;
559+ var lookupWasPending = contact.lookupPending;
560+ contact.lookupPending = false;
561+ if (lookupWasPending)
562+ callback(contact);
563+ },
564+
565+ getMessagetone: function(callback) {
566+ var request = new Mojo.Service.Request('palm://com.palm.systemservice', {
567+ method: 'getPreferences',
568+ parameters: {"keys":["messagetone"]},
569+ onSuccess: callback,
570+ onFailure: callback
571+ });
572+ return request;
573 }
574 };
575\ No newline at end of file
576Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/notification-assistant.js
577===================================================================
578--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/notification-assistant.js
579+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/notification-assistant.js
580@@ -27,6 +27,8 @@ function NotificationAssistant(controlle
581 };
582 }
583
584+var contact = {};
585+
586 NotificationAssistant.prototype.subscribeToNotifications = function(){
587 this.messageNotificationRequest = MessagingMojoService.registerForIncomingMessages({onSuccess: this.sendNotification.bind(this, this.Messaging.notificationTypes.newMessage)});
588 this.sendErrorNotificationRequest = MessagingMojoService.registerForSendFailures(this.sendNotification.bind(this, this.Messaging.notificationTypes.sendFailure));
589@@ -35,6 +37,37 @@ NotificationAssistant.prototype.subscrib
590 this.airplaneModeNotificationRequest = MessagingMojoService.registerForAirplaneModeNotifications(this.sendAirplaneModeNotification.bind(this));
591 };
592
593+NotificationAssistant.prototype.doBanner = function(bannerParams,bannerLaunchParams,bannerType,payload) {
594+ if (payload.messagetone.fullPath)
595+ bannerParams.soundFile = payload.messagetone.fullPath;
596+ this.controller.showBanner(bannerParams,bannerLaunchParams,bannerType);
597+};
598+
599+NotificationAssistant.prototype.playMessagetone = function(payload){
600+ if (payload.messagetone.fullPath)
601+ this.controller.playSoundNotification('alerts',payload.messagetone.fullPath);
602+ else
603+ this.controller.playSoundNotification('alerts','');
604+};
605+
606+NotificationAssistant.prototype.doB = function(bannerParams,bannerLaunchParams,bannerType,contact) {
607+ Mojo.Log.error("Banner Ringtone: %j",contact.ringtoneLoc);
608+ if (contact.ringtoneLoc) {
609+ bannerParams.soundFile = contact.ringtoneLoc;
610+ this.controller.showBanner(bannerParams,bannerLaunchParams,bannerType);
611+ } else {
612+ MessagingMojoService.getMessagetone(this.doBanner.bind(this,bannerParams,bannerLaunchParams,'chat'));
613+ }
614+};
615+
616+NotificationAssistant.prototype.playmsgtone = function(contact){
617+ Mojo.Log.error("Playmsgtone Ringtone: %j",contact.ringtoneLoc);
618+ if (contact.ringtoneLoc)
619+ this.controller.playSoundNotification('alerts',contact.ringtoneLoc);
620+ else
621+ MessagingMojoService.getMessagetone(this.playMessagetone.bind(this));
622+};
623+
624 NotificationAssistant.prototype.sendNotification = function(notificationType, resp){
625 if (window.PalmSystem && !resp.returnValue) {
626 try {
627@@ -140,7 +173,8 @@ NotificationAssistant.prototype.consider
628
629 // check if we should only play a sound (when you are already in a chat & a new message comes in)
630 if(notificationData.get('playSoundOnly') && this.Messaging.messagingPrefs.enableNotificationSound) {
631- this.controller.playSoundNotification('alerts','');
632+ var smsid = notificationData.get('address');
633+ MessagingMojoService.rLookup(smsid,contact,this.playmsgtone.bind(this),this.playmsgtone.bind(this));
634 return; // don't display any visual notification
635 }
636
637@@ -176,10 +210,11 @@ NotificationAssistant.prototype.sendClas
638
639 notificationData.set('alertTitle',alertTitle);
640 this.class0AlertData.list.push(notificationData);
641- this.renderClass0PopupAlert(true);
642+ var smsid = notificationData.get('address');
643+ MessagingMojoService.getMessagetone(this.renderClass0PopupAlert.bind(this,true));
644 };
645
646-NotificationAssistant.prototype.renderClass0PopupAlert = function(playSound) {
647+NotificationAssistant.prototype.renderClass0PopupAlert = function(playSound,messageTone) {
648 var class0Stage = this.controller.getStageController(Class0AlertStageName);
649
650 if(class0Stage) {
651@@ -188,6 +223,8 @@ NotificationAssistant.prototype.renderCl
652 var soundClass = 'none';
653 if(playSound) {
654 soundClass = 'alerts';
655+ if(messageTone)
656+ soundFile = messageTone;
657 }
658
659 var pushClass0AlertScene = function(stageController) {
660@@ -198,7 +235,8 @@ NotificationAssistant.prototype.renderCl
661 name: Class0AlertStageName,
662 lightweight: true,
663 height: 300,
664- soundclass: soundClass
665+ soundclass: soundClass,
666+ soundfile: soundFile
667 }, pushClass0AlertScene, 'popupalert');
668 }
669
670@@ -253,8 +291,6 @@ NotificationAssistant.prototype.sendNewM
671 var bannerParams = {
672 messageText: notificationText
673 };
674- if (this.Messaging.messagingPrefs.enableNotificationSound)
675- bannerParams.soundClass = "alerts";
676 var bannerLaunchParams = {
677 chatThreadId: chatThreadId,
678 clearBanner: true
679@@ -262,10 +298,17 @@ NotificationAssistant.prototype.sendNewM
680
681 if (this.Messaging.DisplayState.isDisplayOn()) {
682 Mojo.Log.info("notificationAssistant - executing full banner notification");
683- this.controller.showBanner(bannerParams, bannerLaunchParams, 'chat');
684+ if (this.Messaging.messagingPrefs.enableNotificationSound) {
685+ var smsid = notificationData.get('address');
686+ bannerParams.soundClass = "alerts";
687+ MessagingMojoService.rLookup(smsid,contact,this.doB.bind(this,bannerParams,bannerLaunchParams,'chat'),this.doB.bind(this,bannerParams,bannerLaunchParams,'chat'));
688+ } else {
689+ Mojo.Log.error("Setting banner params");
690+ this.controller.showBanner(bannerParams, bannerLaunchParams, 'chat');
691+ }
692 } else if (this.Messaging.messagingPrefs.enableNotificationSound) {
693- Mojo.Log.info("notificationAssistant - playing sound notification only");
694- this.controller.playSoundNotification('alerts','');
695+ var smsid = notificationData.get('address');
696+ MessagingMojoService.rLookup(smsid,contact,this.playmsgtone.bind(this),this.playmsgtone.bind(this));
697 }
698
699 // Store the data so it can be used in the dashboard
700@@ -324,13 +367,9 @@ NotificationAssistant.prototype.sendNewM
701 // delay creating the dashboard window for the case where the banner is clicked on
702 // to take you to the chat view. This will likely result in the dashboard data
703 // being cleared. If the dashboard data is empty, we do not need to create the dashboard.
704- if (this.Messaging.DisplayState.isDisplayOn()) {
705- if (!this.isNewMessageDashboardPending) {
706- this.isNewMessageDashboardPending = true;
707- createDashboard.delay(5);
708- }
709- } else {
710- createDashboard(); // if the screen is off, create the dashboard right away
711+ if (!this.isNewMessageDashboardPending) {
712+ this.isNewMessageDashboardPending = true;
713+ createDashboard.delay(5);
714 }
715 }
716 };
  
1Timestamps all messages with the method used to timestamp messages that show up late
2
3Modified for 1.2 by StoneRyno
4
5Index: /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
6===================================================================
7--- .orig/usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
8+++ /usr/palm/applications/com.palm.app.messaging/app/controllers/chatview-assistant.js
9@@ -1303,7 +1303,7 @@ var ChatviewAssistant = Class.create({
10
11 // if the INCOMING message was sent longer than 10 minutes before it arrived on device,
12 // add sent date to indicate that this delay happened
13- if(!ChatFlags.isOutgoing(msg.flags) && msg.deviceTimeStamp && msg.timeStamp && (msg.deviceTimeStamp-msg.timeStamp) > (1000*60*10)) {
14+// if(!ChatFlags.isOutgoing(msg.flags) && msg.deviceTimeStamp && msg.timeStamp && (msg.deviceTimeStamp-msg.timeStamp) > (1000*60*10)) {
15 var d = new Date();
16 var today = d.getTime();
17 d.setTime(msg.timeStamp);
18@@ -1311,10 +1311,10 @@ var ChatviewAssistant = Class.create({
19
20 // Only show the message sent time if it is less than two days old
21 // from when it arrived on device
22- if(today-msg.timeStamp <= (1000*60*60*24*2)) {
23+// if(today-msg.timeStamp <= (1000*60*60*24*2)) {
24 msg.timeStampDeltaMsg = new Template($L("Message Sent: #{dateTime}")).evaluate({dateTime:Mojo.Format.formatDate(sentTimeStamp,'short')});
25- }
26- }
27+// }
28+// }
29
30 if (msg.callbackNumber) {
31 msg.callbackNumber = PalmSystem.runTextIndexer(msg.callbackNumber);
  
1diff --git a/usr/palm/applications/com.palm.app.musicplayer/appinfo.json b/usr/palm/applications/com.palm.app.musicplayer/appinfo.json
2index 268b023..ddbf5d3 100644
3--- a/usr/palm/applications/com.palm.app.musicplayer/appinfo.json
4+++ b/usr/palm/applications/com.palm.app.musicplayer/appinfo.json
5@@ -5,5 +5,6 @@
6 "id": "com.palm.app.musicplayer",
7 "keywords": ["Audio", "Tunes", "Songs"],
8 "miniicon": "images/notification-small-music.png",
9- "icon": "icon.png"
10+ "icon": "icon.png",
11+ "visible": false
12 }
  
1diff --git a/usr/palm/applications/com.handson.app.nascar/appinfo.json b/usr/palm/applications/com.handson.app.nascar/appinfo.json
2index 1a4252a..3425a00 100644
3--- a/usr/palm/applications/com.handson.app.nascar/appinfo.json
4+++ b/usr/palm/applications/com.handson.app.nascar/appinfo.json
5@@ -6,6 +6,7 @@
6 "icon": "icon.png",
7 "version": "1.14",
8 "vendor": "Hands-On Mobile",
9- "vendorurl": "http://www.handson.com"
10+ "vendorurl": "http://www.handson.com",
11+ "visible": false
12 }
13
  
1diff --git a/usr/palm/applications/com.handson.app.nfl/appinfo.json b/usr/palm/applications/com.handson.app.nfl/appinfo.json
2index 1fca174..3d40d04 100644
3--- a/usr/palm/applications/com.handson.app.nfl/appinfo.json
4+++ b/usr/palm/applications/com.handson.app.nfl/appinfo.json
5@@ -6,6 +6,7 @@
6 "icon": "icon.png",
7 "version": "1.25",
8 "vendor": "Hands-On Mobile",
9- "vendorurl": "http://www.handson.com"
10+ "vendorurl": "http://www.handson.com",
11+ "visible": false
12 }
13
  
1diff --git a/usr/palm/applications/com.palm.app.pdfviewer/app/controllers/document-assistant.js b/usr/palm/applications/com.palm.app.pdfviewer/app/controllers/document-assistant.js
2index 666d24e..4120555 100644
3--- a/usr/palm/applications/com.palm.app.pdfviewer/app/controllers/document-assistant.js
4+++ b/usr/palm/applications/com.palm.app.pdfviewer/app/controllers/document-assistant.js
5@@ -220,7 +220,6 @@ var DocumentAssistant = Class.create({
6
7 orientationChanged: function(orientation) {
8
9- return;
10 if (this.currentOrientation === orientation)
11 {
12 return;
  
1diff --git a/usr/palm/applications/com.palm.app.pdfviewer/app/controllers/document-assistant.js b/usr/palm/applications/com.palm.app.pdfviewer/app/controllers/document-assistant.js
2index 666d24e..4120555 100644
3--- a/usr/palm/applications/com.palm.app.pdfviewer/app/controllers/document-assistant.js
4+++ b/usr/palm/applications/com.palm.app.pdfviewer/app/controllers/document-assistant.js
5@@ -220,7 +220,6 @@ var DocumentAssistant = Class.create({
6
7 orientationChanged: function(orientation) {
8
9- return;
10 if (this.currentOrientation === orientation)
11 {
12 return;
  
1diff --git a/usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js b/usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
2index 10d1d80..1efdb7d 100644
3--- a/usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
4+++ b/usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
5@@ -10,7 +10,7 @@ var CalllogAssistant = Class.create({
6 this.stageController = Mojo.Controller.getAppController().getStageController("PhoneApp");
7 this.telListener = this.appAssistant.telephonyEventListener;
8 // if it's true, then we hide call length
9- this.hideduration = this.appAssistant.hideCallLogCallDuration;
10+ this.hideduration = false;
11 this.zeroOffset = new Date(0, 0, 0, 0, 0, 0, 0).getTime();
12
13 if (contactId !== undefined && contactId !== "")
  
1This patch adds an option to the phone's dropdown menu during a call to view the call history. -skp (www.teckaddict.com)
2Index: /usr/palm/applications/com.palm.app.phone/app/controllers/activecall-assistant.js
3===================================================================
4--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/activecall-assistant.js
5+++ /usr/palm/applications/com.palm.app.phone/app/controllers/activecall-assistant.js
6@@ -132,6 +132,10 @@ var ActivecallAssistant = Class.create({
7 var appMenuModel = {
8 visible: true,
9 items: [{
10+ label: $L('Call History'),
11+ command: 'callhistory'
12+ },
13+ {
14 label: $L('Sounds & Ringtones'),
15 command: 'ringtones'
16 }]
17@@ -143,6 +147,9 @@ var ActivecallAssistant = Class.create({
18 handleCommand: function(event) {
19 if (event.type == Mojo.Event.command) {
20 switch (event.command) {
21+ case 'callhistory':
22+ this.appAssistant.showCallLog();
23+ break;
24 case 'ringtones':
25 MenuController.showRingtones(this.controller.stageController);
26 break;
27Index: /usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
28===================================================================
29--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
30+++ /usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
31@@ -169,7 +169,12 @@ var CalllogAssistant = Class.create({
32 // manually deal with back; always return to dialpad even if there's
33 // no dialpad scene yet created
34 QDLogger.log( "CalllogAssistant#handleCommand", "back!");
35- this.appAssistant.showDialpad();
36+ if (this.telListener.callExists() == true) {
37+ this.appAssistant.showActiveCall();
38+ }
39+ else {
40+ this.appAssistant.showDialpad();
41+ }
42 event.stopPropagation();
43 Event.stop(event);
44 } else if (event.type == Mojo.Event.command) {
45@@ -210,7 +215,12 @@ var CalllogAssistant = Class.create({
46 },
47
48 switchToDialpad: function(){
49- this.appAssistant.showDialpad();
50+ if (this.telListener.callExists() == true) {
51+ this.appAssistant.showActiveCall();
52+ }
53+ else {
54+ this.appAssistant.showDialpad();
55+ }
56 },
57
58 /* TODO FIXME
  
1This will turn off sound and enable vibration of the dialpad.
2
3Index: /usr/palm/applications/com.palm.app.phone/app/controllers/dialpad-assistant.js
4--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/dialpad-assistant.js
5+++ /usr/palm/applications/com.palm.app.phone/app/controllers/dialpad-assistant.js
6@@ -634,7 +634,7 @@ var DialpadAssistant = Class.create({
7 numberClick: function(event, key){
8
9 if (key) {
10- TelephonyCommands.sendDTMF(key, true);
11+ this.controller.serviceRequest("palm://com.palm.vibrate", {method: 'vibrate', parameters: { 'period': 0,'duration': 100 }});
12 this.formatAndUpdateDialString(key,event);
13 if (this.dialString.length == 1 && this.speedDialString.length == 0) {
14 QDLogger.log( "DialpadAssistant#numberClick", "about to lookup speed dial");
15@@ -929,7 +929,7 @@ var DialpadAssistant = Class.create({
16 if (this.isValidToneKey(this.pressedKey)
17 && this.pressedKey !== Mojo.Char.backspace
18 && (!this.appAssistant.lookupOnKeyPress || this.keyMapOpt.get(evt.keyIdentifier))) {
19- TelephonyCommands.sendDTMF(this.pressedKey, true);
20+ this.controller.serviceRequest("palm://com.palm.vibrate", {method: 'vibrate', parameters: { 'period': 0,'duration': 100 }});
21 }
22
23 Event.stop(evt);
  
1diff --git a/usr/palm/applications/com.palm.app.phoneprefs/app/controllers/preflist-assistant.js b/usr/palm/applications/com.palm.app.phoneprefs/app/controllers/preflist-assistant.js
2index 4c1b0e2..97610bf 100644
3--- a/usr/palm/applications/com.palm.app.phoneprefs/app/controllers/preflist-assistant.js
4+++ b/usr/palm/applications/com.palm.app.phoneprefs/app/controllers/preflist-assistant.js
5@@ -224,7 +224,8 @@ var PreflistAssistant = Class.create({
6
7 this.voiceRoamingChoices = [
8 {label: this.carrierOnlyLabel,value: "homeonly"},
9- {label : $L("Automatic"),value: "any"}
10+ {label : $L("Automatic"),value: "any"},
11+ {label : "Roam Only",value: "roamonly"}
12 ],
13
14 this.voiceRoamingModel = {
15@@ -1230,6 +1231,11 @@ voiceNumberSetDone: function(payload){
16 $('dataroamingrow').show();
17 $('voiceRoamingRow').removeClassName('last');
18 }
19+ else if(payload.extended.mode == 'roamonly') {
20+ this.voiceRoamingModel.currentVoiceRoaming = "roamonly";
21+ $('dataroamingrow').show();
22+ $('voiceRoamingRow').removeClassName('last');
23+ }
24 else {
25 this.voiceRoamingModel.currentVoiceRoaming = "homeonly";
26 $('dataroamingrow').hide();
  
1diff --git a/usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js b/usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
2index 10d1d80..1efdb7d 100644
3--- a/usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
4+++ b/usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
5@@ -10,7 +10,7 @@ var CalllogAssistant = Class.create({
6 this.stageController = Mojo.Controller.getAppController().getStageController("PhoneApp");
7 this.telListener = this.appAssistant.telephonyEventListener;
8 // if it's true, then we hide call length
9- this.hideduration = this.appAssistant.hideCallLogCallDuration;
10+ this.hideduration = false;
11 this.zeroOffset = new Date(0, 0, 0, 0, 0, 0, 0).getTime();
12
13 if (contactId !== undefined && contactId !== "")
  
1This patch adds an option to the phone's dropdown menu during a call to view the call history. -skp (www.teckaddict.com)
2Index: /usr/palm/applications/com.palm.app.phone/app/controllers/activecall-assistant.js
3===================================================================
4--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/activecall-assistant.js
5+++ /usr/palm/applications/com.palm.app.phone/app/controllers/activecall-assistant.js
6@@ -132,6 +132,10 @@ var ActivecallAssistant = Class.create({
7 var appMenuModel = {
8 visible: true,
9 items: [{
10+ label: $L('Call History'),
11+ command: 'callhistory'
12+ },
13+ {
14 label: $L('Sounds & Ringtones'),
15 command: 'ringtones'
16 }]
17@@ -143,6 +147,9 @@ var ActivecallAssistant = Class.create({
18 handleCommand: function(event) {
19 if (event.type == Mojo.Event.command) {
20 switch (event.command) {
21+ case 'callhistory':
22+ this.appAssistant.showCallLog();
23+ break;
24 case 'ringtones':
25 MenuController.showRingtones(this.controller.stageController);
26 break;
27Index: /usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
28===================================================================
29--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
30+++ /usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
31@@ -169,7 +169,12 @@ var CalllogAssistant = Class.create({
32 // manually deal with back; always return to dialpad even if there's
33 // no dialpad scene yet created
34 QDLogger.log( "CalllogAssistant#handleCommand", "back!");
35- this.appAssistant.showDialpad();
36+ if (this.telListener.callExists() == true) {
37+ this.appAssistant.showActiveCall();
38+ }
39+ else {
40+ this.appAssistant.showDialpad();
41+ }
42 event.stopPropagation();
43 Event.stop(event);
44 } else if (event.type == Mojo.Event.command) {
45@@ -210,7 +215,12 @@ var CalllogAssistant = Class.create({
46 },
47
48 switchToDialpad: function(){
49- this.appAssistant.showDialpad();
50+ if (this.telListener.callExists() == true) {
51+ this.appAssistant.showActiveCall();
52+ }
53+ else {
54+ this.appAssistant.showDialpad();
55+ }
56 },
57
58 /* TODO FIXME
  
1This will turn off sound and enable vibration of the dialpad.
2
3Index: /usr/palm/applications/com.palm.app.phone/app/controllers/dialpad-assistant.js
4--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/dialpad-assistant.js
5+++ /usr/palm/applications/com.palm.app.phone/app/controllers/dialpad-assistant.js
6@@ -634,7 +634,7 @@ var DialpadAssistant = Class.create({
7 numberClick: function(event, key){
8
9 if (key) {
10- TelephonyCommands.sendDTMF(key, true);
11+ this.controller.serviceRequest("palm://com.palm.vibrate", {method: 'vibrate', parameters: { 'period': 0,'duration': 100 }});
12 this.formatAndUpdateDialString(key,event);
13 if (this.dialString.length == 1 && this.speedDialString.length == 0) {
14 QDLogger.log( "DialpadAssistant#numberClick", "about to lookup speed dial");
15@@ -929,7 +929,7 @@ var DialpadAssistant = Class.create({
16 if (this.isValidToneKey(this.pressedKey)
17 && this.pressedKey !== Mojo.Char.backspace
18 && (!this.appAssistant.lookupOnKeyPress || this.keyMapOpt.get(evt.keyIdentifier))) {
19- TelephonyCommands.sendDTMF(this.pressedKey, true);
20+ this.controller.serviceRequest("palm://com.palm.vibrate", {method: 'vibrate', parameters: { 'period': 0,'duration': 100 }});
21 }
22
23 Event.stop(evt);
  
1Adds the State name to all incoming calls.
2Index: /usr/palm/applications/com.palm.app.phone/app/controllers/announcer-assistant.js
3===================================================================
4--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/announcer-assistant.js
5+++ /usr/palm/applications/com.palm.app.phone/app/controllers/announcer-assistant.js
6@@ -309,6 +309,8 @@ var AnnouncerAssistant = Class.create({
7 call.displayName = this.getDisplayNameFromContact(contact);
8 if (!(call.displayName)) {
9 call.displayName = FormatPhoneNumber(number);
10+ var message = Messages.contactWithLabel;
11+ call.displayName = new Template(message).evaluate({"contact":call.displayName, "label":RegionLookup.regionFromPhoneNumber(number)});
12 } else if (contact.labelFormatted) {
13 var message = Messages.contactWithLabel;
14 call.displayName = new Template(message).evaluate({"contact":call.displayName, "label":contact.labelFormatted});
15Index: /usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
16===================================================================
17--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
18+++ /usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
19@@ -429,7 +429,7 @@ var CalllogAssistant = Class.create({
20 //Mojo.Timing.resume("format#label");
21 // format phone number label
22 if (item.label == -1) {
23- item.label = '';
24+ item.label = RegionLookup.regionFromPhoneNumber(item.number);
25 } else {
26 var newLabel = Messages.phoneLabel[item.label];
27 if(newLabel) {
28Index: /usr/palm/applications/com.palm.app.phone/app/controllers/incomingcall-assistant.js
29===================================================================
30--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/incomingcall-assistant.js
31+++ /usr/palm/applications/com.palm.app.phone/app/controllers/incomingcall-assistant.js
32@@ -159,7 +159,7 @@ var IncomingcallAssistant = Class.create
33 } else if (contact.cnapName && contact.cnapName !== "unknown") {
34 name = contact.cnapName;
35 } else {
36- name = Messages.unknownCaller;
37+ name = RegionLookup.regionFromPhoneNumber(number);
38 }
39
40 this.fromContacts = fromContacts;
41Index: /usr/palm/applications/com.palm.app.phone/app/controllers/missedcall-assistant.js
42===================================================================
43--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/missedcall-assistant.js
44+++ /usr/palm/applications/com.palm.app.phone/app/controllers/missedcall-assistant.js
45@@ -61,7 +61,7 @@ var MissedcallAssistant = Class.create({
46 this.pictureLoc = this.formatPicture();
47
48 // ensure empty label is displayed as empty
49- this.displayLabel = (this.contact.labelFormatted ? this.contact.labelFormatted : "");
50+ this.displayLabel = (this.contact.labelFormatted ? this.contact.labelFormatted : RegionLookup.regionFromPhoneNumber(number));
51 var tempDateString = Mojo.Format.formatDate(new Date(parseInt(timeStamp)), {time:'short'});
52 this.message = message.interpolate({timeStamp: tempDateString});
53 QDLogger.log( "MissedcallAssistant::updateFields", "end");
54Index: /usr/palm/applications/com.palm.app.phone/app/models/FormattedCall.js
55===================================================================
56--- .orig/usr/palm/applications/com.palm.app.phone/app/models/FormattedCall.js
57+++ /usr/palm/applications/com.palm.app.phone/app/models/FormattedCall.js
58@@ -50,7 +50,7 @@ var FormattedCall = Class.create({
59 this.id = callMsg[lineNumber].id;
60
61 // ensure empty label is displayed as empty
62- this.displayLabel = (callMsg[lineNumber].contact.labelFormatted ? callMsg[lineNumber].contact.labelFormatted : "");
63+ this.displayLabel = (callMsg[lineNumber].contact.labelFormatted ? callMsg[lineNumber].contact.labelFormatted : RegionLookup.regionFromPhoneNumber(callMsg[lineNumber].number));
64 this.numberCaption = ((callMsg[lineNumber].contact.name !== undefined || callMsg[lineNumber].contact.id !== undefined) ? this.number : " ");
65
66 },
  
1Index: /usr/palm/applications/com.palm.app.phone/app/models/FormattedCall.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.phone/app/models/FormattedCall.js
4+++ /usr/palm/applications/com.palm.app.phone/app/models/FormattedCall.js
5@@ -12,6 +12,22 @@ var FormattedCall = Class.create({
6 else
7 this.formatCall(id, lineState);
8 },
9+
10+ getSSStatus: function() {
11+ this.getSSStatusReq = AudioService.getSystemSoundStatus(this.getSSStatusQuery.bind(this));
12+ },
13+
14+ getSSStatusQuery: function(payload) {
15+ if (!(payload === undefined)) {
16+ Mojo.Log.error("SVC Initial Value: %j",payload.volume);
17+ SSVolume = payload.volume;
18+ AudioService.setSystemVolume(0,null,null);
19+ } else {
20+ Mojo.Log.error("SVC No initial volume. Setting to 50.");
21+ SSVolume = 50;
22+ AudioService.setSystemVolume(0,null,null);
23+ }
24+ },
25
26 // given the line number and the service's list of calls
27 // build object whose properties will be Mojo.Rendered into
28@@ -19,6 +35,10 @@ var FormattedCall = Class.create({
29 formatConferenceCall: function(lineNumber, callMsg) {
30 QDLogger.log( "formatConferenceCall");
31 this.state = this.formatState(callMsg[lineNumber].state);
32+ if (this.state === "Ended" || this.state === "Ending") {
33+ Mojo.Log.error("SVC resetting system volume for conference call");
34+ AudioService.setSystemVolume(SSVolume,null,null);
35+ }
36 this.conferenceLabel = this.formatConferenceLabel();
37 // TODO: not sure why i didn't have this in the first place
38 this.contact = this.conferenceLabel;
39@@ -49,6 +69,24 @@ var FormattedCall = Class.create({
40 this.lineNumber = lineNumber;
41 this.id = callMsg[lineNumber].id;
42
43+ try {
44+ SSVolume=SSVolume/1
45+ } catch(err) {
46+ SSVolume = 101;
47+ }
48+ if (this.lineNumber == '0' && this.state == "") {
49+ if (SSVolume===101) {
50+ Mojo.Log.error("SVC setting system volume to 0");
51+ this.getSSStatus();
52+ }
53+ }
54+ if (this.state == "Ended" || this.state == "Ending") {
55+ if (SSVolume < 101) {
56+ Mojo.Log.error("SVC resetting system volume to %j",SSVolume);
57+ AudioService.setSystemVolume(SSVolume,null,null);
58+ SSVolume = 101;
59+ }
60+ }
61 // ensure empty label is displayed as empty
62 this.displayLabel = (callMsg[lineNumber].contact.labelFormatted ? callMsg[lineNumber].contact.labelFormatted : "");
63 this.numberCaption = ((callMsg[lineNumber].contact.name !== undefined || callMsg[lineNumber].contact.id !== undefined) ? this.number : " ");
64Index: /usr/palm/applications/com.palm.app.phone/app/models/audio-luna-service.js
65===================================================================
66--- /dev/null
67+++ /usr/palm/applications/com.palm.app.phone/app/models/audio-luna-service.js
68@@ -0,0 +1,35 @@
69+/* Copyright 2009 Palm, Inc. All rights reserved. */
70+
71+var AudioService = Class.create({
72+ initialize: function() {
73+ }
74+});
75+
76+AudioService.setSystemVolume = function(volume,callback, sceneController) {
77+ var request = new Mojo.Service.Request(AudioService.system_identifier, {
78+ method: 'setVolume',
79+ parameters: {volume:volume },
80+ onSuccess: function(response) {
81+ if(callback)
82+ callback(response);
83+ },
84+ onFailure: function(response) {
85+ if(callback)
86+ callback(response);
87+ },
88+ });
89+ return request;
90+}
91+
92+AudioService.getSystemSoundStatus = function(callback) {
93+ var request = new Mojo.Service.Request(AudioService.system_identifier, {
94+ method: 'status',
95+ parameters: {"subscribe": false},
96+ onSuccess: callback,
97+ onFailure: callback
98+ });
99+ return request;
100+}
101+
102+AudioService.system_identifier = 'palm://com.palm.audio/system';
103+
104Index: /usr/palm/applications/com.palm.app.phone/sources.json
105===================================================================
106--- .orig/usr/palm/applications/com.palm.app.phone/sources.json
107+++ /usr/palm/applications/com.palm.app.phone/sources.json
108@@ -1,5 +1,8 @@
109 [
110 {
111+ "source": "app\/models\/audio-luna-service.js"
112+ },
113+ {
114 "source": "app\/models\/QDLogger.js"
115 },
116 {
  
1Index: /usr/palm/applications/com.palm.app.phone/app/models/FormattedCall.js
2===================================================================
3--- .orig/usr/palm/applications/com.palm.app.phone/app/models/FormattedCall.js
4+++ /usr/palm/applications/com.palm.app.phone/app/models/FormattedCall.js
5@@ -12,6 +12,22 @@ var FormattedCall = Class.create({
6 else
7 this.formatCall(id, lineState);
8 },
9+
10+ getSSStatus: function() {
11+ this.getSSStatusReq = AudioService.getSystemSoundStatus(this.getSSStatusQuery.bind(this));
12+ },
13+
14+ getSSStatusQuery: function(payload) {
15+ if (!(payload === undefined)) {
16+ Mojo.Log.error("SVC Initial Value: %j",payload.volume);
17+ SSVolume = payload.volume;
18+ AudioService.setSystemVolume(0,null,null);
19+ } else {
20+ Mojo.Log.error("SVC No initial volume. Setting to 50.");
21+ SSVolume = 50;
22+ AudioService.setSystemVolume(0,null,null);
23+ }
24+ },
25
26 // given the line number and the service's list of calls
27 // build object whose properties will be Mojo.Rendered into
28@@ -19,6 +35,10 @@ var FormattedCall = Class.create({
29 formatConferenceCall: function(lineNumber, callMsg) {
30 QDLogger.log( "formatConferenceCall");
31 this.state = this.formatState(callMsg[lineNumber].state);
32+ if (this.state === "Ended" || this.state === "Ending") {
33+ Mojo.Log.error("SVC resetting system volume for conference call");
34+ AudioService.setSystemVolume(SSVolume,null,null);
35+ }
36 this.conferenceLabel = this.formatConferenceLabel();
37 // TODO: not sure why i didn't have this in the first place
38 this.contact = this.conferenceLabel;
39@@ -49,6 +69,24 @@ var FormattedCall = Class.create({
40 this.lineNumber = lineNumber;
41 this.id = callMsg[lineNumber].id;
42
43+ try {
44+ SSVolume=SSVolume/1
45+ } catch(err) {
46+ SSVolume = 101;
47+ }
48+ if (this.lineNumber == '0' && this.state == "") {
49+ if (SSVolume===101) {
50+ Mojo.Log.error("SVC setting system volume to 0");
51+ this.getSSStatus();
52+ }
53+ }
54+ if (this.state == "Ended" || this.state == "Ending") {
55+ if (SSVolume < 101) {
56+ Mojo.Log.error("SVC resetting system volume to %j",SSVolume);
57+ AudioService.setSystemVolume(SSVolume,null,null);
58+ SSVolume = 101;
59+ }
60+ }
61 // ensure empty label is displayed as empty
62 this.displayLabel = (callMsg[lineNumber].contact.labelFormatted ? callMsg[lineNumber].contact.labelFormatted : "");
63 this.numberCaption = ((callMsg[lineNumber].contact.name !== undefined || callMsg[lineNumber].contact.id !== undefined) ? this.number : " ");
64Index: /usr/palm/applications/com.palm.app.phone/app/models/audio-luna-service.js
65===================================================================
66--- /dev/null
67+++ /usr/palm/applications/com.palm.app.phone/app/models/audio-luna-service.js
68@@ -0,0 +1,35 @@
69+/* Copyright 2009 Palm, Inc. All rights reserved. */
70+
71+var AudioService = Class.create({
72+ initialize: function() {
73+ }
74+});
75+
76+AudioService.setSystemVolume = function(volume,callback, sceneController) {
77+ var request = new Mojo.Service.Request(AudioService.system_identifier, {
78+ method: 'setVolume',
79+ parameters: {volume:volume },
80+ onSuccess: function(response) {
81+ if(callback)
82+ callback(response);
83+ },
84+ onFailure: function(response) {
85+ if(callback)
86+ callback(response);
87+ },
88+ });
89+ return request;
90+}
91+
92+AudioService.getSystemSoundStatus = function(callback) {
93+ var request = new Mojo.Service.Request(AudioService.system_identifier, {
94+ method: 'status',
95+ parameters: {"subscribe": false},
96+ onSuccess: callback,
97+ onFailure: callback
98+ });
99+ return request;
100+}
101+
102+AudioService.system_identifier = 'palm://com.palm.audio/system';
103+
104Index: /usr/palm/applications/com.palm.app.phone/sources.json
105===================================================================
106--- .orig/usr/palm/applications/com.palm.app.phone/sources.json
107+++ /usr/palm/applications/com.palm.app.phone/sources.json
108@@ -1,5 +1,8 @@
109 [
110 {
111+ "source": "app\/models\/audio-luna-service.js"
112+ },
113+ {
114 "source": "app\/models\/QDLogger.js"
115 },
116 {
  
1Index: /usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2===================================================================
3--- .orig/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ /usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -817,6 +817,8 @@ handletelephonyNotifications: function(p
6 this.callForwardNotificationSession = null;
7 }
8 }
9+ var stageController = Mojo.Controller.getAppController().getStageProxy("DeviceMenu");
10+ stageController.delegateToSceneAssistant("updatePhone");
11 }
12 else if (payload.eventNetwork && this.phoneRadioState) {
13 var networkMsg = payload.eventNetwork;
14@@ -2647,6 +2649,10 @@ getCurrentWiFiState: function() {
15 return this.wifiState;
16 },
17
18+getCurrentPhoneState: function() {
19+ return this.phoneRadioState;
20+},
21+
22 setDeviceMenuAssistant: function(menuassistant) {
23 this.deviceMenuAssistant = menuassistant;
24 },
25Index: /usr/lib/luna/system/luna-systemui/app/controllers/devicemenu-assistant.js
26===================================================================
27--- .orig/usr/lib/luna/system/luna-systemui/app/controllers/devicemenu-assistant.js
28+++ /usr/lib/luna/system/luna-systemui/app/controllers/devicemenu-assistant.js
29@@ -1,6 +1,6 @@
30 /* Copyright 2009 Palm, Inc. All rights reserved. */
31
32-var RadioState = new Hash({wifi: undefined, bluetooth: undefined});
33+var RadioState = new Hash({wifi: undefined, bluetooth: undefined, phone: undefined});
34
35 var DevicemenuAssistant = Class.create({
36
37@@ -39,6 +39,8 @@ var DevicemenuAssistant = Class.create({
38 this.drawerModel = {myOpenProperty:false};
39 this.controller.setupWidget('wifidetails', {modelProperty:'myOpenProperty'}, this.drawerModel);
40 this.controller.setupWidget('btdetails', {modelProperty:'myOpenProperty'}, this.drawerModel);
41+ this.controller.setupWidget('phonedetails', {modelProperty:'myOpenProperty'}, this.drawerModel);
42+ this.phonedrawer = this.controller.get('phonedetails')
43 this.wifidrawer = this.controller.get('wifidetails');
44 this.btdrawer = this.controller.get('btdetails');
45
46@@ -95,6 +97,17 @@ var DevicemenuAssistant = Class.create({
47 else
48 this.controller.get('wifimsg').innerHTML = wifistate.escapeHTML();
49 }
50+
51+ var phonestate = this.barAssistant.getCurrentPhoneState();
52+ if(phonestate === 'Off') {
53+ this.controller.get('phonemsg').innerHTML = $L('Off');
54+ RadioState.set('phone',false);
55+ }
56+ else {
57+ this.controller.get('phonemsg').innerHTML = $L('On');
58+ RadioState.set('phone',true);
59+ }
60+
61 this.controller.listen(this.controller.document, Mojo.Event.deactivate, this.close.bindAsEventListener(this));
62 this.isVisible = true;
63
64@@ -118,6 +131,8 @@ var DevicemenuAssistant = Class.create({
65 this.controller.get('btlist').addEventListener(Mojo.Event.listTap,this.handleBTTap.bindAsEventListener(this));
66 this.controller.get('dm_wifi').addEventListener(Mojo.Event.tap, this.togglewifiList.bindAsEventListener(this));
67 this.controller.get('dm_bluetooth').addEventListener(Mojo.Event.tap, this.togglebluetoothList.bindAsEventListener(this));
68+ this.controller.get('dm_phone').addEventListener(Mojo.Event.tap, this.togglePhoneList.bindAsEventListener(this));
69+ this.controller.get('phone_radio').addEventListener(Mojo.Event.tap, this.togglePhoneRadio.bindAsEventListener(this));
70 this.controller.get('wifi_radio').addEventListener(Mojo.Event.tap, this.toggleWifiRadio.bindAsEventListener(this));
71 this.controller.get('bt_radio').addEventListener(Mojo.Event.tap, this.toggleBTRadio.bindAsEventListener(this));
72 this.controller.get('bt_pref').addEventListener(Mojo.Event.tap,this.handleBluetoothLaunch.bindAsEventListener(this));
73@@ -177,6 +192,49 @@ var DevicemenuAssistant = Class.create({
74 }
75 this.apModeInProgress = false;
76 },
77+
78+
79+ updatePhone: function() {
80+ if(this.barAssistant.getCurrentPhoneState()) {
81+ this.controller.get('phonemsg').innerHTML = $L('On');
82+ this.controller.get('phone_radio').innerHTML = $L('Turn off Phone');
83+ RadioState.set('phone', true);
84+ }
85+ else {
86+ this.controller.get('phonemsg').innerHTML = $L('Off');
87+ this.controller.get('phone_radio').innerHTML = $L('Turn on Phone');
88+ RadioState.set('phone', false);
89+ }
90+ },
91+
92+ togglePhoneRadio: function(event) {
93+ this.serviceRequest = new Mojo.Service.Request("palm://com.palm.vibrate", {
94+ method: 'vibrate', parameters: { 'period': 0,'duration': 250 }
95+ });
96+ if(RadioState.get('phone'))
97+ TelephonyService.tempPowerSet('off',false,null,null);
98+ else
99+ TelephonyService.tempPowerSet('on',false,null,null);
100+ this.toggleDeviceMenu();
101+ },
102+
103+ togglePhoneList: function(event) {
104+ if(this.apModeInProgress)
105+ return;
106+
107+ if (this.phonedrawer.mojo.getOpenState()) {
108+ this.controller.hideWidgetContainer(this.controller.get('phonedetails'));
109+ }
110+ else {
111+ if(RadioState.get('phone'))
112+ this.controller.get('phone_radio').innerHTML = $L('Turn off Phone');
113+ else
114+ this.controller.get('phone_radio').innerHTML = $L('Turn on Phone');
115+
116+ this.controller.showWidgetContainer(this.controller.get('phonedetails'));
117+ }
118+ this.phonedrawer.mojo.setOpenState(!this.phonedrawer.mojo.getOpenState());
119+ },
120
121 toggleBTRadio: function(event) {
122 if(RadioState.get('bluetooth')) {
123@@ -891,6 +949,10 @@ var DevicemenuAssistant = Class.create({
124
125 close: function() {
126
127+ if(this.phonedrawer.mojo.getOpenState()) {
128+ this.controller.hideWidgetContainer(this.controller.get('phonedetails'));
129+ this.phonedrawer.mojo.setOpenState(false);
130+ }
131 if (this.btdrawer.mojo.getOpenState()) {
132 this.clearBTList();
133 this.controller.hideWidgetContainer(this.controller.get('btdetails'));
134Index: /usr/lib/luna/system/luna-systemui/app/views/devicemenu/devicemenu-scene.html
135===================================================================
136--- .orig/usr/lib/luna/system/luna-systemui/app/views/devicemenu/devicemenu-scene.html
137+++ /usr/lib/luna/system/luna-systemui/app/views/devicemenu/devicemenu-scene.html
138@@ -94,6 +94,22 @@
139
140 <div class="palm-section-divider"></div>
141
142+ <div class="palm-row" id="dm_phone" x-mojo-tap-highlight='momentary'><div class="palm-row-wrapper">
143+ <div class="title truncating-text">
144+ <div class="label right" id="phonemsg">&nbsp;</div>
145+ <span x-mojo-loc=''>Phone</span>
146+ </div>
147+ </div></div>
148+
149+ <div id='phonedetails' x-mojo-element="Drawer">
150+ <div class="palm-row first" x-mojo-tap-highlight='momentary'><div class="palm-row-wrapper">
151+ <div id="phone_radio" class="title truncating-text">
152+ </div>
153+ </div></div>
154+ </div>
155+
156+ <div class="palm-section-divider"></div>
157+
158 <div id="dm_airplanemode" class="palm-row last menu-end" x-mojo-tap-highlight='momentary'><div class="palm-row-wrapper">
159 <div id="dm_airplanemode_status" class="title truncating-text">
160 </div>
  
1Adds the State name to all incoming calls.
2Index: /usr/palm/applications/com.palm.app.phone/app/controllers/announcer-assistant.js
3===================================================================
4--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/announcer-assistant.js
5+++ /usr/palm/applications/com.palm.app.phone/app/controllers/announcer-assistant.js
6@@ -309,6 +309,8 @@ var AnnouncerAssistant = Class.create({
7 call.displayName = this.getDisplayNameFromContact(contact);
8 if (!(call.displayName)) {
9 call.displayName = FormatPhoneNumber(number);
10+ var message = Messages.contactWithLabel;
11+ call.displayName = new Template(message).evaluate({"contact":call.displayName, "label":RegionLookup.regionFromPhoneNumber(number)});
12 } else if (contact.labelFormatted) {
13 var message = Messages.contactWithLabel;
14 call.displayName = new Template(message).evaluate({"contact":call.displayName, "label":contact.labelFormatted});
15Index: /usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
16===================================================================
17--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
18+++ /usr/palm/applications/com.palm.app.phone/app/controllers/calllog-assistant.js
19@@ -429,7 +429,7 @@ var CalllogAssistant = Class.create({
20 //Mojo.Timing.resume("format#label");
21 // format phone number label
22 if (item.label == -1) {
23- item.label = '';
24+ item.label = RegionLookup.regionFromPhoneNumber(item.number);
25 } else {
26 var newLabel = Messages.phoneLabel[item.label];
27 if(newLabel) {
28Index: /usr/palm/applications/com.palm.app.phone/app/controllers/incomingcall-assistant.js
29===================================================================
30--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/incomingcall-assistant.js
31+++ /usr/palm/applications/com.palm.app.phone/app/controllers/incomingcall-assistant.js
32@@ -159,7 +159,7 @@ var IncomingcallAssistant = Class.create
33 } else if (contact.cnapName && contact.cnapName !== "unknown") {
34 name = contact.cnapName;
35 } else {
36- name = Messages.unknownCaller;
37+ name = RegionLookup.regionFromPhoneNumber(number);
38 }
39
40 this.fromContacts = fromContacts;
41Index: /usr/palm/applications/com.palm.app.phone/app/controllers/missedcall-assistant.js
42===================================================================
43--- .orig/usr/palm/applications/com.palm.app.phone/app/controllers/missedcall-assistant.js
44+++ /usr/palm/applications/com.palm.app.phone/app/controllers/missedcall-assistant.js
45@@ -61,7 +61,7 @@ var MissedcallAssistant = Class.create({
46 this.pictureLoc = this.formatPicture();
47
48 // ensure empty label is displayed as empty
49- this.displayLabel = (this.contact.labelFormatted ? this.contact.labelFormatted : "");
50+ this.displayLabel = (this.contact.labelFormatted ? this.contact.labelFormatted : RegionLookup.regionFromPhoneNumber(number));
51 var tempDateString = Mojo.Format.formatDate(new Date(parseInt(timeStamp)), {time:'short'});
52 this.message = message.interpolate({timeStamp: tempDateString});
53 QDLogger.log( "MissedcallAssistant::updateFields", "end");
54Index: /usr/palm/applications/com.palm.app.phone/app/models/FormattedCall.js
55===================================================================
56--- .orig/usr/palm/applications/com.palm.app.phone/app/models/FormattedCall.js
57+++ /usr/palm/applications/com.palm.app.phone/app/models/FormattedCall.js
58@@ -50,7 +50,7 @@ var FormattedCall = Class.create({
59 this.id = callMsg[lineNumber].id;
60
61 // ensure empty label is displayed as empty
62- this.displayLabel = (callMsg[lineNumber].contact.labelFormatted ? callMsg[lineNumber].contact.labelFormatted : "");
63+ this.displayLabel = (callMsg[lineNumber].contact.labelFormatted ? callMsg[lineNumber].contact.labelFormatted : RegionLookup.regionFromPhoneNumber(callMsg[lineNumber].number));
64 this.numberCaption = ((callMsg[lineNumber].contact.name !== undefined || callMsg[lineNumber].contact.id !== undefined) ? this.number : " ");
65
66 },
  
1diff --git a/usr/palm/applications/com.palm.app.phoneprefs/app/controllers/preflist-assistant.js b/usr/palm/applications/com.palm.app.phoneprefs/app/controllers/preflist-assistant.js
2index 4c1b0e2..97610bf 100644
3--- a/usr/palm/applications/com.palm.app.phoneprefs/app/controllers/preflist-assistant.js
4+++ b/usr/palm/applications/com.palm.app.phoneprefs/app/controllers/preflist-assistant.js
5@@ -224,7 +224,8 @@ var PreflistAssistant = Class.create({
6
7 this.voiceRoamingChoices = [
8 {label: this.carrierOnlyLabel,value: "homeonly"},
9- {label : $L("Automatic"),value: "any"}
10+ {label : $L("Automatic"),value: "any"},
11+ {label : "Roam Only",value: "roamonly"}
12 ],
13
14 this.voiceRoamingModel = {
15@@ -1230,6 +1231,11 @@ voiceNumberSetDone: function(payload){
16 $('dataroamingrow').show();
17 $('voiceRoamingRow').removeClassName('last');
18 }
19+ else if(payload.extended.mode == 'roamonly') {
20+ this.voiceRoamingModel.currentVoiceRoaming = "roamonly";
21+ $('dataroamingrow').show();
22+ $('voiceRoamingRow').removeClassName('last');
23+ }
24 else {
25 this.voiceRoamingModel.currentVoiceRoaming = "homeonly";
26 $('dataroamingrow').hide();
  
1This patch allows for turning on center button led to blink in screen/lock menu when notifications are present. -Jack87
2--- /usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js.orig Mon Sep 28 16:23:58 2009
3+++ /usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js Mon Sep 28 16:25:03 2009
4@@ -51,8 +51,8 @@
5 this.controller.setupWidget('showAlerts', this.onOffToggleOpt, this.alertToggleModel);
6 Mojo.Event.listen($('showAlerts'),'mojo-property-change', this.toggleShowAlerts.bindAsEventListener(this));
7
8- //this.controller.setupWidget('blinkAlerts', this.onOffToggleOpt, this.ledThrobberToggleModel);
9- //Mojo.Event.listen($('blinkAlerts'),'mojo-property-change', this.toggleLEDThrobber.bindAsEventListener(this));
10+ this.controller.setupWidget('blinkAlerts', this.onOffToggleOpt, this.ledThrobberToggleModel);
11+ Mojo.Event.listen($('blinkAlerts'),'mojo-property-change', this.toggleLEDThrobber.bindAsEventListener(this));
12
13 this.controller.setupWidget('switchApps', this.onOffToggleOpt, this.switchApptoggleModel);
14 Mojo.Event.listen($('switchApps'),'mojo-property-change', this.toggleSwitchApps.bindAsEventListener(this));
15@@ -245,10 +245,10 @@
16 }
17 }
18
19- /*if (payload.LEDThrobberEnabled != undefined) {
20+ if (payload.LEDThrobberEnabled != undefined) {
21 this.ledThrobberToggleModel.value = payload.LEDThrobberEnabled;
22 this.controller.modelChanged(this.ledThrobberToggleModel, this);
23- }*/
24+ }
25
26 //Demo Device -- Hide the PIN / Password options.
27 if(payload.onDeviceDemoRunning != undefined && payload.onDeviceDemoRunning === true) {
28--- /usr/palm/applications/com.palm.app.screenlock/app/views/securityconfig/securityconfig-scene.html.orig Mon Sep 28 16:23:13 2009
29+++ /usr/palm/applications/com.palm.app.screenlock/app/views/securityconfig/securityconfig-scene.html Mon Sep 28 16:23:42 2009
30@@ -89,17 +89,17 @@
31 <div class="title capitalize" x-mojo-loc=''>Show when locked</div>
32 </div>
33 </div>
34- <!--<div class="palm-row last">
35+ <div class="palm-row last">
36 <div class="palm-row-wrapper">
37 <div x-mojo-element="ToggleButton" id="blinkAlerts"></div>
38 <div class="title capitalize" x-mojo-loc=''>Blink notifications</div>
39 </div>
40- </div>-->
41+ </div>
42 </div>
43 </div>
44
45- <!--<div class="palm-info-text single" x-mojo-loc=''>
46+ <div class="palm-info-text single" x-mojo-loc=''>
47 The gesture area blinks when new notifications arrive.
48- </div>-->
49+ </div>
50
51 </div>
52\ No newline at end of file
  
1This patch will add times to your "turn off screen after X minutes" options under screen & lock
2
3Index: /usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js
4===================================================================
5--- .orig/usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js
6+++ /usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js
7@@ -108,7 +108,7 @@ var SecurityconfigAssistant = Class.crea
8 timerModel: {currentTimer: 30},
9
10 //Available Timer Values.
11- availableTimers: [{label: $L('30 seconds'), value:30},{label: $L('1 minute'), value:60},{label: $L('2 minutes'), value:120},{label: $L('3 minutes'), value:180}],
12+ availableTimers: [{label: $L('15 seconds'), value: 15}, {label: $L('30 seconds'), value:30},{label: $L('1 minute'), value:60},{label: $L('2 minutes'), value:120},{label: $L('3 minutes'), value:180},{label: $L('5 minutes'), value:300},{label: $L('Never'), value:10800}],
13
14 //Model for Security Selection List
15 securityModel: {currentSecurity: 'none'},
  
1diff --git a/usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js b/usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js
2index d6bfe45..5aa36c7 100644
3--- a/usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js
4+++ b/usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js
5@@ -35,7 +35,7 @@ var SecurityconfigAssistant = Class.create({
6 sliderattributes: {
7 modelProperty: 'value',
8 maxValue: 100,
9- minValue: 10,
10+ minValue: 0,
11 round: false,
12 updateInterval: 0.1
13 },
  
1This patch allows for turning on center button led to blink in screen/lock menu when notifications are present. -Jack87
2--- /usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js.orig Mon Sep 28 16:23:58 2009
3+++ /usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js Mon Sep 28 16:25:03 2009
4@@ -51,8 +51,8 @@
5 this.controller.setupWidget('showAlerts', this.onOffToggleOpt, this.alertToggleModel);
6 Mojo.Event.listen($('showAlerts'),'mojo-property-change', this.toggleShowAlerts.bindAsEventListener(this));
7
8- //this.controller.setupWidget('blinkAlerts', this.onOffToggleOpt, this.ledThrobberToggleModel);
9- //Mojo.Event.listen($('blinkAlerts'),'mojo-property-change', this.toggleLEDThrobber.bindAsEventListener(this));
10+ this.controller.setupWidget('blinkAlerts', this.onOffToggleOpt, this.ledThrobberToggleModel);
11+ Mojo.Event.listen($('blinkAlerts'),'mojo-property-change', this.toggleLEDThrobber.bindAsEventListener(this));
12
13 this.controller.setupWidget('switchApps', this.onOffToggleOpt, this.switchApptoggleModel);
14 Mojo.Event.listen($('switchApps'),'mojo-property-change', this.toggleSwitchApps.bindAsEventListener(this));
15@@ -245,10 +245,10 @@
16 }
17 }
18
19- /*if (payload.LEDThrobberEnabled != undefined) {
20+ if (payload.LEDThrobberEnabled != undefined) {
21 this.ledThrobberToggleModel.value = payload.LEDThrobberEnabled;
22 this.controller.modelChanged(this.ledThrobberToggleModel, this);
23- }*/
24+ }
25
26 //Demo Device -- Hide the PIN / Password options.
27 if(payload.onDeviceDemoRunning != undefined && payload.onDeviceDemoRunning === true) {
28--- /usr/palm/applications/com.palm.app.screenlock/app/views/securityconfig/securityconfig-scene.html.orig Mon Sep 28 16:23:13 2009
29+++ /usr/palm/applications/com.palm.app.screenlock/app/views/securityconfig/securityconfig-scene.html Mon Sep 28 16:23:42 2009
30@@ -89,17 +89,17 @@
31 <div class="title capitalize" x-mojo-loc=''>Show when locked</div>
32 </div>
33 </div>
34- <!--<div class="palm-row last">
35+ <div class="palm-row last">
36 <div class="palm-row-wrapper">
37 <div x-mojo-element="ToggleButton" id="blinkAlerts"></div>
38 <div class="title capitalize" x-mojo-loc=''>Blink notifications</div>
39 </div>
40- </div>-->
41+ </div>
42 </div>
43 </div>
44
45- <!--<div class="palm-info-text single" x-mojo-loc=''>
46+ <div class="palm-info-text single" x-mojo-loc=''>
47 The gesture area blinks when new notifications arrive.
48- </div>-->
49+ </div>
50
51 </div>
52\ No newline at end of file
  
1This patch will add times to your "turn off screen after X minutes" options under screen & lock
2
3Index: /usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js
4===================================================================
5--- .orig/usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js
6+++ /usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js
7@@ -108,7 +108,7 @@ var SecurityconfigAssistant = Class.crea
8 timerModel: {currentTimer: 30},
9
10 //Available Timer Values.
11- availableTimers: [{label: $L('30 seconds'), value:30},{label: $L('1 minute'), value:60},{label: $L('2 minutes'), value:120},{label: $L('3 minutes'), value:180}],
12+ availableTimers: [{label: $L('15 seconds'), value: 15}, {label: $L('30 seconds'), value:30},{label: $L('1 minute'), value:60},{label: $L('2 minutes'), value:120},{label: $L('3 minutes'), value:180},{label: $L('5 minutes'), value:300},{label: $L('Never'), value:10800}],
13
14 //Model for Security Selection List
15 securityModel: {currentSecurity: 'none'},
  
1diff --git a/usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js b/usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js
2index d6bfe45..5aa36c7 100644
3--- a/usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js
4+++ b/usr/palm/applications/com.palm.app.screenlock/app/controllers/securityconfig-assistant.js
5@@ -35,7 +35,7 @@ var SecurityconfigAssistant = Class.create({
6 sliderattributes: {
7 modelProperty: 'value',
8 maxValue: 100,
9- minValue: 10,
10+ minValue: 0,
11 round: false,
12 updateInterval: 0.1
13 },
  
1diff --git a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2index f343ce2..c7f389b 100644
3--- a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -1479,7 +1479,7 @@ handlePowerNotifications: function(payload) {
6 this.controller.showBanner({
7 messageText: batteryalert,
8 icon: "/usr/lib/luna/system/luna-systemui/images/notification-small-charging.png",
9- soundClass: soundClassName
10+ soundClass: "vibrate"
11 },null, 'chargingAlert');
12 }
13 this.chargingBannerShown = true;
  
1diff --git a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
2index f343ce2..6f9bcd3 100644
3--- a/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
4+++ b/usr/lib/luna/system/luna-systemui/app/controllers/bar-assistant.js
5@@ -1479,7 +1479,7 @@ handlePowerNotifications: function(payload) {
6 this.controller.showBanner({
7 messageText: batteryalert,
8 icon: "/usr/lib/luna/system/luna-systemui/images/notification-small-charging.png",
9- soundClass: soundClassName
10+ soundClass: ""
11 },null, 'chargingAlert');
12 }
13 this.chargingBannerShown = true;
  
1diff --git a/usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js b/usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js
2index f24c16c..5330fe4 100644
3--- a/usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js
4+++ b/usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js
5@@ -94,9 +94,13 @@ var SoundsalertsconfigAssistant = Class.create({
6 $('system_ui_sounds').observe('mojo-property-change', this.toggleSystemUISounds.bindAsEventListener(this));
7
8 $('currentringtonerow').observe(Mojo.Event.tap, this.showAudioFilePicker.bindAsEventListener(this));
9+ $('currentalertrow').observe(Mojo.Event.tap, this.showAlertFilePicker.bindAsEventListener(this));
10+ $('currentnotificationrow').observe(Mojo.Event.tap, this.showNotificationFilePicker.bindAsEventListener(this));
11
12 this.getCurrentVolumes();
13 this.getCurrentRingtone();
14+ this.getCurrentAlert();
15+ this.getCurrentNotification();
16 this.getVibrateSettings();
17 this.getOtherSettings();
18
19@@ -260,6 +264,58 @@ var SoundsalertsconfigAssistant = Class.create({
20 $('currentringtone').innerHTML = file.name;
21 },
22
23+ // Alert Picking
24+ getCurrentAlert: function() {
25+ this.getCurrentAlertReq = SystemService.getAlerts(this.getCurrentAlertQuery.bind(this));
26+ },
27+
28+ getCurrentAlertQuery: function(payload) {
29+ if (payload.alerttone) {
30+ $('currentalert').innerHTML = payload.alerttone.name;
31+ this.currAlertPath = payload.alerttone.fullPath;
32+ }
33+ else
34+ $('currentalert').innerHTML = $L("Pick an alert");
35+
36+ },
37+
38+ showAlertFilePicker: function(event) {
39+ var params = {"kinds": ["ringtone"],"filePath":this.currAlertPath,"onSelect":this.selectedAlertFile.bind(this),actionType:"attach",actionName: $L("Done")};
40+ Mojo.FilePicker.pickFile(params,Mojo.Controller.stageController);
41+ },
42+
43+ selectedAlertFile: function(file) {
44+ //var params = {"fullPath": encodeURIComponent(file.fullPath), "name":file.name};
45+ this.setAlertReq = SystemService.setAlerts(file);
46+ $('currentalert').innerHTML = file.name;
47+ },
48+
49+ // Notification Picking
50+ getCurrentNotification: function() {
51+ this.getCurrentNotificationReq = SystemService.getNotifications(this.getCurrentNotificationQuery.bind(this));
52+ },
53+
54+ getCurrentNotificationQuery: function(payload) {
55+ if (payload.notificationtone) {
56+ $('currentnotification').innerHTML = payload.notificationtone.name;
57+ this.currNotificationPath = payload.notificationtone.fullPath;
58+ }
59+ else
60+ $('currentnotification').innerHTML = $L("Pick a notification");
61+
62+ },
63+
64+ showNotificationFilePicker: function(event) {
65+ var params = {"kinds": ["ringtone"],"filePath":this.currNotificationPath,"onSelect":this.selectedNotificationFile.bind(this),actionType:"attach",actionName: $L("Done")};
66+ Mojo.FilePicker.pickFile(params,Mojo.Controller.stageController);
67+ },
68+
69+ selectedNotificationFile: function(file) {
70+ //var params = {"fullPath": encodeURIComponent(file.fullPath), "name":file.name};
71+ this.setNotificationReq = SystemService.setNotifications(file);
72+ $('currentnotification').innerHTML = file.name;
73+ },
74+
75 getVibrateSettings: function() {
76 this.getVibrateSettingsReq = AudioService.getVibrateSettings(this.vibrateSettingsCB.bind(this),this);
77 },
78diff --git a/usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js b/usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js
79index c5babe5..68e70d0 100644
80--- a/usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js
81+++ b/usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js
82@@ -28,6 +28,42 @@ SystemService.getRingtone = function(callback) {
83 return request;
84 }
85
86+SystemService.getAlerts = function(callback) {
87+ var request = new Mojo.Service.Request(SystemService.identifier, {
88+ method: 'getPreferences',
89+ parameters: {"keys":["alerttone"]},
90+ onSuccess: callback,
91+ onFailure: callback
92+ });
93+ return request;
94+}
95+
96+SystemService.setAlerts = function(value){
97+ var request = new Mojo.Service.Request(SystemService.identifier, {
98+ method: 'setPreferences',
99+ parameters: {"alerttone":value},
100+ });
101+ return request;
102+}
103+
104+SystemService.getNotifications = function(callback) {
105+ var request = new Mojo.Service.Request(SystemService.identifier, {
106+ method: 'getPreferences',
107+ parameters: {"keys":["notificationtone"]},
108+ onSuccess: callback,
109+ onFailure: callback
110+ });
111+ return request;
112+}
113+
114+SystemService.setNotifications = function(value){
115+ var request = new Mojo.Service.Request(SystemService.identifier, {
116+ method: 'setPreferences',
117+ parameters: {"notificationtone":value},
118+ });
119+ return request;
120+}
121+
122 SystemService.getSystemUISounds = function(callback) {
123 var request = new Mojo.Service.Request(SystemService.identifier, {
124 method: 'getPreferences',
125diff --git a/usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html b/usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html
126index b73157c..7ed29ab 100644
127--- a/usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html
128+++ b/usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html
129@@ -52,9 +52,21 @@
130 </div>
131 </div>
132 </div>
133+ <div id='currentalertrow' class="palm-row" x-mojo-tap-highlight="momentary">
134+ <div class="palm-row-wrapper">
135+ <div class="label" x-mojo-loc=''>Alert</div>
136+ <div id='currentalert' class="title"></div>
137+ </div>
138+ </div>
139+ <div id='currentnotificationrow' class="palm-row" x-mojo-tap-highlight="momentary">
140+ <div class="palm-row-wrapper">
141+ <div class="label" x-mojo-loc=''>Notification</div>
142+ <div id='currentnotification' class="title"></div>
143+ </div>
144+ </div>
145 <div class="palm-row last">
146 <div class="palm-row-wrapper">
147- <div class="title" x-mojo-loc=''>Volume</div>
148+ <div class="title" x-mojo-loc=''>System Volume</div>
149 <div x-mojo-element="Slider" id='systemvolume' class="palm-slider"></div>
150 </div>
151 </div>
  
1diff --git a/usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js b/usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js
2index f24c16c..5330fe4 100644
3--- a/usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js
4+++ b/usr/palm/applications/com.palm.app.soundsandalerts/app/controllers/soundsalertsconfig-assistant.js
5@@ -94,9 +94,13 @@ var SoundsalertsconfigAssistant = Class.create({
6 $('system_ui_sounds').observe('mojo-property-change', this.toggleSystemUISounds.bindAsEventListener(this));
7
8 $('currentringtonerow').observe(Mojo.Event.tap, this.showAudioFilePicker.bindAsEventListener(this));
9+ $('currentalertrow').observe(Mojo.Event.tap, this.showAlertFilePicker.bindAsEventListener(this));
10+ $('currentnotificationrow').observe(Mojo.Event.tap, this.showNotificationFilePicker.bindAsEventListener(this));
11
12 this.getCurrentVolumes();
13 this.getCurrentRingtone();
14+ this.getCurrentAlert();
15+ this.getCurrentNotification();
16 this.getVibrateSettings();
17 this.getOtherSettings();
18
19@@ -260,6 +264,58 @@ var SoundsalertsconfigAssistant = Class.create({
20 $('currentringtone').innerHTML = file.name;
21 },
22
23+ // Alert Picking
24+ getCurrentAlert: function() {
25+ this.getCurrentAlertReq = SystemService.getAlerts(this.getCurrentAlertQuery.bind(this));
26+ },
27+
28+ getCurrentAlertQuery: function(payload) {
29+ if (payload.alerttone) {
30+ $('currentalert').innerHTML = payload.alerttone.name;
31+ this.currAlertPath = payload.alerttone.fullPath;
32+ }
33+ else
34+ $('currentalert').innerHTML = $L("Pick an alert");
35+
36+ },
37+
38+ showAlertFilePicker: function(event) {
39+ var params = {"kinds": ["ringtone"],"filePath":this.currAlertPath,"onSelect":this.selectedAlertFile.bind(this),actionType:"attach",actionName: $L("Done")};
40+ Mojo.FilePicker.pickFile(params,Mojo.Controller.stageController);
41+ },
42+
43+ selectedAlertFile: function(file) {
44+ //var params = {"fullPath": encodeURIComponent(file.fullPath), "name":file.name};
45+ this.setAlertReq = SystemService.setAlerts(file);
46+ $('currentalert').innerHTML = file.name;
47+ },
48+
49+ // Notification Picking
50+ getCurrentNotification: function() {
51+ this.getCurrentNotificationReq = SystemService.getNotifications(this.getCurrentNotificationQuery.bind(this));
52+ },
53+
54+ getCurrentNotificationQuery: function(payload) {
55+ if (payload.notificationtone) {
56+ $('currentnotification').innerHTML = payload.notificationtone.name;
57+ this.currNotificationPath = payload.notificationtone.fullPath;
58+ }
59+ else
60+ $('currentnotification').innerHTML = $L("Pick a notification");
61+
62+ },
63+
64+ showNotificationFilePicker: function(event) {
65+ var params = {"kinds": ["ringtone"],"filePath":this.currNotificationPath,"onSelect":this.selectedNotificationFile.bind(this),actionType:"attach",actionName: $L("Done")};
66+ Mojo.FilePicker.pickFile(params,Mojo.Controller.stageController);
67+ },
68+
69+ selectedNotificationFile: function(file) {
70+ //var params = {"fullPath": encodeURIComponent(file.fullPath), "name":file.name};
71+ this.setNotificationReq = SystemService.setNotifications(file);
72+ $('currentnotification').innerHTML = file.name;
73+ },
74+
75 getVibrateSettings: function() {
76 this.getVibrateSettingsReq = AudioService.getVibrateSettings(this.vibrateSettingsCB.bind(this),this);
77 },
78diff --git a/usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js b/usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js
79index c5babe5..68e70d0 100644
80--- a/usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js
81+++ b/usr/palm/applications/com.palm.app.soundsandalerts/app/models/SystemService.js
82@@ -28,6 +28,42 @@ SystemService.getRingtone = function(callback) {
83 return request;
84 }
85
86+SystemService.getAlerts = function(callback) {
87+ var request = new Mojo.Service.Request(SystemService.identifier, {
88+ method: 'getPreferences',
89+ parameters: {"keys":["alerttone"]},
90+ onSuccess: callback,
91+ onFailure: callback
92+ });
93+ return request;
94+}
95+
96+SystemService.setAlerts = function(value){
97+ var request = new Mojo.Service.Request(SystemService.identifier, {
98+ method: 'setPreferences',
99+ parameters: {"alerttone":value},
100+ });
101+ return request;
102+}
103+
104+SystemService.getNotifications = function(callback) {
105+ var request = new Mojo.Service.Request(SystemService.identifier, {
106+ method: 'getPreferences',
107+ parameters: {"keys":["notificationtone"]},
108+ onSuccess: callback,
109+ onFailure: callback
110+ });
111+ return request;
112+}
113+
114+SystemService.setNotifications = function(value){
115+ var request = new Mojo.Service.Request(SystemService.identifier, {
116+ method: 'setPreferences',
117+ parameters: {"notificationtone":value},
118+ });
119+ return request;
120+}
121+
122 SystemService.getSystemUISounds = function(callback) {
123 var request = new Mojo.Service.Request(SystemService.identifier, {
124 method: 'getPreferences',
125diff --git a/usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html b/usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html
126index b73157c..7ed29ab 100644
127--- a/usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html
128+++ b/usr/palm/applications/com.palm.app.soundsandalerts/app/views/soundsalertsconfig/soundsalertsconfig-scene.html
129@@ -52,9 +52,21 @@
130 </div>
131 </div>
132 </div>
133+ <div id='currentalertrow' class="palm-row" x-mojo-tap-highlight="momentary">
134+ <div class="palm-row-wrapper">
135+ <div class="label" x-mojo-loc=''>Alert</div>
136+ <div id='currentalert' class="title"></div>
137+ </div>
138+ </div>
139+ <div id='currentnotificationrow' class="palm-row" x-mojo-tap-highlight="momentary">
140+ <div class="palm-row-wrapper">
141+ <div class="label" x-mojo-loc=''>Notification</div>
142+ <div id='currentnotification' class="title"></div>
143+ </div>
144+ </div>
145 <div class="palm-row last">
146 <div class="palm-row-wrapper">
147- <div class="title" x-mojo-loc=''>Volume</div>
148+ <div class="title" x-mojo-loc=''>System Volume</div>
149 <div x-mojo-element="Slider" id='systemvolume' class="palm-slider"></div>
150 </div>
151 </div>
  
1diff --git a/usr/palm/applications/com.mobitv.app.sprinttv/appinfo.json b/usr/palm/applications/com.mobitv.app.sprinttv/appinfo.json
2index 4ff8cbd..67ac3eb 100755
3--- a/usr/palm/applications/com.mobitv.app.sprinttv/appinfo.json
4+++ b/usr/palm/applications/com.mobitv.app.sprinttv/appinfo.json
5@@ -6,5 +6,6 @@
6 "icon": "icon.png",
7 "version": "1.5",
8 "vendor": "Sprint",
9- "vendorurl": "www.sprint.com"
10+ "vendorurl": "www.sprint.com",
11+ "visible": false
12 }
13\ No newline at end of file
  
1This is a small modification that changes how new tasks are handled.
2Ordinarily, new tasks appear at the bottom of the task list. In this
3view, you need to tap again to enter details like a due date. With
4this patch, when you add a task, a details card appears, in which you
5can mmediately set the task name, due date, task list, and priority.
6You're not forced to fill out each of those fields, they're just
7available. Enter your info, then swipe back and you'll see your new
8task in the list, or close the new task card (flick up) and the task
9is saved automatically.
10
11Tested-On: 1.1
12
13Mod by Tuckmobile
14Patch submitted by JackieRipper
15Index: /usr/palm/applications/com.palm.app.tasks/app/controllers/tasks-assistant.js
16===================================================================
17--- .orig/usr/palm/applications/com.palm.app.tasks/app/controllers/tasks-assistant.js
18+++ /usr/palm/applications/com.palm.app.tasks/app/controllers/tasks-assistant.js
19@@ -918,7 +918,7 @@ var TasksAssistant = Class.create({
20 this.listElement.mojo.insertItemsAt(index, [task]);
21 this.listElement.mojo.revealItem(index);
22 this.addWidgets(this.listElement.mojo.getNodeByIndex(index).querySelector('[name="subject"]'), task);
23- this.listElement.mojo.focusItem(task);
24+ this.state.edit.call(this, index);
25
26 task.priority = previousTask.priority; // Attempt to inherit the priority
27
28@@ -941,7 +941,7 @@ var TasksAssistant = Class.create({
29 {
30 // If we find the node we just added, focus on it. We might not find the node however if the list is being refreshed
31 self.addWidgets(node.querySelector('[name="subject"]'), task);
32- self.listElement.mojo.focusItem(task);
33+ self.state.edit.call(self, index);
34 }
35
36 Mojo.Log.info("New task %j %j", task, self.task);
  
1This is a small modification that changes how new tasks are handled.
2Ordinarily, new tasks appear at the bottom of the task list. In this
3view, you need to tap again to enter details like a due date. With
4this patch, when you add a task, a details card appears, in which you
5can mmediately set the task name, due date, task list, and priority.
6You're not forced to fill out each of those fields, they're just
7available. Enter your info, then swipe back and you'll see your new
8task in the list, or close the new task card (flick up) and the task
9is saved automatically.
10
11Tested-On: 1.1
12
13Mod by Tuckmobile
14Patch submitted by JackieRipper
15Index: /usr/palm/applications/com.palm.app.tasks/app/controllers/tasks-assistant.js
16===================================================================
17--- .orig/usr/palm/applications/com.palm.app.tasks/app/controllers/tasks-assistant.js
18+++ /usr/palm/applications/com.palm.app.tasks/app/controllers/tasks-assistant.js
19@@ -918,7 +918,7 @@ var TasksAssistant = Class.create({
20 this.listElement.mojo.insertItemsAt(index, [task]);
21 this.listElement.mojo.revealItem(index);
22 this.addWidgets(this.listElement.mojo.getNodeByIndex(index).querySelector('[name="subject"]'), task);
23- this.listElement.mojo.focusItem(task);
24+ this.state.edit.call(this, index);
25
26 task.priority = previousTask.priority; // Attempt to inherit the priority
27
28@@ -941,7 +941,7 @@ var TasksAssistant = Class.create({
29 {
30 // If we find the node we just added, focus on it. We might not find the node however if the list is being refreshed
31 self.addWidgets(node.querySelector('[name="subject"]'), task);
32- self.listElement.mojo.focusItem(task);
33+ self.state.edit.call(self, index);
34 }
35
36 Mojo.Log.info("New task %j %j", task, self.task);