Updated Branches:
  refs/heads/master [created] 87286a2e0

Initial Commit


Project: 
http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/commit/87286a2e
Tree: 
http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/tree/87286a2e
Diff: 
http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/diff/87286a2e

Branch: refs/heads/master
Commit: 87286a2e08982f40554f91655f49acb4db3e3b43
Parents: 
Author: Joe Bowser <[email protected]>
Authored: Tue Apr 2 15:58:03 2013 -0700
Committer: Joe Bowser <[email protected]>
Committed: Tue Apr 2 15:58:03 2013 -0700

----------------------------------------------------------------------
 README.md                           |    2 +
 plugin.xml                          |   18 +
 src/android/Globalization.java      |  577 ++++++++++++++++++++++++++++++
 src/android/GlobalizationError.java |  108 ++++++
 4 files changed, 705 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/blob/87286a2e/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e127d39
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+cordova-plugin-globalization
+----------------------------------

http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/blob/87286a2e/plugin.xml
----------------------------------------------------------------------
diff --git a/plugin.xml b/plugin.xml
new file mode 100644
index 0000000..76e1b11
--- /dev/null
+++ b/plugin.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<plugin xmlns="http://www.phonegap.com/ns/plugins/1.0";
+xmlns:android="http://schemas.android.com/apk/res/android";
+id="org.apache.cordova.core">
+    version="0.1.0">
+    <name>Globalization</name>
+
+    <!-- android -->
+    <platform name="android">
+        <config-file target="res/xml/config.xml" parent="/cordova/plugins">
+            <plugin name="Globalization" 
value="org.apache.cordova.core.Globalization"/>
+        </config-file>
+
+        <source-file src="Globalization.java" 
target-dir="org/apache/cordova/core" />
+        <source-file src="GlobalizationError.java" 
target-dir="org/apache/cordova/core" />
+       </platform>
+</plugin>

http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/blob/87286a2e/src/android/Globalization.java
----------------------------------------------------------------------
diff --git a/src/android/Globalization.java b/src/android/Globalization.java
new file mode 100644
index 0000000..e0852a7
--- /dev/null
+++ b/src/android/Globalization.java
@@ -0,0 +1,577 @@
+/*
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       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
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+*/
+
+package org.apache.cordova.core;
+
+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.CallbackContext;
+import org.apache.cordova.api.CordovaPlugin;
+import org.apache.cordova.api.PluginResult;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.annotation.TargetApi;
+import android.text.format.Time;
+
+/**
+ *
+ */
+public class Globalization extends CordovaPlugin  {
+    //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 boolean execute(String action, JSONArray data, CallbackContext 
callbackContext) {
+        JSONObject obj = new JSONObject();
+
+        try{
+            if (action.equals(GETLOCALENAME)){
+                obj = getLocaleName();
+            }else if (action.equals(GETPREFERREDLANGUAGE)){
+                obj = getPreferredLanguage();
+            } else if (action.equalsIgnoreCase(DATETOSTRING)) {
+                obj = getDateToString(data);
+            }else if(action.equalsIgnoreCase(STRINGTODATE)){
+                obj = getStringtoDate(data);
+            }else if(action.equalsIgnoreCase(GETDATEPATTERN)){
+                obj = getDatePattern(data);
+            }else if(action.equalsIgnoreCase(GETDATENAMES)){
+                if (android.os.Build.VERSION.SDK_INT < 
android.os.Build.VERSION_CODES.GINGERBREAD) {
+                    throw new 
GlobalizationError(GlobalizationError.UNKNOWN_ERROR);
+                } else {
+                    obj = getDateNames(data);
+                }
+            }else if(action.equalsIgnoreCase(ISDAYLIGHTSAVINGSTIME)){
+                obj = getIsDayLightSavingsTime(data);
+            }else if(action.equalsIgnoreCase(GETFIRSTDAYOFWEEK)){
+                obj = getFirstDayOfWeek(data);
+            }else if(action.equalsIgnoreCase(NUMBERTOSTRING)){
+                obj = getNumberToString(data);
+            }else if(action.equalsIgnoreCase(STRINGTONUMBER)){
+                obj = getStringToNumber(data);
+            }else if(action.equalsIgnoreCase(GETNUMBERPATTERN)){
+                obj = getNumberPattern(data);
+            }else if(action.equalsIgnoreCase(GETCURRENCYPATTERN)){
+                obj = getCurrencyPattern(data);
+            }else {
+                return false;
+            }
+
+            callbackContext.success(obj);
+        }catch (GlobalizationError ge){
+            callbackContext.sendPluginResult(new 
PluginResult(PluginResult.Status.ERROR, ge.toJson()));
+        }catch (Exception e){
+            callbackContext.sendPluginResult(new 
PluginResult(PluginResult.Status.JSON_EXCEPTION));
+        }
+        return true;
+    }
+    /*
+     * @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
+    */
+    @TargetApi(9)
+    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;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cordova-plugin-globalization/blob/87286a2e/src/android/GlobalizationError.java
----------------------------------------------------------------------
diff --git a/src/android/GlobalizationError.java 
b/src/android/GlobalizationError.java
new file mode 100644
index 0000000..b7e8656
--- /dev/null
+++ b/src/android/GlobalizationError.java
@@ -0,0 +1,108 @@
+/*
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       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
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+*/
+
+package org.apache.cordova.core;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/** 
+ * @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;
+    }
+    
+    /**
+     * get the json version of this object to return to javascript
+     * @return
+     */
+    public JSONObject toJson() {
+        JSONObject obj = new JSONObject();
+        try {
+            obj.put("code", getErrorCode());
+            obj.put("message", getErrorString());
+        } catch (JSONException e) {
+            // never happens
+        }
+        return obj;
+    }
+}

Reply via email to