diff --git a/lib/cordova.webos-debug.js b/lib/cordova.webos-debug.js
index 9e39278..f31088f 100644
--- a/lib/cordova.webos-debug.js
+++ b/lib/cordova.webos-debug.js
@@ -1,8 +1,8 @@
 // Platform: webos
 
-// commit ab5e7db58d684da1403ab6059a80f3b4635bde4d
+// commit 0f40ae8ab0eb19efecf6dd3be09106feec417bef
 
-// File generated at :: Tue Feb 05 2013 13:01:43 GMT-0800 (PST)
+// File generated at :: Tue Feb 19 2013 13:48:03 GMT-0800 (PST)
 
 /*
  Licensed to the Apache Software Foundation (ASF) under one
@@ -34,7 +34,7 @@
 try {eval("define(\"cordova/common\", function(require, exports, module) {\n\nmodule.exports = {\n    defaults: {\n        cordova: {\n            path: 'cordova',\n            children: {\n                exec: {\n                    path: 'cordova/exec'\n                },\n                logger: {\n                    path: 'cordova/plugin/logger'\n                }\n            }\n        },\n        Cordova: {\n            children: {\n                exec: {\n                    path: 'cordova/exec'\n                }\n            }\n        },\n        open : {\n            path: 'cordova/plugin/InAppBrowser'\n        },\n        navigator: {\n            children: {\n                notification: {\n                    path: 'cordova/plugin/notification'\n                },\n                accelerometer: {\n                    path: 'cordova/plugin/accelerometer'\n                },\n                battery: {\n                    path: 'cordova/plugin/battery'\n                },\n                camera:{\n                    path: 'cordova/plugin/Camera'\n                },\n                compass:{\n                    path: 'cordova/plugin/compass'\n                },\n                contacts: {\n                    path: 'cordova/plugin/contacts'\n                },\n                device:{\n                    children:{\n                        capture: {\n                            path: 'cordova/plugin/capture'\n                        }\n                    }\n                },\n                geolocation: {\n                    path: 'cordova/plugin/geolocation'\n                },\n                globalization: {\n                    path: 'cordova/plugin/globalization'\n                },\n                network: {\n                    children: {\n                        connection: {\n                            path: 'cordova/plugin/network',\n                            deprecated: 'navigator.network.connection is deprecated. Use navigator.connection instead.'\n                        }\n                    }\n                },\n                splashscreen: {\n                    path: 'cordova/plugin/splashscreen'\n                }\n            }\n        },\n        Acceleration: {\n            path: 'cordova/plugin/Acceleration'\n        },\n        Camera:{\n            path: 'cordova/plugin/CameraConstants'\n        },\n        CameraPopoverOptions: {\n            path: 'cordova/plugin/CameraPopoverOptions'\n        },\n        CaptureError: {\n            path: 'cordova/plugin/CaptureError'\n        },\n        CaptureAudioOptions:{\n            path: 'cordova/plugin/CaptureAudioOptions'\n        },\n        CaptureImageOptions: {\n            path: 'cordova/plugin/CaptureImageOptions'\n        },\n        CaptureVideoOptions: {\n            path: 'cordova/plugin/CaptureVideoOptions'\n        },\n        CompassHeading:{\n            path: 'cordova/plugin/CompassHeading'\n        },\n        CompassError:{\n            path: 'cordova/plugin/CompassError'\n        },\n        ConfigurationData: {\n            path: 'cordova/plugin/ConfigurationData'\n        },\n        Connection: {\n            path: 'cordova/plugin/Connection'\n        },\n        Contact: {\n            path: 'cordova/plugin/Contact'\n        },\n        ContactAddress: {\n            path: 'cordova/plugin/ContactAddress'\n        },\n        ContactError: {\n            path: 'cordova/plugin/ContactError'\n        },\n        ContactField: {\n            path: 'cordova/plugin/ContactField'\n        },\n        ContactFindOptions: {\n            path: 'cordova/plugin/ContactFindOptions'\n        },\n        ContactName: {\n            path: 'cordova/plugin/ContactName'\n        },\n        ContactOrganization: {\n            path: 'cordova/plugin/ContactOrganization'\n        },\n        Coordinates: {\n            path: 'cordova/plugin/Coordinates'\n        },\n        device: {\n            path: 'cordova/plugin/device'\n        },\n        GlobalizationError: {\n            path: 'cordova/plugin/GlobalizationError'\n        },\n        Media: {\n            path: 'cordova/plugin/Media'\n        },\n        MediaError: {\n            path: 'cordova/plugin/MediaError'\n        },\n        MediaFile: {\n            path: 'cordova/plugin/MediaFile'\n        },\n        MediaFileData:{\n            path: 'cordova/plugin/MediaFileData'\n        },\n        Position: {\n            path: 'cordova/plugin/Position'\n        },\n        PositionError: {\n            path: 'cordova/plugin/PositionError'\n        },\n        ProgressEvent: {\n            path: 'cordova/plugin/ProgressEvent'\n        }\n    },\n    clobbers: {\n        navigator: {\n            children: {\n                connection: {\n                    path: 'cordova/plugin/network'\n                }\n            }\n        }\n    }\n};\n\n});\n\n//@ sourceURL=lib/common/common.js")} catch(e) {console.log("exception: in lib/common/common.js: " + e);console.log(e.stack);}
 try {eval("define(\"cordova/exec\", function(require, exports, module) {\n\n/**\n * Execute a cordova command.  It is up to the native side whether this action\n * is synchronous or asynchronous.  The native side can return:\n *      Synchronous: PluginResult object as a JSON string\n *      Asynchrounous: Empty string \"\"\n * If async, the native side will cordova.callbackSuccess or cordova.callbackError,\n * depending upon the result of the action.\n *\n * @param {Function} success    The success callback\n * @param {Function} fail       The fail callback\n * @param {String} service      The name of the service to use\n * @param {String} action       Action to be run in cordova\n * @param {String[]} [args]     Zero or more arguments to pass to the method\n */\n\nvar plugins = {\n    \"Device\": require('cordova/plugin/webos/device'),\n    \"NetworkStatus\": require('cordova/plugin/webos/network'),\n    \"Compass\": require('cordova/plugin/webos/compass'),\n    \"Camera\": require('cordova/plugin/webos/camera'),\n    \"Accelerometer\" : require('cordova/plugin/webos/accelerometer'),\n    \"Notification\" : require('cordova/plugin/webos/notification'),\n    \"Geolocation\": require('cordova/plugin/webos/geolocation')\n};\n\nmodule.exports = function(success, fail, service, action, args) {\n    try {\n        console.error(\"exec:call plugin:\"+service+\":\"+action);\n        plugins[service][action](success, fail, args);\n    }\n    catch(e) {\n        console.error(\"missing exec: \" + service + \".\" + action);\n        console.error(args);\n        console.error(e);\n        console.error(e.stack);\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/exec.js")} catch(e) {console.log("exception: in lib/webos/exec.js: " + e);console.log(e.stack);}
 try {eval("define(\"cordova/modulemapper\", function(require, exports, module) {\n\nvar builder = require('cordova/builder'),\n    moduleMap = define.moduleMap,\n    symbolList,\n    deprecationMap;\n\nexports.reset = function() {\n    symbolList = [];\n    deprecationMap = {};\n};\n\nfunction addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) {\n    if (!(moduleName in moduleMap)) {\n        throw new Error('Module ' + moduleName + ' does not exist.');\n    }\n    symbolList.push(strategy, moduleName, symbolPath);\n    if (opt_deprecationMessage) {\n        deprecationMap[symbolPath] = opt_deprecationMessage;\n    }\n}\n\n// Note: Android 2.3 does have Function.bind().\nexports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) {\n    addEntry('c', moduleName, symbolPath, opt_deprecationMessage);\n};\n\nexports.merges = function(moduleName, symbolPath, opt_deprecationMessage) {\n    addEntry('m', moduleName, symbolPath, opt_deprecationMessage);\n};\n\nexports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) {\n    addEntry('d', moduleName, symbolPath, opt_deprecationMessage);\n};\n\nfunction prepareNamespace(symbolPath, context) {\n    if (!symbolPath) {\n        return context;\n    }\n    var parts = symbolPath.split('.');\n    var cur = context;\n    for (var i = 0, part; part = parts[i]; ++i) {\n        cur[part] = cur[part] || {};\n    }\n    return cur[parts[i-1]];\n}\n\nexports.mapModules = function(context) {\n    var origSymbols = {};\n    context.CDV_origSymbols = origSymbols;\n    for (var i = 0, len = symbolList.length; i < len; i += 3) {\n        var strategy = symbolList[i];\n        var moduleName = symbolList[i + 1];\n        var symbolPath = symbolList[i + 2];\n        var lastDot = symbolPath.lastIndexOf('.');\n        var namespace = symbolPath.substr(0, lastDot);\n        var lastName = symbolPath.substr(lastDot + 1);\n\n        var module = require(moduleName);\n        var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null;\n        var parentObj = prepareNamespace(namespace, context);\n        var target = parentObj[lastName];\n\n        if (strategy == 'm' && target) {\n            builder.recursiveMerge(target, module);\n        } else if ((strategy == 'd' && !target) || (strategy != 'd')) {\n            if (target) {\n                origSymbols[symbolPath] = target;\n            }\n            builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg);\n        }\n    }\n};\n\nexports.getOriginalSymbol = function(context, symbolPath) {\n    var origSymbols = context.CDV_origSymbols;\n    if (origSymbols && (symbolPath in origSymbols)) {\n        return origSymbols[symbolPath];\n    }\n    var parts = symbolPath.split('.');\n    var obj = context;\n    for (var i = 0; i < parts.length; ++i) {\n        obj = obj && obj[parts[i]];\n    }\n    return obj;\n};\n\nexports.loadMatchingModules = function(matchingRegExp) {\n    for (var k in moduleMap) {\n        if (matchingRegExp.exec(k)) {\n            require(k);\n        }\n    }\n};\n\nexports.reset();\n\n\n});\n\n//@ sourceURL=lib/common/modulemapper.js")} catch(e) {console.log("exception: in lib/common/modulemapper.js: " + e);console.log(e.stack);}
