You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ma...@apache.org on 2012/09/19 20:09:06 UTC

android commit: CB-1469: Add Globalization Plug-in for Android

Updated Branches:
  refs/heads/master f71e66495 -> 631245742


CB-1469: Add Globalization Plug-in for Android


Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/commit/63124574
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/tree/63124574
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/diff/63124574

Branch: refs/heads/master
Commit: 6312457425a0833564a4726998dac79729479b91
Parents: f71e664
Author: Simon MacDonald <si...@gmail.com>
Authored: Wed Sep 19 14:08:52 2012 -0400
Committer: Simon MacDonald <si...@gmail.com>
Committed: Wed Sep 19 14:08:52 2012 -0400

----------------------------------------------------------------------
 framework/assets/js/cordova.android.js             |  547 ++++++++++++++-
 framework/res/xml/config.xml                       |    1 +
 .../src/org/apache/cordova/Globalization.java      |  560 +++++++++++++++
 .../src/org/apache/cordova/GlobalizationError.java |   72 ++
 4 files changed, 1178 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/63124574/framework/assets/js/cordova.android.js
----------------------------------------------------------------------
diff --git a/framework/assets/js/cordova.android.js b/framework/assets/js/cordova.android.js
index 7a7806e..7f9a826 100644
--- a/framework/assets/js/cordova.android.js
+++ b/framework/assets/js/cordova.android.js
@@ -1,6 +1,6 @@
-// commit d30179b30152b9383a80637e609cf2d785e1aa3e
+// commit 65b59c7e484a9e5227fa7b4de8e784a8466b2ef5
 
