update cordova.js to 2.9.1
diff --git a/windows8/VERSION b/windows8/VERSION
index c8e38b6..38d56e5 100644
--- a/windows8/VERSION
+++ b/windows8/VERSION
@@ -1 +1 @@
-2.9.0
+2.9.1
\ No newline at end of file
diff --git a/windows8/cordova.js b/windows8/cordova.js
index 40a3336..fb92f7a 100644
--- a/windows8/cordova.js
+++ b/windows8/cordova.js
@@ -1,5 +1,5 @@
 // Platform: windows8

-// 2.9.0-0-g83dc4bd

+// 2.9.1

 /*

  Licensed to the Apache Software Foundation (ASF) under one

  or more contributor license agreements.  See the NOTICE file

@@ -19,7 +19,7 @@
  under the License.

 */

 ;(function() {

-var CORDOVA_JS_BUILD_LABEL = '2.9.0-0-g83dc4bd';

+var CORDOVA_JS_BUILD_LABEL = '2.9.1';

 // file: lib/scripts/require.js

 

 var require,

@@ -100,6 +100,7 @@
 

 

 var channel = require('cordova/channel');

+var platform = require('cordova/platform');

 

 /**

  * Listen for DOMContentLoaded and notify our channel subscribers.

@@ -182,10 +183,18 @@
         log:function(){}

     };

 }

+// there are places in the framework where we call `warn` also, so we should make sure it exists

+if(typeof window.console.warn === "undefined") {

+    window.console.warn = function(msg) {

+        this.log("warn: " + msg);

+    };

+}

 

 var cordova = {

     define:define,

     require:require,

+    version:CORDOVA_JS_BUILD_LABEL,

+    platformId:platform.id,

     /**

      * Methods to add/remove your own addEventListener hijacking on document + window.

      */

@@ -221,16 +230,16 @@
         var evt = createEvent(type, data);

         if (typeof documentEventHandlers[type] != 'undefined') {

             if( bNoDetach ) {

-              documentEventHandlers[type].fire(evt);

+                documentEventHandlers[type].fire(evt);

             }

             else {

-              setTimeout(function() {

-                  // Fire deviceready on listeners that were registered before cordova.js was loaded.

-                  if (type == 'deviceready') {

-                      document.dispatchEvent(evt);

-                  }

-                  documentEventHandlers[type].fire(evt);

-              }, 0);

+                setTimeout(function() {

+                    // Fire deviceready on listeners that were registered before cordova.js was loaded.

+                    if (type == 'deviceready') {

+                        document.dispatchEvent(evt);

+                    }

+                    documentEventHandlers[type].fire(evt);

+                }, 0);

             }

         } else {

             document.dispatchEvent(evt);

@@ -347,7 +356,7 @@
 };

 

 function extractParamName(callee, argIndex) {

-  return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex];

+    return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex];

 }

 

 function checkArgs(spec, functionName, args, opt_callee) {

@@ -376,7 +385,7 @@
     if (errMsg) {

         errMsg += ', but got ' + typeName + '.';

         errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg;

-        // Don't log when running jake test.

+        // Don't log when running unit tests.

         if (typeof jasmine == 'undefined') {

             console.error(errMsg);

         }

@@ -395,6 +404,62 @@
 

 });

 

+// file: lib/common/base64.js

+define("cordova/base64", function(require, exports, module) {

+

+var base64 = exports;

+

+base64.fromArrayBuffer = function(arrayBuffer) {

+    var array = new Uint8Array(arrayBuffer);

+    return uint8ToBase64(array);

+};

+

+//------------------------------------------------------------------------------

+

+/* This code is based on the performance tests at http://jsperf.com/b64tests

+ * This 12-bit-at-a-time algorithm was the best performing version on all

+ * platforms tested.

+ */

+

+var b64_6bit = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

+var b64_12bit;

+

+var b64_12bitTable = function() {

+    b64_12bit = [];

+    for (var i=0; i<64; i++) {

+        for (var j=0; j<64; j++) {

+            b64_12bit[i*64+j] = b64_6bit[i] + b64_6bit[j];

+        }

+    }

+    b64_12bitTable = function() { return b64_12bit; };

+    return b64_12bit;

+};

+

+function uint8ToBase64(rawData) {

+    var numBytes = rawData.byteLength;

+    var output="";

+    var segment;

+    var table = b64_12bitTable();

+    for (var i=0;i<numBytes-2;i+=3) {

+        segment = (rawData[i] << 16) + (rawData[i+1] << 8) + rawData[i+2];

+        output += table[segment >> 12];

+        output += table[segment & 0xfff];

+    }

+    if (numBytes - i == 2) {

+        segment = (rawData[i] << 16) + (rawData[i+1] << 8);

+        output += table[segment >> 12];

+        output += b64_6bit[(segment & 0xfff) >> 6];

+        output += '=';

+    } else if (numBytes - i == 1) {

+        segment = (rawData[i] << 16);

+        output += table[segment >> 12];

+        output += '==';

+    }

+    return output;

+}

+

+});

+

 // file: lib/common/builder.js

 define("cordova/builder", function(require, exports, module) {

 

@@ -435,36 +500,36 @@
 function include(parent, objects, clobber, merge) {

     each(objects, function (obj, key) {

         try {

-          var result = obj.path ? require(obj.path) : {};

+            var result = obj.path ? require(obj.path) : {};

 

-          if (clobber) {

-              // Clobber if it doesn't exist.

-              if (typeof parent[key] === 'undefined') {

-                  assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);

-              } else if (typeof obj.path !== 'undefined') {

-                  // If merging, merge properties onto parent, otherwise, clobber.

-                  if (merge) {

-                      recursiveMerge(parent[key], result);

-                  } else {

-                      assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);

-                  }

-              }

-              result = parent[key];

-          } else {

-            // Overwrite if not currently defined.

-            if (typeof parent[key] == 'undefined') {

-              assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);

+            if (clobber) {

+                // Clobber if it doesn't exist.

+                if (typeof parent[key] === 'undefined') {

+                    assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);

+                } else if (typeof obj.path !== 'undefined') {

+                    // If merging, merge properties onto parent, otherwise, clobber.

+                    if (merge) {

+                        recursiveMerge(parent[key], result);

+                    } else {

+                        assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);

+                    }

+                }

+                result = parent[key];

             } else {

-              // Set result to what already exists, so we can build children into it if they exist.

-              result = parent[key];

+                // Overwrite if not currently defined.

+                if (typeof parent[key] == 'undefined') {

+                    assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);

+                } else {

+                    // Set result to what already exists, so we can build children into it if they exist.

+                    result = parent[key];

+                }

             }

-          }

 

-          if (obj.children) {

-            include(result, obj.children, clobber, merge);

-          }

+            if (obj.children) {

+                include(result, obj.children, clobber, merge);

+            }

         } catch(e) {

-          utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"');

+            utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"');

         }

     });

 }

@@ -808,24 +873,44 @@
  * @param {String} action       Action to be run in cordova

  * @param {String[]} [args]     Zero or more arguments to pass to the method

  */

-module.exports = function(success, fail, service, action, args) {

 

-    var proxy = commandProxy.get(service,action);

+module.exports = function (success, fail, service, action, args) {

+

+    var proxy = commandProxy.get(service, action),

+        callbackId,

+        onSuccess,

+        onError;

+

     if(proxy) {

-        var callbackId = service + cordova.callbackId++;

+        callbackId = service + cordova.callbackId++;

         // console.log("EXEC:" + service + " : " + action);

         if (typeof success == "function" || typeof fail == "function") {

             cordova.callbacks[callbackId] = {success:success, fail:fail};

         }

         try {

-            proxy(success, fail, args);

-        }

-        catch(e) {

+            onSuccess = function (result) {

+                cordova.callbackSuccess(callbackId,

+                        {

+                        status: cordova.callbackStatus.OK,

+                        message: result

+                    });

+            };

+            onError = function (err) {

+                cordova.callbackError(callbackId,

+                        {

+                        status: cordova.callbackStatus.ERROR,

+                        message: err

+                    });

+            };

+            proxy(onSuccess, onError, args);

+

+        } catch (e) {

             console.log("Exception calling native with command :: " + service + " :: " + action  + " ::exception=" + e);

         }

-    }

-    else {

-        fail && fail("Missing Command Error");

+    } else {

+        if (typeof fail === "function") {

+            fail("Missing Command Error");

+        }

     }

 };

 

@@ -867,6 +952,10 @@
     addEntry('d', moduleName, symbolPath, opt_deprecationMessage);

 };

 

+exports.runs = function(moduleName) {

+    addEntry('r', moduleName, null);

+};