-try {eval("define(\"cordova/platform\", function(require, exports, module) {\n\nvar service=require('cordova/plugin/webos/service'),\n    cordova = require('cordova');\n\nmodule.exports = {\n    id: \"webos\",\n    initialize: function() {\n        var modulemapper = require('cordova/modulemapper');\n\n        modulemapper.loadMatchingModules(/cordova.*\\/symbols$/);\n        modulemapper.mapModules(window);\n\n        if (window.PalmSystem) {\n            window.PalmSystem.stageReady();\n        }\n\n        var Mojo = window.Mojo || {};\n\n        // wait for deviceready before listening and firing document events\n        document.addEventListener(\"deviceready\", function () {\n\n            // LunaSysMgr calls this when the windows is maximized or opened.\n            window.Mojo.stageActivated = function() {\n                console.log(\"stageActivated\");\n                cordova.fireDocumentEvent(\"resume\");\n            };\n            // LunaSysMgr calls this when the windows is minimized or closed.\n            window.Mojo.stageDeactivated = function() {\n                console.log(\"stageDeactivated\");\n                cordova.fireDocumentEvent(\"pause\");\n            };\n            // LunaSysMgr calls this when a KeepAlive app's window is hidden\n            window.Mojo.hide = function() {\n                console.log(\"hide\");\n            };\n            // LunaSysMgr calls this when a KeepAlive app's window is shown\n            window.Mojo.show = function() {\n                console.log(\"show\");\n            };\n\n            // LunaSysMgr calls this whenever an app is \"launched;\"\n            window.Mojo.relaunch = function() {\n                // need to return true to tell sysmgr the relaunch succeeded.\n                // otherwise, it'll try to focus the app, which will focus the first\n                // opened window of an app with multiple windows.\n\n                var lp=JSON.parse(PalmSystem.launchParams) || {};\n\n                if (lp['palm-command'] && lp['palm-command'] == 'open-app-menu') {\n                    console.log(\"event:ToggleAppMenu\");\n                    cordova.fireDocumentEvent(\"menubutton\");\n                }\n\n                console.log(\"relaunch\");\n                return true;\n            };\n\n            // start to listen for network connection changes\n            service.Request('palm://com.palm.connectionmanager', {\n                method: 'getstatus',\n                parameters: { subscribe: true },\n                onSuccess: function (result) {\n                    console.log(\"subscribe:result:\"+JSON.stringify(result));\n\n                    if (!result.isInternetConnectionAvailable) {\n                        if (navigator.onLine) {\n                            console.log(\"Firing event:offline\");\n                            cordova.fireDocumentEvent(\"offline\");\n                        }\n                    } else {\n                        console.log(\"Firing event:online\");\n                        cordova.fireDocumentEvent(\"online\");\n                    }\n                },\n                onFailure: function(e) {\n                    console.error(\"subscribe:error\");\n                }\n            });\n\n        });\n    },\n    merges: {\n        navigator: {\n            children: {\n                service: {\n                    path: \"cordova/plugin/webos/service\"\n                },\n                application: {\n                    path: \"cordova/plugin/webos/application\"\n                },\n                window: {\n                    path: \"cordova/plugin/webos/window\"\n                },\n                notification: {\n                    path: \"cordova/plugin/webos/notification\"\n                },\n                orientation: {\n                    path: \"cordova/plugin/webos/orientation\"\n                },\n                keyboard: {\n                    path: \"cordova/plugin/webos/keyboard\"\n                }\n            }\n        }\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/platform.js")} catch(e) {console.log("exception: in lib/webos/platform.js: " + e);console.log(e.stack);}
+try {eval("define(\"cordova/platform\", function(require, exports, module) {\n\nvar service=require('cordova/plugin/webos/service'),\n    cordova = require('cordova');\n\nmodule.exports = {\n    id: \"webos\",\n    initialize: function() {\n        var modulemapper = require('cordova/modulemapper');\n\n        modulemapper.loadMatchingModules(/cordova.*\\/symbols$/);\n        modulemapper.mapModules(window);\n\n        if (window.PalmSystem) {\n            window.PalmSystem.stageReady();\n        }\n\n        // create global Mojo object if it does not exist\n        Mojo = window.Mojo || {};\n\n        // wait for deviceready before listening and firing document events\n        document.addEventListener(\"deviceready\", function () {\n\n            // LunaSysMgr calls this when the windows is maximized or opened.\n            window.Mojo.stageActivated = function() {\n                console.log(\"stageActivated\");\n                cordova.fireDocumentEvent(\"resume\");\n            };\n            // LunaSysMgr calls this when the windows is minimized or closed.\n            window.Mojo.stageDeactivated = function() {\n                console.log(\"stageDeactivated\");\n                cordova.fireDocumentEvent(\"pause\");\n            };\n            // LunaSysMgr calls this when a KeepAlive app's window is hidden\n            window.Mojo.hide = function() {\n                console.log(\"hide\");\n            };\n            // LunaSysMgr calls this when a KeepAlive app's window is shown\n            window.Mojo.show = function() {\n                console.log(\"show\");\n            };\n\n            // LunaSysMgr calls this whenever an app is \"launched;\"\n            window.Mojo.relaunch = function() {\n                // need to return true to tell sysmgr the relaunch succeeded.\n                // otherwise, it'll try to focus the app, which will focus the first\n                // opened window of an app with multiple windows.\n\n                var lp=JSON.parse(PalmSystem.launchParams) || {};\n\n                if (lp['palm-command'] && lp['palm-command'] == 'open-app-menu') {\n                    console.log(\"event:ToggleAppMenu\");\n                    cordova.fireDocumentEvent(\"menubutton\");\n                }\n\n                console.log(\"relaunch\");\n                return true;\n            };\n\n            // start to listen for network connection changes\n            service.Request('palm://com.palm.connectionmanager', {\n                method: 'getstatus',\n                parameters: { subscribe: true },\n                onSuccess: function (result) {\n                    console.log(\"subscribe:result:\"+JSON.stringify(result));\n\n                    if (!result.isInternetConnectionAvailable) {\n                        if (navigator.onLine) {\n                            console.log(\"Firing event:offline\");\n                            cordova.fireDocumentEvent(\"offline\");\n                        }\n                    } else {\n                        console.log(\"Firing event:online\");\n                        cordova.fireDocumentEvent(\"online\");\n                    }\n                },\n                onFailure: function(e) {\n                    console.error(\"subscribe:error\");\n                }\n            });\n\n        });\n    },\n    merges: {\n        navigator: {\n            children: {\n                service: {\n                    path: \"cordova/plugin/webos/service\"\n                },\n                application: {\n                    path: \"cordova/plugin/webos/application\"\n                },\n                window: {\n                    path: \"cordova/plugin/webos/window\"\n                },\n                notification: {\n                    path: \"cordova/plugin/webos/notification\"\n                },\n                orientation: {\n                    path: \"cordova/plugin/webos/orientation\"\n                },\n                keyboard: {\n                    path: \"cordova/plugin/webos/keyboard\"\n                }\n            }\n        }\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/platform.js")} catch(e) {console.log("exception: in lib/webos/platform.js: " + e);console.log(e.stack);}
 try {eval("define(\"cordova/plugin/Acceleration\", function(require, exports, module) {\n\nvar Acceleration = function(x, y, z, timestamp) {\n    this.x = x;\n    this.y = y;\n    this.z = z;\n    this.timestamp = timestamp || (new Date()).getTime();\n};\n\nmodule.exports = Acceleration;\n\n});\n\n//@ sourceURL=lib/common/plugin/Acceleration.js")} catch(e) {console.log("exception: in lib/common/plugin/Acceleration.js: " + e);console.log(e.stack);}
 try {eval("define(\"cordova/plugin/Camera\", function(require, exports, module) {\n\nvar argscheck = require('cordova/argscheck'),\n    exec = require('cordova/exec'),\n    Camera = require('cordova/plugin/CameraConstants');\n\nvar cameraExport = {};\n\n// Tack on the Camera Constants to the base camera plugin.\nfor (var key in Camera) {\n    cameraExport[key] = Camera[key];\n}\n\n/**\n * Gets a picture from source defined by \"options.sourceType\", and returns the\n * image as defined by the \"options.destinationType\" option.\n\n * The defaults are sourceType=CAMERA and destinationType=FILE_URI.\n *\n * @param {Function} successCallback\n * @param {Function} errorCallback\n * @param {Object} options\n */\ncameraExport.getPicture = function(successCallback, errorCallback, options) {\n    argscheck.checkArgs('fFO', 'Camera.getPicture', arguments);\n    options = options || {};\n    var getValue = argscheck.getValue;\n\n    var quality = getValue(options.quality, 50);\n    var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI);\n    var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA);\n    var targetWidth = getValue(options.targetWidth, -1);\n    var targetHeight = getValue(options.targetHeight, -1);\n    var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG);\n    var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE);\n    var allowEdit = !!options.allowEdit;\n    var correctOrientation = !!options.correctOrientation;\n    var saveToPhotoAlbum = !!options.saveToPhotoAlbum;\n    var popoverOptions = getValue(options.popoverOptions, null);\n\n    var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,\n                mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions];\n\n    exec(successCallback, errorCallback, \"Camera\", \"takePicture\", args);\n};\n\ncameraExport.cleanup = function(successCallback, errorCallback) {\n    exec(successCallback, errorCallback, \"Camera\", \"cleanup\", []);\n};\n\nmodule.exports = cameraExport;\n\n});\n\n//@ sourceURL=lib/common/plugin/Camera.js")} catch(e) {console.log("exception: in lib/common/plugin/Camera.js: " + e);console.log(e.stack);}
 try {eval("define(\"cordova/plugin/CameraConstants\", function(require, exports, module) {\n\nmodule.exports = {\n  DestinationType:{\n    DATA_URL: 0,         // Return base64 encoded string\n    FILE_URI: 1,         // Return file uri (content://media/external/images/media/2 for Android)\n    NATIVE_URI: 2        // Return native uri (eg. asset-library://... for iOS)\n  },\n  EncodingType:{\n    JPEG: 0,             // Return JPEG encoded image\n    PNG: 1               // Return PNG encoded image\n  },\n  MediaType:{\n    PICTURE: 0,          // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType\n    VIDEO: 1,            // allow selection of video only, ONLY RETURNS URL\n    ALLMEDIA : 2         // allow selection from all media types\n  },\n  PictureSourceType:{\n    PHOTOLIBRARY : 0,    // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)\n    CAMERA : 1,          // Take picture from camera\n    SAVEDPHOTOALBUM : 2  // Choose image from picture library (same as PHOTOLIBRARY for Android)\n  },\n  PopoverArrowDirection:{\n      ARROW_UP : 1,        // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover\n      ARROW_DOWN : 2,\n      ARROW_LEFT : 4,\n      ARROW_RIGHT : 8,\n      ARROW_ANY : 15\n  }\n};\n\n});\n\n//@ sourceURL=lib/common/plugin/CameraConstants.js")} catch(e) {console.log("exception: in lib/common/plugin/CameraConstants.js: " + e);console.log(e.stack);}