-// File generated at :: Tue Sep 18 2012 11:34:26 GMT-0400 (EDT)
+// File generated at :: Wed Sep 19 2012 13:58:04 GMT-0400 (EDT)
 
 /*
  Licensed to the Apache Software Foundation (ASF) under one
@@ -729,6 +729,9 @@ module.exports = {
                 geolocation: {
                     path: 'cordova/plugin/geolocation'
                 },
+                globalization: {
+                    path: 'cordova/plugin/globalization'
+                },
                 network: {
                     children: {
                         connection: {
@@ -844,6 +847,9 @@ module.exports = {
         Flags: {
             path: 'cordova/plugin/Flags'
         },
+        GlobalizationError: {
+            path: 'cordova/plugin/GlobalizationError'
+        },
         LocalFileSystem: {
             path: 'cordova/plugin/LocalFileSystem'
         },
@@ -3118,6 +3124,22 @@ module.exports = Flags;
 
 });
 
+// file: lib/common/plugin/GlobalizationError.js
+define("cordova/plugin/GlobalizationError", function(require, exports, module) {
+var GlobalizationError = function(code, message) {
+    this.code = code || null;
+    this.message = message || '';
+};
+
+// Globalization error codes
+GlobalizationError.UNKNOWN_ERROR = 0;
+GlobalizationError.FORMATTING_ERROR = 1;
+GlobalizationError.PARSING_ERROR = 2;
+GlobalizationError.PATTERN_ERROR = 3;
+
+module.exports = GlobalizationError;
+});
+
 // file: lib/common/plugin/LocalFileSystem.js
 define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
 
@@ -5205,6 +5227,527 @@ module.exports = geolocation;
 
 });
 
+// file: lib/common/plugin/globalization.js
+define("cordova/plugin/globalization", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    GlobalizationError = require('cordova/plugin/GlobalizationError');
+
+var globalization = {
+
+getPreferredLanguage:function(successCB, failureCB) {
+    // successCallback required
+    if (typeof successCB != "function") {
+        console.log("Globalization.getPreferredLanguage Error: successCB is not a function");
+        return;
+    }
+
+    // errorCallback required
+    if (typeof failureCB != "function") {
+        console.log("Globalization.getPreferredLanguage Error: failureCB is not a function");
+        return;
+    }
+
+    exec(successCB, failureCB, "Globalization","getPreferredLanguage", []);
+},
+
+/**
+* Returns the string identifier for the client's current locale setting.
+* It returns the locale identifier string to the successCB callback with a
+* properties object as a parameter. If there is an error getting the locale,
+* then the errorCB callback is invoked.
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return Object.value {String}: The locale identifier
+*
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.getLocaleName(function (locale) {alert('locale:' + locale.value + '\n');},
+*                                function () {});
+*/
+getLocaleName:function(successCB, failureCB) {
+    // successCallback required
+    if (typeof successCB != "function") {
+        console.log("Globalization.getLocaleName Error: successCB is not a function");
+        return;
+    }
+
+    // errorCallback required
+    if (typeof failureCB != "function") {
+        console.log("Globalization.getLocaleName Error: failureCB is not a function");
+        return;
+    }
+    exec(successCB, failureCB, "Globalization","getLocaleName", []);
+},
+
+
+/**
+* Returns a date formatted as a string according to the client's user preferences and
+* calendar using the time zone of the client. It returns the formatted date string to the
+* successCB callback with a properties object as a parameter. If there is an error
+* formatting the date, then the errorCB callback is invoked.
+*
+* The defaults are: formatLenght="short" and selector="date and time"
+*
+* @param {Date} date
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            formatLength {String}: 'short', 'medium', 'long', or 'full'
+*            selector {String}: 'date', 'time', or 'date and time'
+*
+* @return Object.value {String}: The localized date string
+*
+* @error GlobalizationError.FORMATTING_ERROR
+*
+* Example
+*    globalization.dateToString(new Date(),
+*                function (date) {alert('date:' + date.value + '\n');},
+*                function (errorCode) {alert(errorCode);},
+*                {formatLength:'short'});
+*/
+dateToString:function(date, successCB, failureCB, options) {
+    // successCallback required
+    if (typeof successCB != "function") {
+        console.log("Globalization.dateToString Error: successCB is not a function");
+        return;
+    }
+
+    // errorCallback required
+    if (typeof failureCB != "function") {
+        console.log("Globalization.dateToString Error: failureCB is not a function");
+        return;
+    }
+
+
+    if (date instanceof Date){
+        var dateValue;
+        dateValue = date.valueOf();
+        exec(successCB, failureCB, "Globalization", "dateToString", [{"date": dateValue, "options": options}]);
+    }
+    else {
+        console.log("Globalization.dateToString Error: date is not a Date object");
+    }
+},
+
+
+/**
+* Parses a date formatted as a string according to the client's user
+* preferences and calendar using the time zone of the client and returns
+* the corresponding date object. It returns the date to the successCB
+* callback with a properties object as a parameter. If there is an error
+* parsing the date string, then the errorCB callback is invoked.
+*
+* The defaults are: formatLength="short" and selector="date and time"
+*
+* @param {String} dateString
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            formatLength {String}: 'short', 'medium', 'long', or 'full'
+*            selector {String}: 'date', 'time', or 'date and time'
+*
+* @return    Object.year {Number}: The four digit year
+*            Object.month {Number}: The month from (0 - 11)
+*            Object.day {Number}: The day from (1 - 31)
+*            Object.hour {Number}: The hour from (0 - 23)
+*            Object.minute {Number}: The minute from (0 - 59)
+*            Object.second {Number}: The second from (0 - 59)
+*            Object.millisecond {Number}: The milliseconds (from 0 - 999),
+*                                        not available on all platforms
+*
+* @error GlobalizationError.PARSING_ERROR
+*
+* Example
+*    globalization.stringToDate('4/11/2011',
+*                function (date) { alert('Month:' + date.month + '\n' +
+*                    'Day:' + date.day + '\n' +
+*                    'Year:' + date.year + '\n');},
+*                function (errorCode) {alert(errorCode);},
+*                {selector:'date'});
+*/
+stringToDate:function(dateString, successCB, failureCB, options) {
+    // successCallback required
+    if (typeof successCB != "function") {
+        console.log("Globalization.stringToDate Error: successCB is not a function");
+        return;
+    }
+
+    // errorCallback required
+    if (typeof failureCB != "function") {
+        console.log("Globalization.stringToDate Error: failureCB is not a function");
+        return;
+    }
+    if (typeof dateString == "string"){
+        exec(successCB, failureCB, "Globalization", "stringToDate", [{"dateString": dateString, "options": options}]);
+    }
+    else {
+        console.log("Globalization.stringToDate Error: dateString is not a string");
+    }
+},
+
+
+/**
+* Returns a pattern string for formatting and parsing dates according to the client's
+* user preferences. It returns the pattern to the successCB callback with a
+* properties object as a parameter. If there is an error obtaining the pattern,
+* then the errorCB callback is invoked.
+*
+* The defaults are: formatLength="short" and selector="date and time"
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            formatLength {String}: 'short', 'medium', 'long', or 'full'
+*            selector {String}: 'date', 'time', or 'date and time'
+*
+* @return    Object.pattern {String}: The date and time pattern for formatting and parsing dates.
+*                                    The patterns follow Unicode Technical Standard #35
+*                                    http://unicode.org/reports/tr35/tr35-4.html
+*            Object.timezone {String}: The abbreviated name of the time zone on the client
+*            Object.utc_offset {Number}: The current difference in seconds between the client's
+*                                        time zone and coordinated universal time.
+*            Object.dst_offset {Number}: The current daylight saving time offset in seconds
+*                                        between the client's non-daylight saving's time zone
+*                                        and the client's daylight saving's time zone.
+*
+* @error GlobalizationError.PATTERN_ERROR
+*
+* Example
+*    globalization.getDatePattern(
+*                function (date) {alert('pattern:' + date.pattern + '\n');},
+*                function () {},
+*                {formatLength:'short'});
+*/
+getDatePattern:function(successCB, failureCB, options) {
+    // successCallback required
+    if (typeof successCB != "function") {
+        console.log("Globalization.getDatePattern Error: successCB is not a function");
+        return;
+    }
+
+    // errorCallback required
+    if (typeof failureCB != "function") {
+        console.log("Globalization.getDatePattern Error: failureCB is not a function");
+        return;
+    }
+
+    exec(successCB, failureCB, "Globalization", "getDatePattern", [{"options": options}]);
+},
+
+
+/**
+* Returns an array of either the names of the months or days of the week
+* according to the client's user preferences and calendar. It returns the array of names to the
+* successCB callback with a properties object as a parameter. If there is an error obtaining the
+* names, then the errorCB callback is invoked.
+*
+* The defaults are: type="wide" and item="months"
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            type {String}: 'narrow' or 'wide'
+*            item {String}: 'months', or 'days'
+*
+* @return Object.value {Array{String}}: The array of names starting from either
+*                                        the first month in the year or the
+*                                        first day of the week.
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.getDateNames(function (names) {
+*        for(var i = 0; i < names.value.length; i++) {
+*            alert('Month:' + names.value[i] + '\n');}},
+*        function () {});
+*/
+getDateNames:function(successCB, failureCB, options) {
+    // successCallback required
+    if (typeof successCB != "function") {
+        console.log("Globalization.getDateNames Error: successCB is not a function");
+        return;
+    }
+
+    // errorCallback required
+    if (typeof failureCB != "function") {
+        console.log("Globalization.getDateNames Error: failureCB is not a function");
+        return;
+    }
+    exec(successCB, failureCB, "Globalization", "getDateNames", [{"options": options}]);
+},
+
+/**
+* Returns whether daylight savings time is in effect for a given date using the client's
+* time zone and calendar. It returns whether or not daylight savings time is in effect
+* to the successCB callback with a properties object as a parameter. If there is an error
+* reading the date, then the errorCB callback is invoked.
+*
+* @param {Date} date
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return Object.dst {Boolean}: The value "true" indicates that daylight savings time is
+*                                in effect for the given date and "false" indicate that it is not.
+*
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.isDayLightSavingsTime(new Date(),
+*                function (date) {alert('dst:' + date.dst + '\n');}
+*                function () {});
+*/
+isDayLightSavingsTime:function(date, successCB, failureCB) {
+    // successCallback required
+    if (typeof successCB != "function") {
+        console.log("Globalization.isDayLightSavingsTime Error: successCB is not a function");
+        return;
+    }
+
+    // errorCallback required
+    if (typeof failureCB != "function") {
+        console.log("Globalization.isDayLightSavingsTime Error: failureCB is not a function");
+        return;
+    }
+
+
+    if (date instanceof Date){
+        var dateValue;
+        dateValue = date.valueOf();
+        exec(successCB, failureCB, "Globalization", "isDayLightSavingsTime", [{"date": dateValue}]);
+    }
+    else {
+        console.log("Globalization.isDayLightSavingsTime Error: date is not a Date object");
+    }
+
+},
+
+/**
+* Returns the first day of the week according to the client's user preferences and calendar.
+* The days of the week are numbered starting from 1 where 1 is considered to be Sunday.
+* It returns the day to the successCB callback with a properties object as a parameter.
+* If there is an error obtaining the pattern, then the errorCB callback is invoked.
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return Object.value {Number}: The number of the first day of the week.
+*
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.getFirstDayOfWeek(function (day)
+*                { alert('Day:' + day.value + '\n');},
+*                function () {});
+*/
+getFirstDayOfWeek:function(successCB, failureCB) {
+    // successCallback required
+    if (typeof successCB != "function") {
+        console.log("Globalization.getFirstDayOfWeek Error: successCB is not a function");
+        return;
+    }
+
+    // errorCallback required
+    if (typeof failureCB != "function") {
+        console.log("Globalization.getFirstDayOfWeek Error: failureCB is not a function");
+        return;
+    }
+
+    exec(successCB, failureCB, "Globalization", "getFirstDayOfWeek", []);
+},
+
+
+/**
+* Returns a number formatted as a string according to the client's user preferences.
+* It returns the formatted number string to the successCB callback with a properties object as a
+* parameter. If there is an error formatting the number, then the errorCB callback is invoked.
+*
+* The defaults are: type="decimal"
+*
+* @param {Number} number
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            type {String}: 'decimal', "percent", or 'currency'
+*
+* @return Object.value {String}: The formatted number string.
+*
+* @error GlobalizationError.FORMATTING_ERROR
+*
+* Example
+*    globalization.numberToString(3.25,
+*                function (number) {alert('number:' + number.value + '\n');},
+*                function () {},
+*                {type:'decimal'});
+*/
+numberToString:function(number, successCB, failureCB, options) {
+    // successCallback required
+    if (typeof successCB != "function") {
+        console.log("Globalization.numberToString Error: successCB is not a function");
+        return;
+    }
+
+    // errorCallback required
+    if (typeof failureCB != "function") {
+        console.log("Globalization.numberToString Error: failureCB is not a function");
+        return;
+    }
+
+    if(typeof number == "number") {
+        exec(successCB, failureCB, "Globalization", "numberToString", [{"number": number, "options": options}]);
+    }
+    else {
+        console.log("Globalization.numberToString Error: number is not a number");
+    }
+},
+
+/**
+* Parses a number formatted as a string according to the client's user preferences and
+* returns the corresponding number. It returns the number to the successCB callback with a
+* properties object as a parameter. If there is an error parsing the number string, then
+* the errorCB callback is invoked.
+*
+* The defaults are: type="decimal"
+*
+* @param {String} numberString
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            type {String}: 'decimal', "percent", or 'currency'
+*
+* @return Object.value {Number}: The parsed number.
+*
+* @error GlobalizationError.PARSING_ERROR
+*
+* Example
+*    globalization.stringToNumber('1234.56',
+*                function (number) {alert('Number:' + number.value + '\n');},
+*                function () { alert('Error parsing number');});
+*/
+stringToNumber:function(numberString, successCB, failureCB, options) {
+    // successCallback required
+    if (typeof successCB != "function") {
+        console.log("Globalization.stringToNumber Error: successCB is not a function");
+        return;
+    }
+
+    // errorCallback required
+    if (typeof failureCB != "function") {
+        console.log("Globalization.stringToNumber Error: failureCB is not a function");
+        return;
+    }
+
+    if(typeof numberString == "string") {
+        exec(successCB, failureCB, "Globalization", "stringToNumber", [{"numberString": numberString, "options": options}]);
+    }
+    else {
+        console.log("Globalization.stringToNumber Error: numberString is not a string");
+    }
+},
+
+/**
+* Returns a pattern string for formatting and parsing numbers according to the client's user
+* preferences. It returns the pattern to the successCB callback with a properties object as a
+* parameter. If there is an error obtaining the pattern, then the errorCB callback is invoked.
+*
+* The defaults are: type="decimal"
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            type {String}: 'decimal', "percent", or 'currency'
+*
+* @return    Object.pattern {String}: The number pattern for formatting and parsing numbers.
+*                                    The patterns follow Unicode Technical Standard #35.
+*                                    http://unicode.org/reports/tr35/tr35-4.html
+*            Object.symbol {String}: The symbol to be used when formatting and parsing
+*                                    e.g., percent or currency symbol.
+*            Object.fraction {Number}: The number of fractional digits to use when parsing and
+*                                    formatting numbers.
+*            Object.rounding {Number}: The rounding increment to use when parsing and formatting.
+*            Object.positive {String}: The symbol to use for positive numbers when parsing and formatting.
+*            Object.negative: {String}: The symbol to use for negative numbers when parsing and formatting.
+*            Object.decimal: {String}: The decimal symbol to use for parsing and formatting.
+*            Object.grouping: {String}: The grouping symbol to use for parsing and formatting.
+*
+* @error GlobalizationError.PATTERN_ERROR
+*
+* Example
+*    globalization.getNumberPattern(
+*                function (pattern) {alert('Pattern:' + pattern.pattern + '\n');},
+*                function () {});
+*/
+getNumberPattern:function(successCB, failureCB, options) {
+    // successCallback required
+    if (typeof successCB != "function") {
+        console.log("Globalization.getNumberPattern Error: successCB is not a function");
+        return;
+    }
+
+    // errorCallback required
+    if (typeof failureCB != "function") {
+        console.log("Globalization.getNumberPattern Error: failureCB is not a function");
+        return;
+    }
+
+    exec(successCB, failureCB, "Globalization", "getNumberPattern", [{"options": options}]);
+},
+
+/**
+* Returns a pattern string for formatting and parsing currency values according to the client's
+* user preferences and ISO 4217 currency code. It returns the pattern to the successCB callback with a
+* properties object as a parameter. If there is an error obtaining the pattern, then the errorCB
+* callback is invoked.
+*
+* @param {String} currencyCode
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return    Object.pattern {String}: The currency pattern for formatting and parsing currency values.
+*                                    The patterns follow Unicode Technical Standard #35
+*                                    http://unicode.org/reports/tr35/tr35-4.html
+*            Object.code {String}: The ISO 4217 currency code for the pattern.
+*            Object.fraction {Number}: The number of fractional digits to use when parsing and
+*                                    formatting currency.
+*            Object.rounding {Number}: The rounding increment to use when parsing and formatting.
+*            Object.decimal: {String}: The decimal symbol to use for parsing and formatting.
+*            Object.grouping: {String}: The grouping symbol to use for parsing and formatting.
+*
+* @error GlobalizationError.FORMATTING_ERROR
+*
+* Example
+*    globalization.getCurrencyPattern('EUR',
+*                function (currency) {alert('Pattern:' + currency.pattern + '\n');}
+*                function () {});
+*/
+getCurrencyPattern:function(currencyCode, successCB, failureCB) {
+    // successCallback required
+    if (typeof successCB != "function") {
+        console.log("Globalization.getCurrencyPattern Error: successCB is not a function");
+        return;
+    }
+
+    // errorCallback required
+    if (typeof failureCB != "function") {
+        console.log("Globalization.getCurrencyPattern Error: failureCB is not a function");
+        return;
+    }
+
+    if(typeof currencyCode == "string") {
+        exec(successCB, failureCB, "Globalization", "getCurrencyPattern", [{"currencyCode": currencyCode}]);
+    }
+    else {
+        console.log("Globalization.getCurrencyPattern Error: currencyCode is not a currency code");
+    }
+}
+
+};
+
+module.exports = globalization;
+
+});
+
 // file: lib/common/plugin/logger.js
 define("cordova/plugin/logger", function(require, exports, module) {
 

http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/63124574/framework/res/xml/config.xml
----------------------------------------------------------------------
diff --git a/framework/res/xml/config.xml b/framework/res/xml/config.xml
index 4a6fffc..1117f8d 100644
--- a/framework/res/xml/config.xml
+++ b/framework/res/xml/config.xml
@@ -51,6 +51,7 @@
     <plugin name="Battery" value="org.apache.cordova.BatteryListener"/>
     <plugin name="SplashScreen" value="org.apache.cordova.SplashScreen"/>
     <plugin name="Echo" value="org.apache.cordova.Echo" />
+    <plugin name="Globalization" value="org.apache.cordova.Globalization"/>
 </plugins>
 </cordova>
 

http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/63124574/framework/src/org/apache/cordova/Globalization.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/Globalization.java b/framework/src/org/apache/cordova/Globalization.java
new file mode 100644
index 0000000..1c2a13c
--- /dev/null
+++ b/framework/src/org/apache/cordova/Globalization.java
@@ -0,0 +1,560 @@
+package org.apache.cordova;
+
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Currency;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+
+import org.apache.cordova.api.Plugin;
+import org.apache.cordova.api.PluginResult;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.text.format.Time;
+
+/**
+ *
+ */
+public class Globalization extends Plugin  {
+	//GlobalizationCommand Plugin Actions
+	public static final String GETLOCALENAME = "getLocaleName";
+	public static final String DATETOSTRING = "dateToString";
+	public static final String STRINGTODATE = "stringToDate";
+	public static final String GETDATEPATTERN = "getDatePattern";
+	public static final String GETDATENAMES = "getDateNames";
+	public static final String ISDAYLIGHTSAVINGSTIME = "isDayLightSavingsTime";
+	public static final String GETFIRSTDAYOFWEEK = "getFirstDayOfWeek";
+	public static final String NUMBERTOSTRING = "numberToString";
+	public static final String STRINGTONUMBER = "stringToNumber";
+	public static final String GETNUMBERPATTERN = "getNumberPattern";
+	public static final String GETCURRENCYPATTERN = "getCurrencyPattern";
+	public static final String GETPREFERREDLANGUAGE = "getPreferredLanguage";
+	
+	//GlobalizationCommand Option Parameters
+	public static final String OPTIONS = "options";
+	public static final String FORMATLENGTH = "formatLength";
+	//public static final String SHORT = "short"; //default for dateToString format
+	public static final String MEDIUM = "medium";
+	public static final String LONG = "long";
+	public static final String FULL = "full";
+	public static final String SELECTOR = "selector";
+	//public static final String DATEANDTIME = "date and time"; //default for dateToString
+	public static final String DATE = "date";
+	public static final String TIME = "time";
+	public static final String DATESTRING = "dateString";
+	public static final String TYPE = "type";
+	public static final String ITEM = "item";
+	public static final String NARROW = "narrow";
+	public static final String WIDE = "wide";
+	public static final String MONTHS = "months";
+	public static final String DAYS = "days";
+	//public static final String DECMIAL = "wide"; //default for numberToString
+	public static final String NUMBER = "number";
+	public static final String NUMBERSTRING = "numberString";
+	public static final String PERCENT = "percent";
+	public static final String CURRENCY = "currency";
+	public static final String CURRENCYCODE = "currencyCode";
+	
+	@Override
+	public PluginResult execute(String action, JSONArray data, String callbackId) {		
+		PluginResult.Status status = PluginResult.Status.OK;			
+		JSONObject obj = new JSONObject();
+
+		try{			
+			if (action.equals(GETLOCALENAME)){					
+				obj = getLocaleName();					
+				return new PluginResult(status, obj);				
+			}else if (action.equals(GETPREFERREDLANGUAGE)){
+				obj = getPreferredLanguage();
+				return new PluginResult(status, obj);
+			} else if (action.equalsIgnoreCase(DATETOSTRING)) {
+				obj = getDateToString(data);				
+				return new PluginResult(PluginResult.Status.OK, obj);		
+			}else if(action.equalsIgnoreCase(STRINGTODATE)){					
+				obj = getStringtoDate(data);				
+				return new PluginResult(PluginResult.Status.OK, obj);		
+			}else if(action.equalsIgnoreCase(GETDATEPATTERN)){
+				obj = getDatePattern(data);				
+				return new PluginResult(PluginResult.Status.OK, obj);		
+			}else if(action.equalsIgnoreCase(GETDATENAMES)){
+				obj = getDateNames(data);				
+				return new PluginResult(PluginResult.Status.OK, obj);		
+			}else if(action.equalsIgnoreCase(ISDAYLIGHTSAVINGSTIME)){
+				obj = getIsDayLightSavingsTime(data);				
+				return new PluginResult(PluginResult.Status.OK, obj);		
+			}else if(action.equalsIgnoreCase(GETFIRSTDAYOFWEEK)){
+				obj = getFirstDayOfWeek(data);				
+				return new PluginResult(PluginResult.Status.OK, obj);		
+			}else if(action.equalsIgnoreCase(NUMBERTOSTRING)){
+				obj = getNumberToString(data);				
+				return new PluginResult(PluginResult.Status.OK, obj);		
+			}else if(action.equalsIgnoreCase(STRINGTONUMBER)){
+				obj = getStringToNumber(data);				
+				return new PluginResult(PluginResult.Status.OK, obj);		
+			}else if(action.equalsIgnoreCase(GETNUMBERPATTERN)){
+				obj = getNumberPattern(data);			
+				return new PluginResult(PluginResult.Status.OK, obj);		
+			}else if(action.equalsIgnoreCase(GETCURRENCYPATTERN)){
+				obj = getCurrencyPattern(data);				
+				return new PluginResult(PluginResult.Status.OK, obj);	
+			}			
+		}catch (GlobalizationError ge){			
+			return new PluginResult(PluginResult.Status.ERROR, ge.getErrorCode());			
+		}catch (Exception e){			
+			return new PluginResult(PluginResult.Status.JSON_EXCEPTION);			
+		}	
+		return new PluginResult(PluginResult.Status.INVALID_ACTION);		
+	}	
+	/* 
+	 * @Description: Returns the string identifier for the client's current locale setting
+	 * 
+	 * @Return: JSONObject
+	 * 			Object.value {String}: The locale identifier
+	 * 
+	 * @throws: GlobalizationError.UNKNOWN_ERROR
+	 */	
+	private JSONObject getLocaleName() throws GlobalizationError{
+		JSONObject obj = new JSONObject();
+		try{			
+			obj.put("value",Locale.getDefault().toString());//get the locale from the Android Device		
+			return obj;		
+		}catch(Exception e){
+			throw new GlobalizationError(GlobalizationError.UNKNOWN_ERROR);
+		}		
+	}
+	/* 
+	 * @Description: Returns the string identifier for the client's current language
+	 * 
+	 * @Return: JSONObject
+	 * 			Object.value {String}: The language identifier
+	 * 
+	 * @throws: GlobalizationError.UNKNOWN_ERROR
+	 */	
+	private JSONObject getPreferredLanguage() throws GlobalizationError {
+		JSONObject obj = new JSONObject();
+		try {
+			obj.put("value", Locale.getDefault().getDisplayLanguage().toString());
+			return obj;
+		} catch (Exception e) {
+			throw new GlobalizationError(GlobalizationError.UNKNOWN_ERROR);
+		}
+	}
+	/* 
+	 * @Description: Returns a date formatted as a string according to the client's user preferences and 
+	 * calendar using the time zone of the client. 
+	 * 
+	 * @Return: JSONObject 
+	 * 			Object.value {String}: The localized date string
+	 * 
+     * @throws: GlobalizationError.FORMATTING_ERROR
+	 */	
+	private JSONObject getDateToString(JSONArray options) throws GlobalizationError{		
+		JSONObject obj = new JSONObject();	
+		try{			
+			Date date = new Date((Long)options.getJSONObject(0).get(DATE));
+			
+			//get formatting pattern from android device (Will only have device specific formatting for short form of date) or options supplied
+			JSONObject datePattern = getDatePattern(options);
+			SimpleDateFormat fmt = new SimpleDateFormat(datePattern.getString("pattern")); 				
+			
+			//return formatted date					
+			return obj.put("value",fmt.format(date));
+		}catch(Exception ge){				
+			throw new GlobalizationError(GlobalizationError.FORMATTING_ERROR);
+		}	
+	}	
+	
+	/* 
+	 * @Description: Parses a date formatted as a string according to the client's user 
+	 * preferences and calendar using the time zone of the client and returns
+	 * the corresponding date object
+	 * @Return: JSONObject
+	 *       	Object.year {Number}: The four digit year
+     *			Object.month {Number}: The month from (0 - 11)
+     *			Object.day {Number}: The day from (1 - 31)
+     *			Object.hour {Number}: The hour from (0 - 23)
+     *			Object.minute {Number}: The minute from (0 - 59)
+     *			Object.second {Number}: The second from (0 - 59)
+     *			Object.millisecond {Number}: The milliseconds (from 0 - 999), not available on all platforms
+     *
+     * @throws: GlobalizationError.PARSING_ERROR
+	*/ 	
+	private JSONObject getStringtoDate(JSONArray options)throws GlobalizationError{
+		JSONObject obj = new JSONObject();	
+		Date date;		
+		try{			
+			//get format pattern from android device (Will only have device specific formatting for short form of date) or options supplied
+			DateFormat fmt = new SimpleDateFormat(getDatePattern(options).getString("pattern")); 
+			
+			//attempt parsing string based on user preferences
+			date = fmt.parse(options.getJSONObject(0).get(DATESTRING).toString());
+			
+			//set Android Time object
+			Time time = new Time();
+			time.set(date.getTime());			
+			
+			//return properties;			
+			obj.put("year", time.year);
+			obj.put("month", time.month);
+			obj.put("day", time.monthDay);
+			obj.put("hour", time.hour);
+			obj.put("minute", time.minute);
+			obj.put("second", time.second);
+			obj.put("millisecond", new Long(0));
+			return obj;
+		}catch(Exception ge){
+			throw new GlobalizationError(GlobalizationError.PARSING_ERROR);
+		}		
+	}	
+	
+	/* 
+	 * @Description: Returns a pattern string for formatting and parsing dates according to the client's 
+	 * user preferences.
+	 * @Return: JSONObject
+	 * 
+	 *			Object.pattern {String}: The date and time pattern for formatting and parsing dates. 
+	 *									The patterns follow Unicode Technical Standard #35
+	 *									http://unicode.org/reports/tr35/tr35-4.html
+	 *			Object.timezone {String}: The abbreviated name of the time zone on the client
+	 *			Object.utc_offset {Number}: The current difference in seconds between the client's 
+	 *										time zone and coordinated universal time. 
+	 *			Object.dst_offset {Number}: The current daylight saving time offset in seconds 
+	 *										between the client's non-daylight saving's time zone 
+	 *										and the client's daylight saving's time zone.
+	 *
+	 * @throws: GlobalizationError.PATTERN_ERROR
+	*/
+	private JSONObject getDatePattern(JSONArray options) throws GlobalizationError{
+		JSONObject obj = new JSONObject();
+		
+		try{
+			SimpleDateFormat fmtDate = (SimpleDateFormat)android.text.format.DateFormat.getDateFormat(this.cordova.getActivity()); //default user preference for date
+			SimpleDateFormat fmtTime = (SimpleDateFormat)android.text.format.DateFormat.getTimeFormat(this.cordova.getActivity());	//default user preference for time
+						
+			String fmt = fmtDate.toLocalizedPattern() + " " + fmtTime.toLocalizedPattern(); //default SHORT date/time format. ex. dd/MM/yyyy h:mm a
+						
+			//get Date value + options (if available)	
+			if (options.getJSONObject(0).length() > 1){
+				//options were included
+				
+				//get formatLength option				
+				if (!((JSONObject)options.getJSONObject(0).get(OPTIONS)).isNull(FORMATLENGTH)){					
+					String fmtOpt = (String)((JSONObject)options.getJSONObject(0).get(OPTIONS)).get(FORMATLENGTH);
+					if (fmtOpt.equalsIgnoreCase(MEDIUM)){//medium
+						fmtDate = (SimpleDateFormat)android.text.format.DateFormat.getMediumDateFormat(this.cordova.getActivity());						
+					}else if (fmtOpt.equalsIgnoreCase(LONG) || fmtOpt.equalsIgnoreCase(FULL)){ //long/full
+						fmtDate = (SimpleDateFormat)android.text.format.DateFormat.getLongDateFormat(this.cordova.getActivity());
+					}
+				}
+				
+				//return pattern type	
+				fmt = fmtDate.toLocalizedPattern() + " " + fmtTime.toLocalizedPattern();
+				if (!((JSONObject)options.getJSONObject(0).get(OPTIONS)).isNull(SELECTOR)){
+					String selOpt = (String)((JSONObject)options.getJSONObject(0).get(OPTIONS)).get(SELECTOR);
+					if (selOpt.equalsIgnoreCase(DATE)){
+						fmt =  fmtDate.toLocalizedPattern();
+					}else if (selOpt.equalsIgnoreCase(TIME)){
+						fmt = fmtTime.toLocalizedPattern();
+					}						
+				}				
+			}			
+						
+			//TimeZone from users device		
+			//TimeZone tz = Calendar.getInstance(Locale.getDefault()).getTimeZone(); //substitute method		
+			TimeZone tz = TimeZone.getTimeZone(Time.getCurrentTimezone());			
+			
+			obj.put("pattern", fmt);
+			obj.put("timezone", tz.getDisplayName(tz.inDaylightTime(Calendar.getInstance().getTime()),TimeZone.SHORT));
+			obj.put("utc_offset", tz.getRawOffset()/1000);
+			obj.put("dst_offset", tz.getDSTSavings()/1000);			
+			return obj;
+			
+		}catch(Exception ge){				
+			throw new GlobalizationError(GlobalizationError.PATTERN_ERROR);
+		}	
+	}
+	
+	/* 
+	 * @Description: Returns an array of either the names of the months or days of the week 
+	 * according to the client's user preferences and calendar
+	 * @Return: JSONObject
+	 * 			Object.value {Array{String}}: The array of names starting from either 
+	 *										the first month in the year or the 
+	 *										first day of the week.
+	 * 
+	 * @throws: GlobalizationError.UNKNOWN_ERROR
+	*/
+	private JSONObject getDateNames(JSONArray options) throws GlobalizationError{
+		JSONObject obj = new JSONObject();		
+		//String[] value;
+		JSONArray value = new JSONArray();	
+		List<String> namesList = new ArrayList<String>();
+		final Map<String,Integer> namesMap; // final needed for sorting with anonymous comparator
+		try{			
+			int type = 0; //default wide
+			int item = 0; //default months			
+			
+			//get options if available
+			if (options.getJSONObject(0).length() > 0){
+				//get type if available
+				if (!((JSONObject)options.getJSONObject(0).get(OPTIONS)).isNull(TYPE)){	
+					String t = (String)((JSONObject)options.getJSONObject(0).get(OPTIONS)).get(TYPE);
+					if (t.equalsIgnoreCase(NARROW)){type++;} //DateUtils.LENGTH_MEDIUM
+				}
+				//get item if available
+				if (!((JSONObject)options.getJSONObject(0).get(OPTIONS)).isNull(ITEM)){	
+					String t = (String)((JSONObject)options.getJSONObject(0).get(OPTIONS)).get(ITEM);
+					if (t.equalsIgnoreCase(DAYS)){item += 10;} //Days of week start at 1
+				}				
+			}
+			//determine return value
+			int method = item + type;
+			if  (method == 1) { //months and narrow
+				namesMap = Calendar.getInstance().getDisplayNames(Calendar.MONTH, Calendar.SHORT, Locale.getDefault());
+			} else if (method == 10) { //days and wide
+				namesMap = Calendar.getInstance().getDisplayNames(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());
+			} else if (method == 11) { //days and narrow
+				namesMap = Calendar.getInstance().getDisplayNames(Calendar.DAY_OF_WEEK, Calendar.SHORT, Locale.getDefault());
+			} else { //default: months and wide
+				namesMap = Calendar.getInstance().getDisplayNames(Calendar.MONTH, Calendar.LONG, Locale.getDefault());				
+			}
+
+			// save names as a list
+			for(String name : namesMap.keySet()) {
+				namesList.add(name);
+			}
+			
+			// sort the list according to values in namesMap
+			Collections.sort(namesList, new Comparator<String>() {
+				public int compare(String arg0, String arg1) {
+					return namesMap.get(arg0).compareTo(namesMap.get(arg1));
+				}
+			});
+			
+			// convert nameList into JSONArray of String objects 
+			for (int i = 0; i < namesList.size(); i ++){
+				value.put(namesList.get(i));
+			}			
+
+			//return array of names			
+			return obj.put("value", value);				
+		}catch(Exception ge){				
+			throw new GlobalizationError(GlobalizationError.UNKNOWN_ERROR);
+		}			
+	}
+	
+	/* 
+	 * @Description: Returns whether daylight savings time is in effect for a given date using the client's 
+	 * time zone and calendar.
+	 * @Return: JSONObject
+	 * 			Object.dst {Boolean}: The value "true" indicates that daylight savings time is 
+	 *								in effect for the given date and "false" indicate that it is not.	 * 
+	 * 
+	 * @throws: GlobalizationError.UNKNOWN_ERROR
+	*/
+	private JSONObject getIsDayLightSavingsTime(JSONArray options) throws GlobalizationError{
+		JSONObject obj = new JSONObject();
+		boolean dst = false;
+		try{
+			Date date = new Date((Long)options.getJSONObject(0).get(DATE));
+			//TimeZone tz = Calendar.getInstance(Locale.getDefault()).getTimeZone();
+			TimeZone tz = TimeZone.getTimeZone(Time.getCurrentTimezone());
+			dst = tz.inDaylightTime(date); //get daylight savings data from date object and user timezone settings	
+			
+			return obj.put("dst",dst);		
+		}catch(Exception ge){				
+			throw new GlobalizationError(GlobalizationError.UNKNOWN_ERROR);
+		}				
+	}	
+	
+	/* 
+	 * @Description: Returns the first day of the week according to the client's user preferences and calendar. 
+	 * The days of the week are numbered starting from 1 where 1 is considered to be Sunday.
+	 * @Return: JSONObject
+	 * 			Object.value {Number}: The number of the first day of the week.
+	 * 
+	 * @throws: GlobalizationError.UNKNOWN_ERROR
+	*/
+	private JSONObject getFirstDayOfWeek(JSONArray options) throws GlobalizationError{
+		JSONObject obj = new JSONObject();		
+		try{			
+			int value = Calendar.getInstance(Locale.getDefault()).getFirstDayOfWeek(); //get first day of week based on user locale settings
+			return obj.put("value", value);
+		}catch(Exception ge){				
+			throw new GlobalizationError(GlobalizationError.UNKNOWN_ERROR);
+		}			
+	}	
+	
+	/* 
+	 * @Description: Returns a number formatted as a string according to the client's user preferences. 
+	 * @Return: JSONObject
+	 * 			Object.value {String}: The formatted number string. 
+	 * 
+	 * @throws: GlobalizationError.FORMATTING_ERROR
+	*/
+	private JSONObject getNumberToString(JSONArray options) throws GlobalizationError{
+		JSONObject obj = new JSONObject();	
+		String value = "";
+		try{
+			DecimalFormat fmt = getNumberFormatInstance(options);//returns Decimal/Currency/Percent instance
+			value = fmt.format(options.getJSONObject(0).get(NUMBER));
+			return obj.put("value", value);					
+		}catch(Exception ge){	
+			throw new GlobalizationError(GlobalizationError.FORMATTING_ERROR);
+		}			
+	}	
+	
+	/* 
+	 * @Description: Parses a number formatted as a string according to the client's user preferences and 
+	 * returns the corresponding number.
+	 * @Return: JSONObject 
+	 * 			Object.value {Number}: The parsed number.
+	 * 
+	 * @throws: GlobalizationError.PARSING_ERROR
+	*/
+	private JSONObject getStringToNumber(JSONArray options) throws GlobalizationError{
+		JSONObject obj = new JSONObject();	
+		Number value;
+		try{
+			DecimalFormat fmt = getNumberFormatInstance(options); //returns Decimal/Currency/Percent instance
+			value = fmt.parse((String)options.getJSONObject(0).get(NUMBERSTRING));	
+			return obj.put("value", value);						
+		}catch(Exception ge){				
+			throw new GlobalizationError(GlobalizationError.PARSING_ERROR);
+		}			
+	}
+	
+	/* 
+	 * @Description: Returns a pattern string for formatting and parsing numbers according to the client's user 
+	 * preferences.
+	 * @Return: JSONObject
+	 * 			Object.pattern {String}: The number pattern for formatting and parsing numbers. 
+	 *									The patterns follow Unicode Technical Standard #35. 
+	 *									http://unicode.org/reports/tr35/tr35-4.html
+	 *			Object.symbol {String}: The symbol to be used when formatting and parsing 
+	 *									e.g., percent or currency symbol.
+	 *			Object.fraction {Number}: The number of fractional digits to use when parsing and 
+	 *									formatting numbers.
+	 *			Object.rounding {Number}: The rounding increment to use when parsing and formatting.
+	 *			Object.positive {String}: The symbol to use for positive numbers when parsing and formatting.
+	 *			Object.negative: {String}: The symbol to use for negative numbers when parsing and formatting.
+	 *			Object.decimal: {String}: The decimal symbol to use for parsing and formatting.
+	 *			Object.grouping: {String}: The grouping symbol to use for parsing and formatting.
+	 * 
+	 * @throws: GlobalizationError.PATTERN_ERROR
+	*/
+	private JSONObject getNumberPattern(JSONArray options) throws GlobalizationError{
+		JSONObject obj = new JSONObject();		
+		try{				
+			//uses java.text.DecimalFormat to format value			
+			DecimalFormat fmt = (DecimalFormat) DecimalFormat.getInstance(Locale.getDefault());	//default format	
+			String symbol = String.valueOf(fmt.getDecimalFormatSymbols().getDecimalSeparator());
+			//get Date value + options (if available)	
+			if (options.getJSONObject(0).length() > 0){
+				//options were included
+				if (!((JSONObject)options.getJSONObject(0).get(OPTIONS)).isNull(TYPE)){					
+					String fmtOpt = (String)((JSONObject)options.getJSONObject(0).get(OPTIONS)).get(TYPE);
+					if (fmtOpt.equalsIgnoreCase(CURRENCY)){
+						fmt = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.getDefault());
+						symbol = fmt.getDecimalFormatSymbols().getCurrencySymbol();
+					}else if(fmtOpt.equalsIgnoreCase(PERCENT)){
+						fmt = (DecimalFormat) DecimalFormat.getPercentInstance(Locale.getDefault());
+						symbol = String.valueOf(fmt.getDecimalFormatSymbols().getPercent());						
+					}
+				}
+			}							
+					
+			//return properties			
+			obj.put("pattern", fmt.toPattern());
+			obj.put("symbol", symbol);
+			obj.put("fraction", fmt.getMinimumFractionDigits());
+			obj.put("rounding", new Integer(0));
+			obj.put("positive", fmt.getPositivePrefix());
+			obj.put("negative", fmt.getNegativePrefix());
+			obj.put("decimal", String.valueOf(fmt.getDecimalFormatSymbols().getDecimalSeparator()));
+			obj.put("grouping", String.valueOf(fmt.getDecimalFormatSymbols().getGroupingSeparator()));						
+						
+			return obj;			
+		}catch(Exception ge){				
+			throw new GlobalizationError(GlobalizationError.PATTERN_ERROR);
+		}		
+	}	
+	
+	/* 
+	 * @Description: Returns a pattern string for formatting and parsing currency values according to the client's
+	 * user preferences and ISO 4217 currency code.
+	 * @Return: JSONObject
+	 * 			Object.pattern {String}: The currency pattern for formatting and parsing currency values. 
+	 *									The patterns follow Unicode Technical Standard #35 
+	 *									http://unicode.org/reports/tr35/tr35-4.html
+	 *			Object.code {String}: The ISO 4217 currency code for the pattern.
+	 *			Object.fraction {Number}: The number of fractional digits to use when parsing and 
+	 *									formatting currency.
+	 *			Object.rounding {Number}: The rounding increment to use when parsing and formatting.
+	 *			Object.decimal: {String}: The decimal symbol to use for parsing and formatting.
+	 *			Object.grouping: {String}: The grouping symbol to use for parsing and formatting.
+	 * 
+	 * @throws: GlobalizationError.FORMATTING_ERROR
+	*/
+	private JSONObject getCurrencyPattern(JSONArray options) throws GlobalizationError{
+		JSONObject obj = new JSONObject();	
+		try{	
+			//get ISO 4217 currency code
+			String code = options.getJSONObject(0).getString(CURRENCYCODE);			
+			
+			//uses java.text.DecimalFormat to format value			
+			DecimalFormat fmt = (DecimalFormat) DecimalFormat.getCurrencyInstance(Locale.getDefault());
+			
+			//set currency format
+			Currency currency = Currency.getInstance(code);
+			fmt.setCurrency(currency);
+			
+			//return properties			
+			obj.put("pattern", fmt.toPattern());
+			obj.put("code", currency.getCurrencyCode());
+			obj.put("fraction", fmt.getMinimumFractionDigits());
+			obj.put("rounding", new Integer(0));
+			obj.put("decimal", String.valueOf(fmt.getDecimalFormatSymbols().getDecimalSeparator()));
+			obj.put("grouping", String.valueOf(fmt.getDecimalFormatSymbols().getGroupingSeparator()));			
+			
+			return obj;			
+		}catch(Exception ge){				
+			throw new GlobalizationError(GlobalizationError.FORMATTING_ERROR);
+		}		
+	}
+	
+	/* 
+	 * @Description: Parses a JSONArray from user options and returns the correct Instance of Decimal/Percent/Currency.
+	 * @Return: DecimalFormat : The Instance to use.
+	 *  
+	 * @throws: JSONException
+	*/
+	private DecimalFormat getNumberFormatInstance(JSONArray options) throws JSONException{		
+		DecimalFormat fmt =  (DecimalFormat)DecimalFormat.getInstance(Locale.getDefault()); //default format
+		try{			 
+			if (options.getJSONObject(0).length() > 1){
+				//options were included				
+				if (!((JSONObject)options.getJSONObject(0).get(OPTIONS)).isNull(TYPE)){					
+					String fmtOpt = (String)((JSONObject)options.getJSONObject(0).get(OPTIONS)).get(TYPE);
+					if (fmtOpt.equalsIgnoreCase(CURRENCY)){
+						fmt = (DecimalFormat)DecimalFormat.getCurrencyInstance(Locale.getDefault());
+					}else if(fmtOpt.equalsIgnoreCase(PERCENT)){
+						fmt = (DecimalFormat)DecimalFormat.getPercentInstance(Locale.getDefault());	
+					}
+				}
+			}
+			
+		}catch (JSONException je){}		
+		return fmt;
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/63124574/framework/src/org/apache/cordova/GlobalizationError.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/GlobalizationError.java b/framework/src/org/apache/cordova/GlobalizationError.java
new file mode 100644
index 0000000..c831845
--- /dev/null
+++ b/framework/src/org/apache/cordova/GlobalizationError.java
@@ -0,0 +1,72 @@
+package org.apache.cordova;
+
+/** 
+ * @description Exception class representing defined Globalization error codes
+ * @Globalization error codes:
+ * 		GlobalizationError.UNKNOWN_ERROR = 0;
+ * 		GlobalizationError.FORMATTING_ERROR = 1;   
+ * 		GlobalizationError.PARSING_ERROR = 2;   
+ * 		GlobalizationError.PATTERN_ERROR = 3;
+ */
+public class GlobalizationError extends Exception{
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	public static final String UNKNOWN_ERROR = "UNKNOWN_ERROR";
+	public static final String FORMATTING_ERROR = "FORMATTING_ERROR";
+	public static final String PARSING_ERROR = "PARSING_ERROR";
+	public static final String PATTERN_ERROR = "PATTERN_ERROR";
+	
+	int error = 0;	//default unknown error thrown
+	/**
+     * Default constructor        
+     */
+    public GlobalizationError() {}
+	/**
+     * Create an exception returning an error code 
+     *    
+     * @param   s           
+     */
+    public GlobalizationError(String s) {      	
+    	if (s.equalsIgnoreCase(FORMATTING_ERROR)){
+        	error = 1;
+        }else if (s.equalsIgnoreCase(PARSING_ERROR)){
+        	error = 2;
+        }else if (s.equalsIgnoreCase(PATTERN_ERROR)){
+        	error = 3;
+        }      	
+    }
+    /**
+     * get error string based on error code 
+     *    
+     * @param   String msg           
+     */
+    public String getErrorString(){
+    	String msg = "";
+    	switch (error){
+    	case 0:
+    		msg = UNKNOWN_ERROR;
+    		break;
+    	case 1:
+    		msg =  FORMATTING_ERROR;
+    		break;
+    	case 2:
+    		msg =  PARSING_ERROR;
+    		break;
+    	case 3:
+    		msg =  PATTERN_ERROR;
+    		break;
+    	}
+    	return msg;
+    }
+    /**
+     * get error code 
+     *    
+     * @param   String msg           
+     */
+    public int getErrorCode(){    	
+    	return error;
+    }
+    
+}
\ No newline at end of file