+

 function prepareNamespace(symbolPath, context) {

     if (!symbolPath) {

         return context;

@@ -885,12 +974,16 @@
     for (var i = 0, len = symbolList.length; i < len; i += 3) {

         var strategy = symbolList[i];

         var moduleName = symbolList[i + 1];

+        var module = require(moduleName);

+        // <runs/>

+        if (strategy == 'r') {

+            continue;

+        }

         var symbolPath = symbolList[i + 2];

         var lastDot = symbolPath.lastIndexOf('.');

         var namespace = symbolPath.substr(0, lastDot);

         var lastName = symbolPath.substr(lastDot + 1);

 

-        var module = require(moduleName);

         var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null;

         var parentObj = prepareNamespace(namespace, context);

         var target = parentObj[lastName];

@@ -935,20 +1028,24 @@
 // file: lib/windows8/platform.js

 define("cordova/platform", function(require, exports, module) {

 

-var cordova = require('cordova'),

-    exec = require('cordova/exec'),

-    channel = cordova.require("cordova/channel"),

-    modulemapper = require('cordova/modulemapper');

 

-/*

- * Define native implementations ( there is no native layer, so need to make sure the proxies are there )

- */

-modulemapper.loadMatchingModules(/cordova.*\/windows8\/.*Proxy$/);

+

+

 

 module.exports = {

     id: "windows8",

     initialize:function() {

 

+        var cordova = require('cordova'),

+            exec = require('cordova/exec'),

+            channel = cordova.require("cordova/channel"),

+            modulemapper = require('cordova/modulemapper');

+

+        /*

+         * Define native implementations ( there is no native layer, so need to make sure the proxies are there )

+         */

+        modulemapper.loadMatchingModules(/cordova.*\/windows8\/.*Proxy$/);

+

         modulemapper.loadMatchingModules(/cordova.*\/plugininit$/);

 

         modulemapper.loadMatchingModules(/cordova.*\/symbols$/);

@@ -956,6 +1053,9 @@
 

         modulemapper.mapModules(window);

 

+        window.alert = window.alert || require("cordova/plugin/notification").alert;

+        window.confirm = window.confirm || require("cordova/plugin/notification").confirm;

+

         var onWinJSReady = function () {

             var app = WinJS.Application;

             var checkpointHandler = function checkpointHandler() {

@@ -1758,6 +1858,7 @@
  */

 function DirectoryReader(path) {

     this.path = path || null;

+    this.hasReadEntries = false;

 }

 

 /**

@@ -1767,6 +1868,12 @@
  * @param {Function} errorCallback is called with a FileError

  */

 DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) {

+    // If we've already read and passed on this directory's entries, return an empty list.

+    if (this.hasReadEntries) {

+        successCallback([]);

+        return;

+    }

+    var reader = this;

     var win = typeof successCallback !== 'function' ? null : function(result) {

         var retVal = [];

         for (var i=0; i<result.length; i++) {

@@ -1783,6 +1890,7 @@
             entry.fullPath = result[i].fullPath;

             retVal.push(entry);

         }

+        reader.hasReadEntries = true;

         successCallback(retVal);

     };

     var fail = typeof errorCallback !== 'function' ? null : function(code) {

@@ -2893,27 +3001,28 @@
  */

 FileWriter.prototype.write = function(data) {

 

-    var isBinary = false;

+    var that=this;

+    var supportsBinary = (typeof window.Blob !== 'undefined' && typeof window.ArrayBuffer !== 'undefined');

+    var isBinary;

 

-    // If we don't have Blob or ArrayBuffer support, don't bother.

-    if (typeof window.Blob !== 'undefined' && typeof window.ArrayBuffer !== 'undefined') {

-

-        // Check to see if the incoming data is a blob

-        if (data instanceof Blob) {

-            var that=this;

-            var fileReader = new FileReader();

-            fileReader.onload = function() {

-                // Call this method again, with the arraybuffer as argument

-                FileWriter.prototype.write.call(that, this.result);

-            };

+    // Check to see if the incoming data is a blob

+    if (data instanceof File || (supportsBinary && data instanceof Blob)) {

+        var fileReader = new FileReader();

+        fileReader.onload = function() {

+            // Call this method again, with the arraybuffer as argument

+            FileWriter.prototype.write.call(that, this.result);

+        };

+        if (supportsBinary) {

             fileReader.readAsArrayBuffer(data);

-            return;

+        } else {

+            fileReader.readAsText(data);

         }

-

-        // Mark data type for safer transport over the binary bridge

-        isBinary = (data instanceof ArrayBuffer);

+        return;

     }

 

+    // Mark data type for safer transport over the binary bridge

+    isBinary = supportsBinary && (data instanceof ArrayBuffer);

+

     // Throw an exception if we are already writing a file

     if (this.readyState === FileWriter.WRITING) {

         throw new FileError(FileError.INVALID_STATE_ERR);

@@ -3146,6 +3255,7 @@
 var exec = require('cordova/exec');

 var channel = require('cordova/channel');

 var modulemapper = require('cordova/modulemapper');

+var urlutil = require('cordova/urlutil');

 

 function InAppBrowser() {

    this.channels = {

@@ -3154,6 +3264,7 @@
         'loaderror' : channel.create('loaderror'),

         'exit' : channel.create('exit')

    };

+   this._alive = true;

 }

 

 InAppBrowser.prototype = {

@@ -3163,7 +3274,10 @@
         }

     },

     close: function (eventname) {

-        exec(null, null, "InAppBrowser", "close", []);

+        if (this._alive) {

+            this._alive = false;

+            exec(null, null, "InAppBrowser", "close", []);

+        }

     },

     show: function (eventname) {

       exec(null, null, "InAppBrowser", "show", []);

@@ -3201,17 +3315,18 @@
 };

 

 module.exports = function(strUrl, strWindowName, strWindowFeatures) {

-    var iab = new InAppBrowser();

-    var cb = function(eventname) {

-       iab._eventHandler(eventname);

-    };

-

     // Don't catch calls that write to existing frames (e.g. named iframes).

     if (window.frames && window.frames[strWindowName]) {

         var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');

         return origOpenFunc.apply(window, arguments);

     }

 

+    strUrl = urlutil.makeAbsolute(strUrl);

+    var iab = new InAppBrowser();

+    var cb = function(eventname) {

+       iab._eventHandler(eventname);

+    };

+

     exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]);

     return iab;

 };

@@ -3981,7 +4096,7 @@
 

 });

 

-// file: lib/windows8/plugin/capture/symbols.js

+// file: lib/common/plugin/capture/symbols.js

 define("cordova/plugin/capture/symbols", function(require, exports, module) {

 

 var modulemapper = require('cordova/modulemapper');

@@ -3990,12 +4105,11 @@
 modulemapper.clobbers('cordova/plugin/CaptureAudioOptions', 'CaptureAudioOptions');

 modulemapper.clobbers('cordova/plugin/CaptureImageOptions', 'CaptureImageOptions');

 modulemapper.clobbers('cordova/plugin/CaptureVideoOptions', 'CaptureVideoOptions');

+modulemapper.clobbers('cordova/plugin/ConfigurationData', 'ConfigurationData');

 modulemapper.clobbers('cordova/plugin/MediaFile', 'MediaFile');

 modulemapper.clobbers('cordova/plugin/MediaFileData', 'MediaFileData');

 modulemapper.clobbers('cordova/plugin/capture', 'navigator.device.capture');

 

-modulemapper.merges('cordova/plugin/windows8/MediaFile', 'MediaFile');

-

 });

 

 // file: lib/common/plugin/compass.js

@@ -4456,7 +4570,7 @@
 

 });

 

-// file: lib/windows8/plugin/file/symbols.js

+// file: lib/common/plugin/file/symbols.js

 define("cordova/plugin/file/symbols", function(require, exports, module) {

 

 

@@ -4464,8 +4578,6 @@
     symbolshelper = require('cordova/plugin/file/symbolshelper');

 

 symbolshelper(modulemapper.defaults);

-modulemapper.clobbers('cordova/plugin/File', 'File');

-modulemapper.clobbers('cordova/plugin/FileReader', 'FileReader');

 

 });

 

@@ -5441,14 +5553,14 @@
 

 });

 

-// file: lib/windows8/plugin/media/symbols.js

+// file: lib/common/plugin/media/symbols.js

 define("cordova/plugin/media/symbols", function(require, exports, module) {

 

 

 var modulemapper = require('cordova/modulemapper');

 

 modulemapper.defaults('cordova/plugin/Media', 'Media');

-modulemapper.clobbers('cordova/plugin/MediaError', 'MediaError');

+modulemapper.defaults('cordova/plugin/MediaError', 'MediaError');

 

 });

 

@@ -6300,41 +6412,43 @@
 // file: lib/windows8/plugin/windows8/CompassProxy.js

 define("cordova/plugin/windows8/CompassProxy", function(require, exports, module) {

 

-/*global Windows:true */

+/*jslint sloppy:true */

+/*global Windows:true, require, module, setTimeout */

 

 var cordova = require('cordova'),

-    CompassHeading = require('cordova/plugin/CompassHeading');

+    CompassHeading = require('cordova/plugin/CompassHeading'),

+    CompassError = require('cordova/plugin/CompassError');

 

 

 module.exports = {

 

-    onReadingChanged:null,

-    getHeading:function(win,lose) {

+    onReadingChanged: null,

+    getHeading: function (win, lose) {

         var deviceCompass = Windows.Devices.Sensors.Compass.getDefault();

-        if(!deviceCompass) {

-            setTimeout(function(){lose("Compass not available");},0);

-        }

-        else {

+        if (!deviceCompass) {

+            setTimeout(function () {

+                lose(CompassError.COMPASS_NOT_SUPPORTED);

+            }, 0);

+        } else {

 

-            deviceCompass.reportInterval = Math.max(16,deviceCompass.minimumReportInterval);

+            deviceCompass.reportInterval = Math.max(16, deviceCompass.minimumReportInterval);

 

-            this.onReadingChanged = function(e) {

-                var reading = e.reading;

-                var heading = new CompassHeading(reading.headingMagneticNorth, reading.headingTrueNorth);

+            this.onReadingChanged = function (e) {

+                var reading = e.reading,

+                    heading = new CompassHeading(reading.headingMagneticNorth, reading.headingTrueNorth, null, reading.timestamp);

                 win(heading);

             };

-            deviceCompass.addEventListener("readingchanged",this.onReadingChanged);

+            deviceCompass.addEventListener("readingchanged", this.onReadingChanged);

         }

-

     },

-    stopHeading:function(win,lose) {

+    stopHeading: function (win, lose) {

         var deviceCompass = Windows.Devices.Sensors.Compass.getDefault();

-        if(!deviceCompass) {

-            setTimeout(function(){lose("Compass not available");},0);

-        }

-        else {

-

-            deviceCompass.removeEventListener("readingchanged",this.onReadingChanged);

+        if (!deviceCompass) {

+            setTimeout(function () {

+                lose(CompassError.COMPASS_NOT_SUPPORTED);

+            }, 0);

+        } else {

+            deviceCompass.removeEventListener("readingchanged", this.onReadingChanged);

             this.onReadingChanged = null;

             deviceCompass.reportInterval = 0;

             win();

@@ -6343,7 +6457,7 @@
     }

 };

 

-require("cordova/commandProxy").add("Compass",module.exports);

+require("cordova/commandProxy").add("Compass", module.exports);

 });

 

 // file: lib/windows8/plugin/windows8/ContactsProxy.js

@@ -6381,27 +6495,17 @@
 // file: lib/windows8/plugin/windows8/DeviceProxy.js

 define("cordova/plugin/windows8/DeviceProxy", function(require, exports, module) {

 

+

 var cordova = require('cordova');

 var utils = require('cordova/utils');

-var FileError = require('cordova/plugin/FileError');

-

 

 module.exports = {

 

     getDeviceInfo:function(win,fail,args) {

-        //console.log("NativeProxy::getDeviceInfo");

-        var hostNames = Windows.Networking.Connectivity.NetworkInformation.getHostNames();

-

-        var name = "unknown";

-        hostNames.some(function (nm) {

-            if (nm.displayName.indexOf(".local") > -1) {

-                name = nm.displayName.split(".local")[0];

-                return true;

-            }

-        });

 

         // deviceId aka uuid, stored in Windows.Storage.ApplicationData.current.localSettings.values.deviceId

         var deviceId;

+

         var localSettings = Windows.Storage.ApplicationData.current.localSettings;

 

         if (localSettings.values.deviceId) {

@@ -6412,13 +6516,17 @@
         }

 

         setTimeout(function () {

-            win({ platform: "windows8", version: "8", name: name, uuid: deviceId, cordova: CORDOVA_JS_BUILD_LABEL });

+            win({ platform: "windows8",

+                version: "8",

+                uuid: deviceId,

+                cordova: CORDOVA_JS_BUILD_LABEL,

+                model: window.clientInformation.platform });

         }, 0);

     }

 

 };

 

-require("cordova/commandProxy").add("Device",module.exports);

+require("cordova/commandProxy").add("Device", module.exports);

 

 });

 

@@ -6708,59 +6816,59 @@
         var fullPath = args[0];

 

         Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).done(function (storageFolder) {

-        var storageFolderPer = Windows.Storage.ApplicationData.current.localFolder;

-        var storageFolderTem = Windows.Storage.ApplicationData.current.temporaryFolder;

+            var storageFolderPer = Windows.Storage.ApplicationData.current.localFolder;

+            var storageFolderTem = Windows.Storage.ApplicationData.current.temporaryFolder;

 

-        if (storageFolder.path == storageFolderPer.path || storageFolder.path == storageFolderTem.path) {

-            fail && fail(FileError.NO_MODIFICATION_ALLOWED_ERR);

-            return;

-        }

+            if (storageFolder.path == storageFolderPer.path || storageFolder.path == storageFolderTem.path) {

+                fail && fail(FileError.NO_MODIFICATION_ALLOWED_ERR);

+                return;

+            }

 

-        var removeFolders = function (path) {

-            return new WinJS.Promise(function (complete) {

-                var filePromiseArr = [];

-                var storageFolderTop = null;

-                Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then(

-                    function (storageFolder) {

-                        var fileListPromise = storageFolder.createFileQuery().getFilesAsync();

+            var removeFolders = function (path) {

+                return new WinJS.Promise(function (complete) {

+                    var filePromiseArr = [];

+                    var storageFolderTop = null;

+                    Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then(

+                        function (storageFolder) {

+                            var fileListPromise = storageFolder.createFileQuery().getFilesAsync();

 

-                        storageFolderTop = storageFolder;

-                        return fileListPromise;

-                    }

-                // remove all the files directly under the folder.

-                ).then(function (fileList) {

-                    if (fileList !== null) {

-                        for (var i = 0; i < fileList.length; i++) {

-                            var filePromise = fileList[i].deleteAsync();

-                            filePromiseArr.push(filePromise);

+                            storageFolderTop = storageFolder;

+                            return fileListPromise;

                         }

-                    }

-                    WinJS.Promise.join(filePromiseArr).then(function () {

-                        var folderListPromise = storageFolderTop.createFolderQuery().getFoldersAsync();

-                        return folderListPromise;

-                    // remove empty folders.

-                    }).then(function (folderList) {

-                        var folderPromiseArr = [];

-                        if (folderList.length !== 0) {

-                            for (var j = 0; j < folderList.length; j++) {

-

-                                folderPromiseArr.push(removeFolders(folderList[j].path));

+                    // remove all the files directly under the folder.

+                    ).then(function (fileList) {

+                        if (fileList !== null) {

+                            for (var i = 0; i < fileList.length; i++) {

+                                var filePromise = fileList[i].deleteAsync();

+                                filePromiseArr.push(filePromise);

                             }

-                            WinJS.Promise.join(folderPromiseArr).then(function () {

-                                storageFolderTop.deleteAsync().then(complete);

-                            });

-                        } else {

-                            storageFolderTop.deleteAsync().then(complete);

                         }

+                        WinJS.Promise.join(filePromiseArr).then(function () {

+                            var folderListPromise = storageFolderTop.createFolderQuery().getFoldersAsync();

+                            return folderListPromise;

+                        // remove empty folders.

+                        }).then(function (folderList) {

+                            var folderPromiseArr = [];

+                            if (folderList.length !== 0) {

+                                for (var j = 0; j < folderList.length; j++) {

+

+                                    folderPromiseArr.push(removeFolders(folderList[j].path));

+                                }

+                                WinJS.Promise.join(folderPromiseArr).then(function () {

+                                    storageFolderTop.deleteAsync().then(complete);

+                                });

+                            } else {

+                                storageFolderTop.deleteAsync().then(complete);

+                            }

+                        }, function () { });

                     }, function () { });

-                }, function () { });

-            });

-        };

-        removeFolders(storageFolder.path).then(function () {

-            Windows.Storage.StorageFolder.getFolderFromPathAsync(storageFolder.path).then(

-                function () {},

-                function () {

-                    if (typeof successCallback !== 'undefined' && successCallback !== null) { successCallback(); }

+                });

+            };

+            removeFolders(storageFolder.path).then(function () {

+                Windows.Storage.StorageFolder.getFolderFromPathAsync(storageFolder.path).then(

+                    function () {},

+                    function () {

+                        if (typeof successCallback !== 'undefined' && successCallback !== null) { successCallback(); }

                 });

             });

         });

@@ -7265,6 +7373,7 @@
     upload:function(successCallback, error, options) {

         var filePath = options[0];

         var server = options[1];

+        var headers = options[8] || {};

 

 

         var win = function (fileUploadResult) {

@@ -7285,7 +7394,7 @@
                 var blob = MSApp.createBlobFromRandomAccessStream(storageFile.contentType, stream);

                 var formData = new FormData();

                 formData.append("source\";filename=\"" + storageFile.name + "\"", blob);

-                WinJS.xhr({ type: "POST", url: server, data: formData }).then(function (response) {

+                WinJS.xhr({ type: "POST", url: server, data: formData, headers: headers }).then(function (response) {

                     var code = response.status;

                     storageFile.getBasicPropertiesAsync().done(function (basicProperties) {

 

@@ -7309,6 +7418,7 @@
     download:function(win, error, options) {

         var source = options[0];

         var target = options[1];

+        var headers = options[4] || {};

 

 

         if (target === null || typeof target === undefined) {

@@ -7332,6 +7442,12 @@
             storageFolder.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.generateUniqueName).then(function (storageFile) {

                 var uri = Windows.Foundation.Uri(source);

                 var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader();

+

+                for (var header in headers) {

+                    downloader.setRequestHeader(header, headers[header]);

+                }

+

+

                 download = downloader.createDownload(uri, storageFile);

                 download.startAsync().then(function () {

                     win(new FileEntry(storageFile.name, storageFile.path));

@@ -7741,52 +7857,123 @@
 require("cordova/commandProxy").add("Notification",module.exports);

 });

 

-// file: lib/windows8/plugin/windows8/console.js

-define("cordova/plugin/windows8/console", function(require, exports, module) {

+// file: lib/common/pluginloader.js

+define("cordova/pluginloader", function(require, exports, module) {

 

-

-if(!console || !console.log)

-{

-    var exec = require('cordova/exec');

-

-    var debugConsole = {

-        log:function(msg){

-            exec(null,null,"DebugConsole","log",msg);

-        },

-        warn:function(msg){

-            exec(null,null,"DebugConsole","warn",msg);

-        },

-        error:function(msg){

-            exec(null,null,"DebugConsole","error",msg);

-        }

-    };

-

-    module.exports = debugConsole;

-}

-else if(console && console.log) {

-

-  console.log("console.log exists already!");

-  console.warn = console.warn || function(msg){console.log("warn:"+msg);};

-  console.error = console.error || function(msg){console.log("error:"+msg);};

-}

-

-});

-

-// file: lib/windows8/plugin/windows8/console/symbols.js

-define("cordova/plugin/windows8/console/symbols", function(require, exports, module) {

-

-

+var channel = require('cordova/channel');

 var modulemapper = require('cordova/modulemapper');

 

-modulemapper.clobbers('cordova/plugin/windows8/console', 'navigator.console');

+// Helper function to inject a <script> tag.

+function injectScript(url, onload, onerror) {

+    var script = document.createElement("script");

+    // onload fires even when script fails loads with an error.

+    script.onload = onload;

+    script.onerror = onerror || onload;

+    script.src = url;

+    document.head.appendChild(script);

+}

 

-});

+function onScriptLoadingComplete(moduleList) {

+    // Loop through all the plugins and then through their clobbers and merges.

+    for (var i = 0, module; module = moduleList[i]; i++) {

+        if (module) {

+            try {

+                if (module.clobbers && module.clobbers.length) {

+                    for (var j = 0; j < module.clobbers.length; j++) {

+                        modulemapper.clobbers(module.id, module.clobbers[j]);

+                    }

+                }

 

-// file: lib/windows8/plugin/windows8/notification/plugininit.js

-define("cordova/plugin/windows8/notification/plugininit", function(require, exports, module) {

+                if (module.merges && module.merges.length) {

+                    for (var k = 0; k < module.merges.length; k++) {

+                        modulemapper.merges(module.id, module.merges[k]);

+                    }

+                }

 

-window.alert = window.alert || require("cordova/plugin/notification").alert;

-window.confirm = window.confirm || require("cordova/plugin/notification").confirm;

+                // Finally, if runs is truthy we want to simply require() the module.

+                // This can be skipped if it had any merges or clobbers, though,

+                // since the mapper will already have required the module.

+                if (module.runs && !(module.clobbers && module.clobbers.length) && !(module.merges && module.merges.length)) {

+                    modulemapper.runs(module.id);

+                }

+            }

+            catch(err) {

+                // error with module, most likely clobbers, should we continue?

+            }

+        }

+    }

+

+    finishPluginLoading();

+}

+

+// Called when:

+// * There are plugins defined and all plugins are finished loading.

+// * There are no plugins to load.

+function finishPluginLoading() {

+    channel.onPluginsReady.fire();

+}

+

+// Handler for the cordova_plugins.js content.

+// See plugman's plugin_loader.js for the details of this object.

+// This function is only called if the really is a plugins array that isn't empty.

+// Otherwise the onerror response handler will just call finishPluginLoading().

+function handlePluginsObject(path, moduleList) {

+    // Now inject the scripts.

+    var scriptCounter = moduleList.length;

+

+    if (!scriptCounter) {

+        finishPluginLoading();

+        return;

+    }

+    function scriptLoadedCallback() {

+        if (!--scriptCounter) {

+            onScriptLoadingComplete(moduleList);

+        }

+    }

+

+    for (var i = 0; i < moduleList.length; i++) {

+        injectScript(path + moduleList[i].file, scriptLoadedCallback);

+    }

+}

+

+function injectPluginScript(pathPrefix) {

+    injectScript(pathPrefix + 'cordova_plugins.js', function(){

+        try {

+            var moduleList = require("cordova/plugin_list");

+            handlePluginsObject(pathPrefix, moduleList);

+        } catch (e) {

+            // Error loading cordova_plugins.js, file not found or something

+            // this is an acceptable error, pre-3.0.0, so we just move on.

+            finishPluginLoading();

+        }

+    },finishPluginLoading); // also, add script load error handler for file not found

+}

+

+function findCordovaPath() {

+    var path = null;

+    var scripts = document.getElementsByTagName('script');

+    var term = 'cordova.js';

+    for (var n = scripts.length-1; n>-1; n--) {

+        var src = scripts[n].src;

+        if (src.indexOf(term) == (src.length - term.length)) {

+            path = src.substring(0, src.length - term.length);

+            break;

+        }

+    }

+    return path;

+}

+

+// Tries to load all plugins' js-modules.

+// This is an async process, but onDeviceReady is blocked on onPluginsReady.

+// onPluginsReady is fired when there are no plugins to load, or they are all done.

+exports.load = function() {

+    var pathPrefix = findCordovaPath();

+    if (pathPrefix === null) {

+        console.log('Could not find cordova.js script tag. Plugin loading may fail.');

+        pathPrefix = '';

+    }

+    injectPluginScript(pathPrefix);

+};

 

 

 });

@@ -7804,6 +7991,23 @@
 

 });

 

+// file: lib/common/urlutil.js

+define("cordova/urlutil", function(require, exports, module) {

+

+var urlutil = exports;

+var anchorEl = document.createElement('a');

+

+/**

+ * For already absolute URLs, returns what is passed in.

+ * For relative URLs, converts them to absolute ones.

+ */

+urlutil.makeAbsolute = function(url) {

+  anchorEl.href = url;

+  return anchorEl.href;

+};

+

+});

+

 // file: lib/common/utils.js

 define("cordova/utils", function(require, exports, module) {

 

@@ -7984,6 +8188,8 @@
     context._cordovaJsLoaded = true;

 

     var channel = require('cordova/channel');

+    var pluginloader = require('cordova/pluginloader');

+

     var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady];

 

     function logUnfiredChannels(arr) {

@@ -8052,170 +8258,14 @@
 

     }, platformInitChannelsArray);

 

+    // Don't attempt to load when running unit tests.

+    if (typeof XMLHttpRequest != 'undefined') {

+        pluginloader.load();

+    }

 }(window));

 

 // file: lib/scripts/bootstrap-windows8.js

 

 require('cordova/channel').onNativeReady.fire();

 

-// file: lib/scripts/plugin_loader.js

-

-// Tries to load all plugins' js-modules.

-// This is an async process, but onDeviceReady is blocked on onPluginsReady.

-// onPluginsReady is fired when there are no plugins to load, or they are all done.

-(function (context) {

-    // To be populated with the handler by handlePluginsObject.

-    var onScriptLoadingComplete;

-

-    var scriptCounter = 0;

-    function scriptLoadedCallback() {

-        scriptCounter--;

-        if (scriptCounter === 0) {

-            onScriptLoadingComplete && onScriptLoadingComplete();

-        }

-    }

-

-    function scriptErrorCallback(err) {

-        // Open Question: If a script path specified in cordova_plugins.js does not exist, do we fail for all?

-        // this is currently just continuing.

-        scriptCounter--;

-        if (scriptCounter === 0) {

-            onScriptLoadingComplete && onScriptLoadingComplete();

-        }

-    }

-

-    // Helper function to inject a <script> tag.

-    function injectScript(path) {

-        scriptCounter++;

-        var script = document.createElement("script");

-        script.onload = scriptLoadedCallback;

-        script.onerror = scriptErrorCallback;

-        script.src = path;

-        document.head.appendChild(script);

-    }

-

-    // Called when:

-    // * There are plugins defined and all plugins are finished loading.

-    // * There are no plugins to load.

-    function finishPluginLoading() {

-        context.cordova.require('cordova/channel').onPluginsReady.fire();

-    }

-

-    // Handler for the cordova_plugins.js content.

-    // See plugman's plugin_loader.js for the details of this object.

-    // This function is only called if the really is a plugins array that isn't empty.

-    // Otherwise the onerror response handler will just call finishPluginLoading().

-    function handlePluginsObject(modules, path) {

-        // First create the callback for when all plugins are loaded.

-        var mapper = context.cordova.require('cordova/modulemapper');

-        onScriptLoadingComplete = function() {

-            // Loop through all the plugins and then through their clobbers and merges.

-            for (var i = 0; i < modules.length; i++) {

-                var module = modules[i];

-                if (module) {

-                    try { 

-                        if (module.clobbers && module.clobbers.length) {

-                            for (var j = 0; j < module.clobbers.length; j++) {

-                                mapper.clobbers(module.id, module.clobbers[j]);

-                            }

-                        }

-

-                        if (module.merges && module.merges.length) {

-                            for (var k = 0; k < module.merges.length; k++) {

-                                mapper.merges(module.id, module.merges[k]);

-                            }

-                        }

-

-                        // Finally, if runs is truthy we want to simply require() the module.

-                        // This can be skipped if it had any merges or clobbers, though,

-                        // since the mapper will already have required the module.

-                        if (module.runs && !(module.clobbers && module.clobbers.length) && !(module.merges && module.merges.length)) {

-                            context.cordova.require(module.id);

-                        }

-                    }

-                    catch(err) {

-                        // error with module, most likely clobbers, should we continue?

-                    }

-                }

-            }

-

-            finishPluginLoading();

-        };

-

-        // Now inject the scripts.

-        for (var i = 0; i < modules.length; i++) {

-            injectScript(path + modules[i].file);

-        }

-    }

-

-    // Find the root of the app

-    var path = '';

-    var scripts = document.getElementsByTagName('script');

-    var term = 'cordova.js';

-    for (var n = scripts.length-1; n>-1; n--) {

-        var src = scripts[n].src;

-        if (src.indexOf(term) == (src.length - term.length)) {

-            path = src.substring(0, src.length - term.length);

-            break;

-        }

-    }

-

-    var plugins_json = path + 'cordova_plugins.json';

-    var plugins_js = path + 'cordova_plugins.js';

-

-    // One some phones (Windows) this xhr.open throws an Access Denied exception

-    // So lets keep trying, but with a script tag injection technique instead of XHR

-    var injectPluginScript = function injectPluginScript() {

-        try {

-            var script = document.createElement("script");

-            script.onload = function(){

-                var list = cordova.require("cordova/plugin_list");

-                handlePluginsObject(list,path);

-            };

-            script.onerror = function() {

-                // Error loading cordova_plugins.js, file not found or something

-                // this is an acceptable error, pre-3.0.0, so we just move on.

-                finishPluginLoading();

-            };

-            script.src = plugins_js;

-            document.head.appendChild(script);

-

-        } catch(err){

-            finishPluginLoading();

-        }

-    } 

-

-

-    // Try to XHR the cordova_plugins.json file asynchronously.

-    var xhr = new XMLHttpRequest();

-    xhr.onload = function() {

-        // If the response is a JSON string which composes an array, call handlePluginsObject.

-        // If the request fails, or the response is not a JSON array, just call finishPluginLoading.

-        var obj;

-        try {

-            obj = (this.status == 0 || this.status == 200) && this.responseText && JSON.parse(this.responseText);

-        } catch (err) {

-            // obj will be undefined.

-        }

-        if (Array.isArray(obj) && obj.length > 0) {

-            handlePluginsObject(obj, path);

-        } else {

-            finishPluginLoading();

-        }

-    };

-    xhr.onerror = function() {

-        // In this case, the json file was not present, but XHR was allowed, 

-        // so we should still try the script injection technique with the js file

-        // in case that is there.

-        injectPluginScript();

-    };

-    try { // we commented we were going to try, so let us actually try and catch

-        xhr.open('GET', plugins_json, true); // Async

-        xhr.send();

-    } catch(err){

-        injectPluginScript();

-    }

-}(window));

-

-

 })();
\ No newline at end of file
diff --git a/windows8/template/VERSION b/windows8/template/VERSION
index c8e38b6..38d56e5 100644
--- a/windows8/template/VERSION
+++ b/windows8/template/VERSION
@@ -1 +1 @@
-2.9.0
+2.9.1
\ No newline at end of file
diff --git a/windows8/template/www/cordova.js b/windows8/template/www/cordova.js
index 40a3336..ce5be3f 100644
--- a/windows8/template/www/cordova.js
+++ b/windows8/template/www/cordova.js
@@ -1,5 +1,5 @@
 // Platform: windows8

-// 2.9.0-0-g83dc4bd

+// 2.9.1

 /*

  Licensed to the Apache Software Foundation (ASF) under one

  or more contributor license agreements.  See the NOTICE file

@@ -8,9 +8,9 @@
  to you under the Apache License, Version 2.0 (the

  "License"); you may not use this file except in compliance

  with the License.  You may obtain a copy of the License at

- 

+

      http://www.apache.org/licenses/LICENSE-2.0

- 

+

  Unless required by applicable law or agreed to in writing,

  software distributed under the License is distributed on an

  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

@@ -19,7 +19,7 @@
  under the License.

 */

 ;(function() {

-var CORDOVA_JS_BUILD_LABEL = '2.9.0-0-g83dc4bd';

+var CORDOVA_JS_BUILD_LABEL = '2.9.1';

 // file: lib/scripts/require.js

 

 var require,

@@ -100,6 +100,7 @@
 

 

 var channel = require('cordova/channel');

+var platform = require('cordova/platform');

 

 /**

  * Listen for DOMContentLoaded and notify our channel subscribers.

@@ -182,10 +183,18 @@
         log:function(){}

     };

 }

+// there are places in the framework where we call `warn` also, so we should make sure it exists

+if(typeof window.console.warn === "undefined") {

+    window.console.warn = function(msg) {

+        this.log("warn: " + msg);

+    };

+}

 

 var cordova = {

     define:define,

     require:require,

+    version:CORDOVA_JS_BUILD_LABEL,

+    platformId:platform.id,

     /**

      * Methods to add/remove your own addEventListener hijacking on document + window.

      */

@@ -221,16 +230,16 @@
         var evt = createEvent(type, data);

         if (typeof documentEventHandlers[type] != 'undefined') {

             if( bNoDetach ) {

-              documentEventHandlers[type].fire(evt);

+                documentEventHandlers[type].fire(evt);

             }

             else {

-              setTimeout(function() {

-                  // Fire deviceready on listeners that were registered before cordova.js was loaded.

-                  if (type == 'deviceready') {

-                      document.dispatchEvent(evt);

-                  }

-                  documentEventHandlers[type].fire(evt);

-              }, 0);

+                setTimeout(function() {

+                    // Fire deviceready on listeners that were registered before cordova.js was loaded.

+                    if (type == 'deviceready') {

+                        document.dispatchEvent(evt);

+                    }

+                    documentEventHandlers[type].fire(evt);

+                }, 0);

             }

         } else {

             document.dispatchEvent(evt);

@@ -347,7 +356,7 @@
 };

 

 function extractParamName(callee, argIndex) {

-  return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex];

+    return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex];

 }

 

 function checkArgs(spec, functionName, args, opt_callee) {

@@ -376,7 +385,7 @@
     if (errMsg) {

         errMsg += ', but got ' + typeName + '.';

         errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg;

-        // Don't log when running jake test.

+        // Don't log when running unit tests.

         if (typeof jasmine == 'undefined') {

             console.error(errMsg);

         }

@@ -395,6 +404,62 @@
 

 });

 

+// file: lib/common/base64.js

+define("cordova/base64", function(require, exports, module) {

+

+var base64 = exports;

+

+base64.fromArrayBuffer = function(arrayBuffer) {

+    var array = new Uint8Array(arrayBuffer);

+    return uint8ToBase64(array);

+};

+

+//------------------------------------------------------------------------------

+

+/* This code is based on the performance tests at http://jsperf.com/b64tests

+ * This 12-bit-at-a-time algorithm was the best performing version on all

+ * platforms tested.

+ */

+

+var b64_6bit = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

+var b64_12bit;

+

+var b64_12bitTable = function() {

+    b64_12bit = [];

+    for (var i=0; i<64; i++) {

+        for (var j=0; j<64; j++) {

+            b64_12bit[i*64+j] = b64_6bit[i] + b64_6bit[j];

+        }

+    }

+    b64_12bitTable = function() { return b64_12bit; };

+    return b64_12bit;

+};

+

+function uint8ToBase64(rawData) {

+    var numBytes = rawData.byteLength;

+    var output="";

+    var segment;

+    var table = b64_12bitTable();

+    for (var i=0;i<numBytes-2;i+=3) {

+        segment = (rawData[i] << 16) + (rawData[i+1] << 8) + rawData[i+2];

+        output += table[segment >> 12];

+        output += table[segment & 0xfff];

+    }

+    if (numBytes - i == 2) {

+        segment = (rawData[i] << 16) + (rawData[i+1] << 8);

+        output += table[segment >> 12];

+        output += b64_6bit[(segment & 0xfff) >> 6];

+        output += '=';

+    } else if (numBytes - i == 1) {

+        segment = (rawData[i] << 16);

+        output += table[segment >> 12];

+        output += '==';

+    }

+    return output;

+}

+

+});

+

 // file: lib/common/builder.js

 define("cordova/builder", function(require, exports, module) {

 

@@ -435,36 +500,36 @@
 function include(parent, objects, clobber, merge) {

     each(objects, function (obj, key) {

         try {

-          var result = obj.path ? require(obj.path) : {};

+            var result = obj.path ? require(obj.path) : {};

 

-          if (clobber) {

-              // Clobber if it doesn't exist.

-              if (typeof parent[key] === 'undefined') {

-                  assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);

-              } else if (typeof obj.path !== 'undefined') {

-                  // If merging, merge properties onto parent, otherwise, clobber.

-                  if (merge) {

-                      recursiveMerge(parent[key], result);

-                  } else {

-                      assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);

-                  }

-              }

-              result = parent[key];

-          } else {

-            // Overwrite if not currently defined.

-            if (typeof parent[key] == 'undefined') {

-              assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);

+            if (clobber) {

+                // Clobber if it doesn't exist.

+                if (typeof parent[key] === 'undefined') {

+                    assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);

+                } else if (typeof obj.path !== 'undefined') {

+                    // If merging, merge properties onto parent, otherwise, clobber.

+                    if (merge) {

+                        recursiveMerge(parent[key], result);

+                    } else {

+                        assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);

+                    }

+                }

+                result = parent[key];

             } else {

-              // Set result to what already exists, so we can build children into it if they exist.

-              result = parent[key];

+                // Overwrite if not currently defined.

+                if (typeof parent[key] == 'undefined') {

+                    assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);

+                } else {

+                    // Set result to what already exists, so we can build children into it if they exist.

+                    result = parent[key];

+                }

             }

-          }

 

-          if (obj.children) {

-            include(result, obj.children, clobber, merge);

-          }

+            if (obj.children) {

+                include(result, obj.children, clobber, merge);

+            }

         } catch(e) {

-          utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"');

+            utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"');

         }

     });

 }

@@ -808,24 +873,44 @@
  * @param {String} action       Action to be run in cordova

  * @param {String[]} [args]     Zero or more arguments to pass to the method

  */

-module.exports = function(success, fail, service, action, args) {

 

-    var proxy = commandProxy.get(service,action);

+module.exports = function (success, fail, service, action, args) {

+

+    var proxy = commandProxy.get(service, action),

+        callbackId,

+        onSuccess,

+        onError;

+

     if(proxy) {

-        var callbackId = service + cordova.callbackId++;

+        callbackId = service + cordova.callbackId++;

         // console.log("EXEC:" + service + " : " + action);

         if (typeof success == "function" || typeof fail == "function") {

             cordova.callbacks[callbackId] = {success:success, fail:fail};

         }

         try {

-            proxy(success, fail, args);

-        }

-        catch(e) {

+            onSuccess = function (result) {

+                cordova.callbackSuccess(callbackId,

+                        {

+                        status: cordova.callbackStatus.OK,

+                        message: result

+                    });

+            };

+            onError = function (err) {

+                cordova.callbackError(callbackId,

+                        {

+                        status: cordova.callbackStatus.ERROR,

+                        message: err

+                    });

+            };

+            proxy(onSuccess, onError, args);

+

+        } catch (e) {

             console.log("Exception calling native with command :: " + service + " :: " + action  + " ::exception=" + e);

         }

-    }

-    else {

-        fail && fail("Missing Command Error");

+    } else {

+        if (typeof fail === "function") {

+            fail("Missing Command Error");

+        }

     }

 };

 

@@ -867,6 +952,10 @@
     addEntry('d', moduleName, symbolPath, opt_deprecationMessage);

 };

 

+exports.runs = function(moduleName) {

+    addEntry('r', moduleName, null);

+};

+

 function prepareNamespace(symbolPath, context) {

     if (!symbolPath) {

         return context;

@@ -885,12 +974,16 @@
     for (var i = 0, len = symbolList.length; i < len; i += 3) {

         var strategy = symbolList[i];

         var moduleName = symbolList[i + 1];

+        var module = require(moduleName);

+        // <runs/>

+        if (strategy == 'r') {

+            continue;

+        }

         var symbolPath = symbolList[i + 2];

         var lastDot = symbolPath.lastIndexOf('.');

         var namespace = symbolPath.substr(0, lastDot);

         var lastName = symbolPath.substr(lastDot + 1);

 

-        var module = require(moduleName);

         var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null;

         var parentObj = prepareNamespace(namespace, context);

         var target = parentObj[lastName];

@@ -935,20 +1028,24 @@
 // file: lib/windows8/platform.js

 define("cordova/platform", function(require, exports, module) {

 

-var cordova = require('cordova'),

-    exec = require('cordova/exec'),

-    channel = cordova.require("cordova/channel"),

-    modulemapper = require('cordova/modulemapper');

 

-/*

- * Define native implementations ( there is no native layer, so need to make sure the proxies are there )

- */

-modulemapper.loadMatchingModules(/cordova.*\/windows8\/.*Proxy$/);

+

+

 

 module.exports = {

     id: "windows8",

     initialize:function() {

 

+        var cordova = require('cordova'),

+            exec = require('cordova/exec'),

+            channel = cordova.require("cordova/channel"),

+            modulemapper = require('cordova/modulemapper');

+

+        /*

+         * Define native implementations ( there is no native layer, so need to make sure the proxies are there )

+         */

+        modulemapper.loadMatchingModules(/cordova.*\/windows8\/.*Proxy$/);

+

         modulemapper.loadMatchingModules(/cordova.*\/plugininit$/);

 

         modulemapper.loadMatchingModules(/cordova.*\/symbols$/);

@@ -956,6 +1053,9 @@
 

         modulemapper.mapModules(window);

 

+        window.alert = window.alert || require("cordova/plugin/notification").alert;

+        window.confirm = window.confirm || require("cordova/plugin/notification").confirm;

+

         var onWinJSReady = function () {

             var app = WinJS.Application;

             var checkpointHandler = function checkpointHandler() {

@@ -1758,6 +1858,7 @@
  */

 function DirectoryReader(path) {

     this.path = path || null;

+    this.hasReadEntries = false;

 }

 

 /**

@@ -1767,6 +1868,12 @@
  * @param {Function} errorCallback is called with a FileError

  */

 DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) {

+    // If we've already read and passed on this directory's entries, return an empty list.

+    if (this.hasReadEntries) {

+        successCallback([]);

+        return;

+    }

+    var reader = this;

     var win = typeof successCallback !== 'function' ? null : function(result) {

         var retVal = [];

         for (var i=0; i<result.length; i++) {

@@ -1783,6 +1890,7 @@
             entry.fullPath = result[i].fullPath;

             retVal.push(entry);

         }

+        reader.hasReadEntries = true;

         successCallback(retVal);

     };

     var fail = typeof errorCallback !== 'function' ? null : function(code) {

@@ -2893,27 +3001,28 @@
  */

 FileWriter.prototype.write = function(data) {

 

-    var isBinary = false;

+    var that=this;

+    var supportsBinary = (typeof window.Blob !== 'undefined' && typeof window.ArrayBuffer !== 'undefined');

+    var isBinary;

 

-    // If we don't have Blob or ArrayBuffer support, don't bother.

-    if (typeof window.Blob !== 'undefined' && typeof window.ArrayBuffer !== 'undefined') {

-

-        // Check to see if the incoming data is a blob

-        if (data instanceof Blob) {

-            var that=this;

-            var fileReader = new FileReader();

-            fileReader.onload = function() {

-                // Call this method again, with the arraybuffer as argument

-                FileWriter.prototype.write.call(that, this.result);

-            };

+    // Check to see if the incoming data is a blob

+    if (data instanceof File || (supportsBinary && data instanceof Blob)) {

+        var fileReader = new FileReader();

+        fileReader.onload = function() {

+            // Call this method again, with the arraybuffer as argument

+            FileWriter.prototype.write.call(that, this.result);

+        };

+        if (supportsBinary) {

             fileReader.readAsArrayBuffer(data);

-            return;

+        } else {

+            fileReader.readAsText(data);

         }

-

-        // Mark data type for safer transport over the binary bridge

-        isBinary = (data instanceof ArrayBuffer);

+        return;

     }

 

+    // Mark data type for safer transport over the binary bridge

+    isBinary = supportsBinary && (data instanceof ArrayBuffer);

+

     // Throw an exception if we are already writing a file

     if (this.readyState === FileWriter.WRITING) {

         throw new FileError(FileError.INVALID_STATE_ERR);

@@ -3146,6 +3255,7 @@
 var exec = require('cordova/exec');

 var channel = require('cordova/channel');

 var modulemapper = require('cordova/modulemapper');

+var urlutil = require('cordova/urlutil');

 

 function InAppBrowser() {

    this.channels = {

@@ -3154,6 +3264,7 @@
         'loaderror' : channel.create('loaderror'),

         'exit' : channel.create('exit')

    };

+   this._alive = true;

 }

 

 InAppBrowser.prototype = {

@@ -3163,7 +3274,10 @@
         }

     },

     close: function (eventname) {

-        exec(null, null, "InAppBrowser", "close", []);

+        if (this._alive) {

+            this._alive = false;

+            exec(null, null, "InAppBrowser", "close", []);

+        }

     },

     show: function (eventname) {

       exec(null, null, "InAppBrowser", "show", []);

@@ -3201,17 +3315,18 @@
 };

 

 module.exports = function(strUrl, strWindowName, strWindowFeatures) {

-    var iab = new InAppBrowser();

-    var cb = function(eventname) {

-       iab._eventHandler(eventname);

-    };

-

     // Don't catch calls that write to existing frames (e.g. named iframes).

     if (window.frames && window.frames[strWindowName]) {

         var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');

         return origOpenFunc.apply(window, arguments);

     }

 

+    strUrl = urlutil.makeAbsolute(strUrl);

+    var iab = new InAppBrowser();

+    var cb = function(eventname) {

+       iab._eventHandler(eventname);

+    };

+

     exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]);

     return iab;

 };

@@ -3981,7 +4096,7 @@
 

 });

 

-// file: lib/windows8/plugin/capture/symbols.js

+// file: lib/common/plugin/capture/symbols.js

 define("cordova/plugin/capture/symbols", function(require, exports, module) {

 

 var modulemapper = require('cordova/modulemapper');

@@ -3990,12 +4105,11 @@
 modulemapper.clobbers('cordova/plugin/CaptureAudioOptions', 'CaptureAudioOptions');

 modulemapper.clobbers('cordova/plugin/CaptureImageOptions', 'CaptureImageOptions');

 modulemapper.clobbers('cordova/plugin/CaptureVideoOptions', 'CaptureVideoOptions');

+modulemapper.clobbers('cordova/plugin/ConfigurationData', 'ConfigurationData');

 modulemapper.clobbers('cordova/plugin/MediaFile', 'MediaFile');

 modulemapper.clobbers('cordova/plugin/MediaFileData', 'MediaFileData');

 modulemapper.clobbers('cordova/plugin/capture', 'navigator.device.capture');

 

-modulemapper.merges('cordova/plugin/windows8/MediaFile', 'MediaFile');

-

 });

 

 // file: lib/common/plugin/compass.js

@@ -4456,7 +4570,7 @@
 

 });

 

-// file: lib/windows8/plugin/file/symbols.js

+// file: lib/common/plugin/file/symbols.js

 define("cordova/plugin/file/symbols", function(require, exports, module) {

 

 

@@ -4464,8 +4578,6 @@
     symbolshelper = require('cordova/plugin/file/symbolshelper');

 

 symbolshelper(modulemapper.defaults);

-modulemapper.clobbers('cordova/plugin/File', 'File');

-modulemapper.clobbers('cordova/plugin/FileReader', 'FileReader');

 

 });

 

@@ -5441,14 +5553,14 @@
 

 });

 

-// file: lib/windows8/plugin/media/symbols.js

+// file: lib/common/plugin/media/symbols.js

 define("cordova/plugin/media/symbols", function(require, exports, module) {

 

 

 var modulemapper = require('cordova/modulemapper');

 

 modulemapper.defaults('cordova/plugin/Media', 'Media');

-modulemapper.clobbers('cordova/plugin/MediaError', 'MediaError');

+modulemapper.defaults('cordova/plugin/MediaError', 'MediaError');

 

 });

 

@@ -6300,41 +6412,43 @@
 // file: lib/windows8/plugin/windows8/CompassProxy.js

 define("cordova/plugin/windows8/CompassProxy", function(require, exports, module) {

 

-/*global Windows:true */

+/*jslint sloppy:true */

+/*global Windows:true, require, module, setTimeout */

 

 var cordova = require('cordova'),

-    CompassHeading = require('cordova/plugin/CompassHeading');

+    CompassHeading = require('cordova/plugin/CompassHeading'),

+    CompassError = require('cordova/plugin/CompassError');

 

 

 module.exports = {

 

-    onReadingChanged:null,

-    getHeading:function(win,lose) {

+    onReadingChanged: null,

+    getHeading: function (win, lose) {

         var deviceCompass = Windows.Devices.Sensors.Compass.getDefault();

-        if(!deviceCompass) {

-            setTimeout(function(){lose("Compass not available");},0);

-        }

-        else {

+        if (!deviceCompass) {

+            setTimeout(function () {

+                lose(CompassError.COMPASS_NOT_SUPPORTED);

+            }, 0);

+        } else {

 

-            deviceCompass.reportInterval = Math.max(16,deviceCompass.minimumReportInterval);

+            deviceCompass.reportInterval = Math.max(16, deviceCompass.minimumReportInterval);

 

-            this.onReadingChanged = function(e) {

-                var reading = e.reading;

-                var heading = new CompassHeading(reading.headingMagneticNorth, reading.headingTrueNorth);

+            this.onReadingChanged = function (e) {

+                var reading = e.reading,

+                    heading = new CompassHeading(reading.headingMagneticNorth, reading.headingTrueNorth, null, reading.timestamp);

                 win(heading);

             };

-            deviceCompass.addEventListener("readingchanged",this.onReadingChanged);

+            deviceCompass.addEventListener("readingchanged", this.onReadingChanged);

         }

-

     },

-    stopHeading:function(win,lose) {

+    stopHeading: function (win, lose) {

         var deviceCompass = Windows.Devices.Sensors.Compass.getDefault();

-        if(!deviceCompass) {

-            setTimeout(function(){lose("Compass not available");},0);

-        }

-        else {

-

-            deviceCompass.removeEventListener("readingchanged",this.onReadingChanged);

+        if (!deviceCompass) {

+            setTimeout(function () {

+                lose(CompassError.COMPASS_NOT_SUPPORTED);

+            }, 0);

+        } else {

+            deviceCompass.removeEventListener("readingchanged", this.onReadingChanged);

             this.onReadingChanged = null;

             deviceCompass.reportInterval = 0;

             win();

@@ -6343,7 +6457,7 @@
     }

 };

 

-require("cordova/commandProxy").add("Compass",module.exports);

+require("cordova/commandProxy").add("Compass", module.exports);

 });

 

 // file: lib/windows8/plugin/windows8/ContactsProxy.js

@@ -6381,27 +6495,17 @@
 // file: lib/windows8/plugin/windows8/DeviceProxy.js

 define("cordova/plugin/windows8/DeviceProxy", function(require, exports, module) {

 

+

 var cordova = require('cordova');

 var utils = require('cordova/utils');

-var FileError = require('cordova/plugin/FileError');

-

 

 module.exports = {

 

     getDeviceInfo:function(win,fail,args) {

-        //console.log("NativeProxy::getDeviceInfo");

-        var hostNames = Windows.Networking.Connectivity.NetworkInformation.getHostNames();

-

-        var name = "unknown";

-        hostNames.some(function (nm) {

-            if (nm.displayName.indexOf(".local") > -1) {

-                name = nm.displayName.split(".local")[0];

-                return true;

-            }

-        });

 

         // deviceId aka uuid, stored in Windows.Storage.ApplicationData.current.localSettings.values.deviceId

         var deviceId;

+

         var localSettings = Windows.Storage.ApplicationData.current.localSettings;

 

         if (localSettings.values.deviceId) {

@@ -6412,13 +6516,17 @@
         }

 

         setTimeout(function () {

-            win({ platform: "windows8", version: "8", name: name, uuid: deviceId, cordova: CORDOVA_JS_BUILD_LABEL });

+            win({ platform: "windows8",

+                version: "8",

+                uuid: deviceId,

+                cordova: CORDOVA_JS_BUILD_LABEL,

+                model: window.clientInformation.platform });

         }, 0);

     }

 

 };

 

-require("cordova/commandProxy").add("Device",module.exports);

+require("cordova/commandProxy").add("Device", module.exports);

 

 });

 

@@ -6708,59 +6816,59 @@
         var fullPath = args[0];

 

         Windows.Storage.StorageFolder.getFolderFromPathAsync(fullPath).done(function (storageFolder) {

-        var storageFolderPer = Windows.Storage.ApplicationData.current.localFolder;

-        var storageFolderTem = Windows.Storage.ApplicationData.current.temporaryFolder;

+            var storageFolderPer = Windows.Storage.ApplicationData.current.localFolder;

+            var storageFolderTem = Windows.Storage.ApplicationData.current.temporaryFolder;

 

-        if (storageFolder.path == storageFolderPer.path || storageFolder.path == storageFolderTem.path) {

-            fail && fail(FileError.NO_MODIFICATION_ALLOWED_ERR);

-            return;

-        }

+            if (storageFolder.path == storageFolderPer.path || storageFolder.path == storageFolderTem.path) {

+                fail && fail(FileError.NO_MODIFICATION_ALLOWED_ERR);

+                return;

+            }

 

-        var removeFolders = function (path) {

-            return new WinJS.Promise(function (complete) {

-                var filePromiseArr = [];

-                var storageFolderTop = null;

-                Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then(

-                    function (storageFolder) {

-                        var fileListPromise = storageFolder.createFileQuery().getFilesAsync();

+            var removeFolders = function (path) {

+                return new WinJS.Promise(function (complete) {

+                    var filePromiseArr = [];

+                    var storageFolderTop = null;

+                    Windows.Storage.StorageFolder.getFolderFromPathAsync(path).then(

+                        function (storageFolder) {

+                            var fileListPromise = storageFolder.createFileQuery().getFilesAsync();

 

-                        storageFolderTop = storageFolder;

-                        return fileListPromise;

-                    }

-                // remove all the files directly under the folder.

-                ).then(function (fileList) {

-                    if (fileList !== null) {

-                        for (var i = 0; i < fileList.length; i++) {

-                            var filePromise = fileList[i].deleteAsync();

-                            filePromiseArr.push(filePromise);

+                            storageFolderTop = storageFolder;

+                            return fileListPromise;

                         }

-                    }

-                    WinJS.Promise.join(filePromiseArr).then(function () {

-                        var folderListPromise = storageFolderTop.createFolderQuery().getFoldersAsync();

-                        return folderListPromise;

-                    // remove empty folders.

-                    }).then(function (folderList) {

-                        var folderPromiseArr = [];

-                        if (folderList.length !== 0) {

-                            for (var j = 0; j < folderList.length; j++) {

-

-                                folderPromiseArr.push(removeFolders(folderList[j].path));

+                    // remove all the files directly under the folder.

+                    ).then(function (fileList) {

+                        if (fileList !== null) {

+                            for (var i = 0; i < fileList.length; i++) {

+                                var filePromise = fileList[i].deleteAsync();

+                                filePromiseArr.push(filePromise);

                             }

-                            WinJS.Promise.join(folderPromiseArr).then(function () {

-                                storageFolderTop.deleteAsync().then(complete);

-                            });

-                        } else {

-                            storageFolderTop.deleteAsync().then(complete);

                         }

+                        WinJS.Promise.join(filePromiseArr).then(function () {

+                            var folderListPromise = storageFolderTop.createFolderQuery().getFoldersAsync();

+                            return folderListPromise;

+                        // remove empty folders.

+                        }).then(function (folderList) {

+                            var folderPromiseArr = [];

+                            if (folderList.length !== 0) {

+                                for (var j = 0; j < folderList.length; j++) {

+

+                                    folderPromiseArr.push(removeFolders(folderList[j].path));

+                                }

+                                WinJS.Promise.join(folderPromiseArr).then(function () {

+                                    storageFolderTop.deleteAsync().then(complete);

+                                });

+                            } else {

+                                storageFolderTop.deleteAsync().then(complete);

+                            }

+                        }, function () { });

                     }, function () { });

-                }, function () { });

-            });

-        };

-        removeFolders(storageFolder.path).then(function () {

-            Windows.Storage.StorageFolder.getFolderFromPathAsync(storageFolder.path).then(

-                function () {},

-                function () {

-                    if (typeof successCallback !== 'undefined' && successCallback !== null) { successCallback(); }

+                });

+            };

+            removeFolders(storageFolder.path).then(function () {

+                Windows.Storage.StorageFolder.getFolderFromPathAsync(storageFolder.path).then(

+                    function () {},

+                    function () {

+                        if (typeof successCallback !== 'undefined' && successCallback !== null) { successCallback(); }

                 });

             });

         });

@@ -7265,6 +7373,7 @@
     upload:function(successCallback, error, options) {

         var filePath = options[0];

         var server = options[1];

+        var headers = options[8] || {};

 

 

         var win = function (fileUploadResult) {

@@ -7285,7 +7394,7 @@
                 var blob = MSApp.createBlobFromRandomAccessStream(storageFile.contentType, stream);

                 var formData = new FormData();

                 formData.append("source\";filename=\"" + storageFile.name + "\"", blob);

-                WinJS.xhr({ type: "POST", url: server, data: formData }).then(function (response) {

+                WinJS.xhr({ type: "POST", url: server, data: formData, headers: headers }).then(function (response) {

                     var code = response.status;

                     storageFile.getBasicPropertiesAsync().done(function (basicProperties) {

 

@@ -7309,6 +7418,7 @@
     download:function(win, error, options) {

         var source = options[0];

         var target = options[1];

+        var headers = options[4] || {};

 

 

         if (target === null || typeof target === undefined) {

@@ -7332,6 +7442,12 @@
             storageFolder.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.generateUniqueName).then(function (storageFile) {

                 var uri = Windows.Foundation.Uri(source);

                 var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader();

+

+                for (var header in headers) {

+                    downloader.setRequestHeader(header, headers[header]);

+                }

+

+

                 download = downloader.createDownload(uri, storageFile);

                 download.startAsync().then(function () {

                     win(new FileEntry(storageFile.name, storageFile.path));

@@ -7741,52 +7857,123 @@
 require("cordova/commandProxy").add("Notification",module.exports);

 });

 

-// file: lib/windows8/plugin/windows8/console.js

-define("cordova/plugin/windows8/console", function(require, exports, module) {

+// file: lib/common/pluginloader.js

+define("cordova/pluginloader", function(require, exports, module) {

 

-

-if(!console || !console.log)

-{

-    var exec = require('cordova/exec');

-

-    var debugConsole = {

-        log:function(msg){

-            exec(null,null,"DebugConsole","log",msg);

-        },

-        warn:function(msg){

-            exec(null,null,"DebugConsole","warn",msg);

-        },

-        error:function(msg){

-            exec(null,null,"DebugConsole","error",msg);

-        }

-    };

-

-    module.exports = debugConsole;

-}

-else if(console && console.log) {

-

-  console.log("console.log exists already!");

-  console.warn = console.warn || function(msg){console.log("warn:"+msg);};

-  console.error = console.error || function(msg){console.log("error:"+msg);};

-}

-

-});

-

-// file: lib/windows8/plugin/windows8/console/symbols.js

-define("cordova/plugin/windows8/console/symbols", function(require, exports, module) {

-

-

+var channel = require('cordova/channel');

 var modulemapper = require('cordova/modulemapper');

 

-modulemapper.clobbers('cordova/plugin/windows8/console', 'navigator.console');

+// Helper function to inject a <script> tag.

+function injectScript(url, onload, onerror) {

+    var script = document.createElement("script");

+    // onload fires even when script fails loads with an error.

+    script.onload = onload;

+    script.onerror = onerror || onload;

+    script.src = url;

+    document.head.appendChild(script);

+}

 

-});

+function onScriptLoadingComplete(moduleList) {

+    // Loop through all the plugins and then through their clobbers and merges.

+    for (var i = 0, module; module = moduleList[i]; i++) {

+        if (module) {

+            try {

+                if (module.clobbers && module.clobbers.length) {

+                    for (var j = 0; j < module.clobbers.length; j++) {

+                        modulemapper.clobbers(module.id, module.clobbers[j]);

+                    }

+                }

 

-// file: lib/windows8/plugin/windows8/notification/plugininit.js

-define("cordova/plugin/windows8/notification/plugininit", function(require, exports, module) {

+                if (module.merges && module.merges.length) {

+                    for (var k = 0; k < module.merges.length; k++) {

+                        modulemapper.merges(module.id, module.merges[k]);

+                    }

+                }

 

-window.alert = window.alert || require("cordova/plugin/notification").alert;

-window.confirm = window.confirm || require("cordova/plugin/notification").confirm;

+                // Finally, if runs is truthy we want to simply require() the module.

+                // This can be skipped if it had any merges or clobbers, though,

+                // since the mapper will already have required the module.

+                if (module.runs && !(module.clobbers && module.clobbers.length) && !(module.merges && module.merges.length)) {

+                    modulemapper.runs(module.id);

+                }

+            }

+            catch(err) {

+                // error with module, most likely clobbers, should we continue?

+            }

+        }

+    }

+

+    finishPluginLoading();

+}

+

+// Called when:

+// * There are plugins defined and all plugins are finished loading.

+// * There are no plugins to load.

+function finishPluginLoading() {

+    channel.onPluginsReady.fire();

+}

+

+// Handler for the cordova_plugins.js content.

+// See plugman's plugin_loader.js for the details of this object.

+// This function is only called if the really is a plugins array that isn't empty.

+// Otherwise the onerror response handler will just call finishPluginLoading().

+function handlePluginsObject(path, moduleList) {

+    // Now inject the scripts.

+    var scriptCounter = moduleList.length;

+

+    if (!scriptCounter) {

+        finishPluginLoading();

+        return;

+    }

+    function scriptLoadedCallback() {

+        if (!--scriptCounter) {

+            onScriptLoadingComplete(moduleList);

+        }

+    }

+

+    for (var i = 0; i < moduleList.length; i++) {

+        injectScript(path + moduleList[i].file, scriptLoadedCallback);

+    }

+}

+

+function injectPluginScript(pathPrefix) {

+    injectScript(pathPrefix + 'cordova_plugins.js', function(){

+        try {

+            var moduleList = require("cordova/plugin_list");

+            handlePluginsObject(pathPrefix, moduleList);

+        } catch (e) {

+            // Error loading cordova_plugins.js, file not found or something

+            // this is an acceptable error, pre-3.0.0, so we just move on.

+            finishPluginLoading();

+        }

+    },finishPluginLoading); // also, add script load error handler for file not found

+}

+

+function findCordovaPath() {

+    var path = null;

+    var scripts = document.getElementsByTagName('script');

+    var term = 'cordova.js';

+    for (var n = scripts.length-1; n>-1; n--) {

+        var src = scripts[n].src;

+        if (src.indexOf(term) == (src.length - term.length)) {

+            path = src.substring(0, src.length - term.length);

+            break;

+        }

+    }

+    return path;

+}

+

+// Tries to load all plugins' js-modules.

+// This is an async process, but onDeviceReady is blocked on onPluginsReady.

+// onPluginsReady is fired when there are no plugins to load, or they are all done.

+exports.load = function() {

+    var pathPrefix = findCordovaPath();

+    if (pathPrefix === null) {

+        console.log('Could not find cordova.js script tag. Plugin loading may fail.');

+        pathPrefix = '';

+    }

+    injectPluginScript(pathPrefix);

+};

 

 

 });

@@ -7804,6 +7991,23 @@
 

 });

 

+// file: lib/common/urlutil.js

+define("cordova/urlutil", function(require, exports, module) {

+

+var urlutil = exports;

+var anchorEl = document.createElement('a');

+

+/**

+ * For already absolute URLs, returns what is passed in.

+ * For relative URLs, converts them to absolute ones.

+ */

+urlutil.makeAbsolute = function(url) {

+  anchorEl.href = url;

+  return anchorEl.href;

+};

+

+});

+

 // file: lib/common/utils.js

 define("cordova/utils", function(require, exports, module) {

 

@@ -7984,6 +8188,8 @@
     context._cordovaJsLoaded = true;

 

     var channel = require('cordova/channel');

+    var pluginloader = require('cordova/pluginloader');

+

     var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady];

 

     function logUnfiredChannels(arr) {

@@ -8052,170 +8258,14 @@
 

     }, platformInitChannelsArray);

 

+    // Don't attempt to load when running unit tests.

+    if (typeof XMLHttpRequest != 'undefined') {

+        pluginloader.load();

+    }

 }(window));

 

 // file: lib/scripts/bootstrap-windows8.js

 

 require('cordova/channel').onNativeReady.fire();

 

-// file: lib/scripts/plugin_loader.js

-

-// Tries to load all plugins' js-modules.

-// This is an async process, but onDeviceReady is blocked on onPluginsReady.

-// onPluginsReady is fired when there are no plugins to load, or they are all done.

-(function (context) {

-    // To be populated with the handler by handlePluginsObject.

-    var onScriptLoadingComplete;

-

-    var scriptCounter = 0;

-    function scriptLoadedCallback() {

-        scriptCounter--;

-        if (scriptCounter === 0) {

-            onScriptLoadingComplete && onScriptLoadingComplete();

-        }

-    }

-

-    function scriptErrorCallback(err) {

-        // Open Question: If a script path specified in cordova_plugins.js does not exist, do we fail for all?

-        // this is currently just continuing.

-        scriptCounter--;

-        if (scriptCounter === 0) {

-            onScriptLoadingComplete && onScriptLoadingComplete();

-        }

-    }

-

-    // Helper function to inject a <script> tag.

-    function injectScript(path) {

-        scriptCounter++;

-        var script = document.createElement("script");

-        script.onload = scriptLoadedCallback;

-        script.onerror = scriptErrorCallback;

-        script.src = path;

-        document.head.appendChild(script);

-    }

-

-    // Called when:

-    // * There are plugins defined and all plugins are finished loading.

-    // * There are no plugins to load.

-    function finishPluginLoading() {

-        context.cordova.require('cordova/channel').onPluginsReady.fire();

-    }

-

-    // Handler for the cordova_plugins.js content.

-    // See plugman's plugin_loader.js for the details of this object.

-    // This function is only called if the really is a plugins array that isn't empty.

-    // Otherwise the onerror response handler will just call finishPluginLoading().

-    function handlePluginsObject(modules, path) {

-        // First create the callback for when all plugins are loaded.

-        var mapper = context.cordova.require('cordova/modulemapper');

-        onScriptLoadingComplete = function() {

-            // Loop through all the plugins and then through their clobbers and merges.

-            for (var i = 0; i < modules.length; i++) {

-                var module = modules[i];

-                if (module) {

-                    try { 

-                        if (module.clobbers && module.clobbers.length) {

-                            for (var j = 0; j < module.clobbers.length; j++) {

-                                mapper.clobbers(module.id, module.clobbers[j]);

-                            }

-                        }

-

-                        if (module.merges && module.merges.length) {

-                            for (var k = 0; k < module.merges.length; k++) {

-                                mapper.merges(module.id, module.merges[k]);

-                            }

-                        }

-

-                        // Finally, if runs is truthy we want to simply require() the module.

-                        // This can be skipped if it had any merges or clobbers, though,

-                        // since the mapper will already have required the module.

-                        if (module.runs && !(module.clobbers && module.clobbers.length) && !(module.merges && module.merges.length)) {

-                            context.cordova.require(module.id);

-                        }

-                    }

-                    catch(err) {

-                        // error with module, most likely clobbers, should we continue?

-                    }

-                }

-            }

-

-            finishPluginLoading();

-        };

-

-        // Now inject the scripts.

-        for (var i = 0; i < modules.length; i++) {

-            injectScript(path + modules[i].file);

-        }

-    }

-

-    // Find the root of the app

-    var path = '';

-    var scripts = document.getElementsByTagName('script');

-    var term = 'cordova.js';

-    for (var n = scripts.length-1; n>-1; n--) {

-        var src = scripts[n].src;

-        if (src.indexOf(term) == (src.length - term.length)) {

-            path = src.substring(0, src.length - term.length);

-            break;

-        }

-    }

-

-    var plugins_json = path + 'cordova_plugins.json';

-    var plugins_js = path + 'cordova_plugins.js';

-

-    // One some phones (Windows) this xhr.open throws an Access Denied exception

-    // So lets keep trying, but with a script tag injection technique instead of XHR

-    var injectPluginScript = function injectPluginScript() {

-        try {

-            var script = document.createElement("script");

-            script.onload = function(){

-                var list = cordova.require("cordova/plugin_list");

-                handlePluginsObject(list,path);

-            };

-            script.onerror = function() {

-                // Error loading cordova_plugins.js, file not found or something

-                // this is an acceptable error, pre-3.0.0, so we just move on.

-                finishPluginLoading();

-            };

-            script.src = plugins_js;

-            document.head.appendChild(script);

-

-        } catch(err){

-            finishPluginLoading();

-        }

-    } 

-

-

-    // Try to XHR the cordova_plugins.json file asynchronously.

-    var xhr = new XMLHttpRequest();

-    xhr.onload = function() {

-        // If the response is a JSON string which composes an array, call handlePluginsObject.

-        // If the request fails, or the response is not a JSON array, just call finishPluginLoading.

-        var obj;

-        try {

-            obj = (this.status == 0 || this.status == 200) && this.responseText && JSON.parse(this.responseText);

-        } catch (err) {

-            // obj will be undefined.

-        }

-        if (Array.isArray(obj) && obj.length > 0) {

-            handlePluginsObject(obj, path);

-        } else {

-            finishPluginLoading();

-        }

-    };

-    xhr.onerror = function() {

-        // In this case, the json file was not present, but XHR was allowed, 

-        // so we should still try the script injection technique with the js file

-        // in case that is there.

-        injectPluginScript();

-    };

-    try { // we commented we were going to try, so let us actually try and catch

-        xhr.open('GET', plugins_json, true); // Async

-        xhr.send();

-    } catch(err){

-        injectPluginScript();

-    }

-}(window));

-

-

 })();
\ No newline at end of file