@@ -107,7 +107,7 @@
 try {eval("define(\"cordova/plugin/webos/filereader\", function(require, exports, module) {\n\nvar FileError = require('cordova/plugin/FileError'),\n    ProgressEvent = require('cordova/plugin/ProgressEvent');\n\nvar FileReader = function() {\n    this.fileName = \"\";\n\n    this.readyState = 0; // FileReader.EMPTY\n\n    // File data\n    this.result = null;\n\n    // Error\n    this.error = null;\n\n    // Event handlers\n    this.onloadstart = null;    // When the read starts.\n    this.onprogress = null;     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progess.loaded/progress.total)\n    this.onload = null;         // When the read has successfully completed.\n    this.onerror = null;        // When the read has failed (see errors).\n    this.onloadend = null;      // When the request has completed (either in success or failure).\n    this.onabort = null;        // When the read has been aborted. For instance, by invoking the abort() method.\n};\n\nFileReader.prototype.readAsText = function(file, encoding) {\n    console.error(\"webos plugin filereader readastext:\" + file);\n    //Mojo has no file i/o yet, so we use an xhr. very limited\n\n    // Already loading something\n    if (this.readyState == FileReader.LOADING) {\n        throw new FileError(FileError.INVALID_STATE_ERR);\n    }\n\n    // LOADING state\n    this.readyState = FileReader.LOADING;\n\n    // If loadstart callback\n    if (typeof this.onloadstart === \"function\") {\n        this.onloadstart(new ProgressEvent(\"loadstart\", {target:this}));\n    }\n\n    // Default encoding is UTF-8\n    var enc = encoding ? encoding : \"UTF-8\";\n\n    var me = this;\n\n    var xhr = new XMLHttpRequest();\n    xhr.onreadystatechange = function() {\n        console.error(\"onreadystatechange:\"+xhr.readyState+\" \"+xhr.status);\n        if (xhr.readyState == 4) {\n            if (xhr.status == 200 && xhr.responseText) {\n                console.error(\"file read completed\");\n                // Save result\n                me.result = xhr.responseText;\n\n                // If onload callback\n                if (typeof me.onload === \"function\") {\n                    me.onload(new ProgressEvent(\"load\", {target:me}));\n                }\n\n                // DONE state\n                me.readyState = FileReader.DONE;\n\n                // If onloadend callback\n                if (typeof me.onloadend === \"function\") {\n                    me.onloadend(new ProgressEvent(\"loadend\", {target:me}));\n                }\n\n            } else {\n                // If DONE (cancelled), then don't do anything\n                if (me.readyState === FileReader.DONE) {\n                    return;\n                }\n\n                // DONE state\n                me.readyState = FileReader.DONE;\n\n                me.result = null;\n\n                // Save error\n                me.error = new FileError(FileError.NOT_FOUND_ERR);\n\n                // If onerror callback\n                if (typeof me.onerror === \"function\") {\n                    me.onerror(new ProgressEvent(\"error\", {target:me}));\n                }\n\n                // If onloadend callback\n                if (typeof me.onloadend === \"function\") {\n                    me.onloadend(new ProgressEvent(\"loadend\", {target:me}));\n                }\n            }\n        }\n    };\n    xhr.open(\"GET\", file, true);\n    xhr.send();\n};\n\nmodule.exports = FileReader;\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/filereader.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/filereader.js: " + e);console.log(e.stack);}
 try {eval("define(\"cordova/plugin/webos/geolocation\", function(require, exports, module) {\n\nvar service = require('cordova/plugin/webos/service');\n\nmodule.exports = {\n    getLocation: function(successCallback, errorCallback, options) {\n        console.error(\"webos plugin geolocation getlocation\");\n        var request = service.Request('palm://com.palm.location', {\n            method: \"getCurrentPosition\",\n            onSuccess: function(event) {\n                var alias={};\n                alias.lastPosition = {\n                    coords: {\n                        latitude: event.latitude,\n                        longitude: event.longitude,\n                        altitude: (event.altitude >= 0 ? event.altitude: null),\n                        speed: (event.velocity >= 0 ? event.velocity: null),\n                        heading: (event.heading >= 0 ? event.heading: null),\n                        accuracy: (event.horizAccuracy >= 0 ? event.horizAccuracy: null),\n                        altitudeAccuracy: (event.vertAccuracy >= 0 ? event.vertAccuracy: null)\n                    },\n                    timestamp: new Date().getTime()\n                };\n\n                successCallback(alias.lastPosition);\n            },\n            onFailure: function() {\n                errorCallback();\n            }\n        });\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/geolocation.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/geolocation.js: " + e);console.log(e.stack);}
 try {eval("define(\"cordova/plugin/webos/keyboard\", function(require, exports, module) {\n\nvar _isShowing = null,\n    _manual = null;\n\nmodule.exports = {\n    types: {\n        text: 0,\n        password: 1,\n        search: 2,\n        range: 3,\n        email: 4,\n        number: 5,\n        phone: 6,\n        url: 7,\n        color: 8\n    },\n    isShowing: function() {\n        return !!_isShowing;\n    },\n    show: function(type){\n        if(this.isManualMode()) {\n            PalmSystem.keyboardShow(type || 0);\n        }\n    },\n    hide: function(){\n        if(this.isManualMode()) {\n            PalmSystem.keyboardHide();\n        }\n    },\n    setManualMode: function(mode){\n        _manual = mode;\n        PalmSystem.setManualKeyboardEnabled(mode);\n    },\n    isManualMode: function(){\n        return _manual || false;\n    },\n    forceShow: function(inType){\n        this.setManualMode(true);\n        PalmSystem.keyboardShow(inType || 0);\n    },\n    forceHide: function(){\n        this.setManualMode(true);\n        PalmSystem.keyboardHide();\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/keyboard.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/keyboard.js: " + e);console.log(e.stack);}
-try {eval("define(\"cordova/plugin/webos/network\", function(require, exports, module) {\n\nvar service=require('cordova/plugin/webos/service'),\n    Connection = require('cordova/plugin/Connection');\n\nmodule.exports = {\n    /**\n     * Get connection info\n     *\n     * @param {Function} successCallback The function to call when the Connection data is available\n     * @param {Function} errorCallback The function to call when there is an error getting the Connection data. (OPTIONAL)\n     */\n    getConnectionInfo: function (successCallback, errorCallback) {\n        // Get info\n        console.log(\"webos Plugin: NetworkStatus - getConnectionInfo\");\n\n        service.Request('palm://com.palm.connectionmanager', {\n            method: 'getstatus',\n            parameters: {},\n            onSuccess: function (result) {\n                console.log(\"result:\"+JSON.stringify(result));\n\n                var info={};\n                if (!result.isInternetConnectionAvailable) { info.type=Connection.NONE; }\n                if (result.wifi.onInternet) { info.type=Connection.WIFI; }\n                if (result.wan.state===\"connected\") { info.type=Connection.CELL_2G; }\n\n                successCallback(info.type);\n            },\n            onFailure: errorCallback\n        });\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/network.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/network.js: " + e);console.log(e.stack);}
+try {eval("define(\"cordova/plugin/webos/network\", function(require, exports, module) {\n\nvar service=require('cordova/plugin/webos/service'),\n    Connection = require('cordova/plugin/Connection');\n\nmodule.exports = {\n    /**\n     * Get connection info\n     *\n     * @param {Function} successCallback The function to call when the Connection data is available\n     * @param {Function} errorCallback The function to call when there is an error getting the Connection data. (OPTIONAL)\n     */\n    getConnectionInfo: function (successCallback, errorCallback) {\n        // Get info\n        console.log(\"webos Plugin: NetworkStatus - getConnectionInfo\");\n\n        service.Request('palm://com.palm.connectionmanager', {\n            method: 'getstatus',\n            parameters: {},\n            onSuccess: function (result) {\n                console.log(\"result:\"+JSON.stringify(result));\n\n                var info={};\n                if (!result.isInternetConnectionAvailable) { info.type=Connection.NONE; }\n                if (result.wifi && result.wifi.onInternet) { info.type=Connection.WIFI; }\n                if (result.wan && result.wan.state===\"connected\") { info.type=Connection.CELL_2G; }\n\n                successCallback(info.type);\n            },\n            onFailure: errorCallback\n        });\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/network.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/network.js: " + e);console.log(e.stack);}
 try {eval("define(\"cordova/plugin/webos/notification\", function(require, exports, module) {\n\nmodule.exports = {\n    /*\n     * adds a dashboard to the WebOS app\n     * @param {String} url\n     * @param {String} html\n     * Example:\n     *        navigator.notification.newDashboard(\"dashboard.html\");\n     */\n    newDashboard: function(url, html) {\n        var win = window.open(url, \"_blank\", \"attributes={\\\"window\\\":\\\"dashboard\\\"}\");\n        html && win.document.write(html);\n        win.PalmSystem.stageReady();\n    },\n\n    /*\n     * Displays a banner notification. If specified, will send your 'response' object as data via the 'palmsystem' DOM event.\n     * If no 'icon' filename is specified, will use a small version of your application icon.\n     * @param {String} message\n     * @param {Object} response\n     * @param {String} icon\n     * @param {String} soundClass class of the sound; supported classes are: \"ringtones\", \"alerts\", \"alarm\", \"calendar\", \"notification\"\n     * @param {String} soundFile partial or full path to the sound file\n     * @param {String} soundDurationMs of sound in ms\n     * Example:\n     *        navigator.notification.showBanner('test message');\n     */\n    showBanner: function(message, response, icon, soundClass, soundFile, soundDurationMs) {\n        response = response || {\n            banner: true\n        };\n        PalmSystem.addBannerMessage(message, JSON.stringify(response), icon, soundClass, soundFile, soundDurationMs);\n    },\n\n    /**\n     * Remove a banner from the banner area. The category parameter defaults to 'banner'. Will not remove\n     * messages that are already displayed.\n     * @param {String} category\n            Value defined by the application and usually same one used in {@link showBanner}.\n            It is used if you have more than one kind of banner message.\n     */\n    removeBannerMessage: function(category) {\n        var bannerKey = category || 'banner';\n        var bannerId = this.banners.get(bannerKey);\n        if (bannerId) {\n            try {\n                PalmSystem.removeBannerMessage(bannerId);\n            } catch(removeBannerException) {\n                window.debug.error(removeBannerException.toString());\n            }\n        }\n    },\n\n    /*\n     * Remove all pending banner messages from the banner area. Will not remove messages that are already displayed.\n     */\n    clearBannerMessage: function() {\n        PalmSystem.clearBannerMessage();\n    },\n\n    /*\n     * This function vibrates the device\n     * @param {number} duration The duration in ms to vibrate for.\n     * @param {number} intensity The intensity of the vibration\n     */\n    vibrate_private: function(duration, intensity) {\n        //the intensity for palm is inverted; 0=high intensity, 100=low intensity\n        //this is opposite from our api, so we invert\n        if (isNaN(intensity) || intensity > 100 || intensity <= 0)\n        intensity = 0;\n        else\n        intensity = 100 - intensity;\n\n        // if the app id does not have the namespace \"com.palm.\", an error will be thrown here\n        //this.vibhandle = new Mojo.Service.Request(\"palm://com.palm.vibrate\", {\n        this.vibhandle = navigator.service.Request(\"palm://com.palm.vibrate\", {\n            method: 'vibrate',\n            parameters: {\n                'period': intensity,\n                'duration': duration\n            }\n        },\n        false);\n    },\n\n    vibrate: function(param) {\n        PalmSystem.playSoundNotification('vibrate');\n    },\n    /*\n     * Plays the specified sound\n     * @param {String} soundClass class of the sound; supported classes are: \"ringtones\", \"alerts\", \"alarm\", \"calendar\", \"notification\"\n     * @param {String} soundFile partial or full path to the sound file\n     * @param {String} soundDurationMs of sound in ms\n     */\n    beep: function(param) {\n        PalmSystem.playSoundNotification('alerts');\n    },\n\n    getRootWindow: function() {\n        var w = window.opener || window.rootWindow || window.top || window;\n        if(!w.setTimeout) { // use this window as the root if we don't have access to the real root.\n            w = window;\n        }\n        return w;\n    },\n\n    open: function(inOpener, inUrl, inName, inAttributes, inWindowInfo) {\n        var url = inUrl;\n        var a = inAttributes && JSON.stringify(inAttributes);\n        a = \"attributes=\" + a;\n        var i = inWindowInfo ? inWindowInfo + \", \" : \"\";\n        return inOpener.open(url, inName, i + a);\n    },\n\n    openWindow: function(inUrl, inName, inParams, inAttributes, inWindowInfo) {\n        //var attributes = inAttributes || {};\n        //attributes.window = attributes.window || \"card\";\n        // NOTE: make the root window open all windows.\n        return this.open(this.getRootWindow(), inUrl, inName || \"\", inAttributes, inWindowInfo);\n    },\n\n    alert: function(message,callback,title,buttonName) {\n        var inAttributes = {};\n        //inAttributes.window = \"card\"; // create card\n        inAttributes.window = \"popupalert\"; // create popup\n        //inAttributes.window=\"dashboard\"; // create dashboard\n        var html='<html><head><script>setTimeout(function(f){var el=window.document.getElementById(\"b1\");console.error(el);el.addEventListener(\"click\",function(f){window.close();},false);},500);</script></head><body>'+message+'<br/><button id=\"b1\">'+buttonName+'</button></body></html>';\n        var inName=\"PopupAlert\";\n        var inUrl=\"\";\n        var inParams={};\n        var inHeight=120;\n        var w = this.openWindow(inUrl, inName, inParams, inAttributes, \"height=\" + (inHeight || 200));\n        w.document.write(html);\n        w.PalmSystem.stageReady();\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/notification.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/notification.js: " + e);console.log(e.stack);}
 try {eval("define(\"cordova/plugin/webos/orientation\", function(require, exports, module) {\n\nmodule.exports = {\n    setOrientation: function(orientation) {\n        PalmSystem.setWindowOrientation(orientation);\n    },\n\n    /*\n     * Returns the current window orientation\n     * orientation is one of 'up', 'down', 'left', 'right', or 'free'\n     */\n    getCurrentOrientation: function() {\n          return PalmSystem.windowOrientation;\n    }\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/orientation.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/orientation.js: " + e);console.log(e.stack);}
 try {eval("define(\"cordova/plugin/webos/requestfilesystem\", function(require, exports, module) {\n\nmodule.exports = function(type,size,successCallback,errorCallback) {\n    console.error(\"requestFileSystem\");\n\n    var theFileSystem={};\n    theFileSystem.name=\"webOS\";\n    theFileSystem.root={};\n    theFileSystem.root.name=\"Root\";\n\n    theFileSystem.root.getFile=function(filename,options,successCallback,errorCallback) {\n        console.error(\"getFile\");\n        if (options.create) { errorCallback(); }\n        var theFile=filename;\n        successCallback(theFile);\n    };\n\n    successCallback(theFileSystem);\n};\n\n});\n\n//@ sourceURL=lib/webos/plugin/webos/requestfilesystem.js")} catch(e) {console.log("exception: in lib/webos/plugin/webos/requestfilesystem.js: " + e);console.log(e.stack);}
diff --git a/lib/cordova.webos.js b/lib/cordova.webos.js
index c764d79..a8fc583 100644
--- a/lib/cordova.webos.js
+++ b/lib/cordova.webos.js
@@ -1,8 +1,8 @@
 // Platform: webos
 
-// commit ab5e7db58d684da1403ab6059a80f3b4635bde4d
+// commit 0f40ae8ab0eb19efecf6dd3be09106feec417bef
 
-// File generated at :: Tue Feb 05 2013 13:01:43 GMT-0800 (PST)
+// File generated at :: Tue Feb 19 2013 13:48:03 GMT-0800 (PST)
 
 /*
  Licensed to the Apache Software Foundation (ASF) under one
@@ -1106,7 +1106,8 @@
             window.PalmSystem.stageReady();
         }
 
-        var Mojo = window.Mojo || {};
+        // create global Mojo object if it does not exist
+        Mojo = window.Mojo || {};
 
         // wait for deviceready before listening and firing document events
         document.addEventListener("deviceready", function () {
@@ -5845,8 +5846,8 @@
 
                 var info={};
                 if (!result.isInternetConnectionAvailable) { info.type=Connection.NONE; }
-                if (result.wifi.onInternet) { info.type=Connection.WIFI; }
-                if (result.wan.state==="connected") { info.type=Connection.CELL_2G; }
+                if (result.wifi && result.wifi.onInternet) { info.type=Connection.WIFI; }
+                if (result.wan && result.wan.state==="connected") { info.type=Connection.CELL_2G; }
 
                 successCallback(info.type);
             },
